Source code for egon.data.datasets.gas_areas

"""
The central module containing code to create CH4 and H2 voronoi polygons

"""
from geoalchemy2.types import Geometry
from sqlalchemy import BigInteger, Column, Text
from sqlalchemy.ext.declarative import declarative_base

from egon.data import db
from egon.data.datasets import Dataset
from egon.data.datasets.generate_voronoi import get_voronoi_geodataframe


[docs]class GasAreaseGon2035(Dataset): """Create the gas voronoi table and the gas voronoi areas for eGon2035 *Dependencies* * :py:class:`EtragoSetup <egon.data.datasets.etrago_setup.EtragoSetup>` * :py:class:`HydrogenBusEtrago <egon.data.datasets.hydrogen_etrago.HydrogenBusEtrago>` * :py:class:`Vg250 <egon.data.datasets.vg250.Vg250>` * :py:class:`GasNodesAndPipes <egon.data.datasets.gas_grid.GasNodesAndPipes>` *Resulting tables* * :py:class:`EgonPfHvGasVoronoi <EgonPfHvGasVoronoi>` """ #: name: str = "GasAreaseGon2035" #: version: str = "0.0.2" def __init__(self, dependencies): super().__init__( name=self.name, version=self.version, dependencies=dependencies, tasks=(create_gas_voronoi_table, voronoi_egon2035), )
[docs]class GasAreaseGon100RE(Dataset): """Create the gas voronoi table and the gas voronoi areas for eGon100RE *Dependencies* * :py:class:`EtragoSetup <egon.data.datasets.etrago_setup.EtragoSetup>` * :py:class:`HydrogenBusEtrago <egon.data.datasets.hydrogen_etrago.HydrogenBusEtrago>` * :py:class:`HydrogenGridEtrago <egon.data.datasets.hydrogen_etrago.HydrogenGridEtrago>` * :py:class:`Vg250 <egon.data.datasets.vg250.Vg250>` * :py:class:`GasNodesAndPipes <egon.data.datasets.gas_grid.GasNodesAndPipes>` * :py:class:`GasAreaseGon2035 <GasAreaseGon2035>` *Resulting tables* * :py:class:`EgonPfHvGasVoronoi <EgonPfHvGasVoronoi>` """ #: name: str = "GasAreaseGon100RE" #: version: str = "0.0.1" def __init__(self, dependencies): super().__init__( name=self.name, version=self.version, dependencies=dependencies, tasks=(voronoi_egon100RE), )
Base = declarative_base()
[docs]class EgonPfHvGasVoronoi(Base): """ Class definition of table grid.egon_gas_voronoi """ __tablename__ = "egon_gas_voronoi" __table_args__ = {"schema": "grid"} #: Name of the scenario scn_name = Column(Text, primary_key=True, nullable=False) #: Bus of the corresponding area bus_id = Column(BigInteger, primary_key=True, nullable=False) #: Gas carrier of the voronoi area ("CH4", "H2_grid" or "H2_saltcavern") carrier = Column(Text) #: Geometry of the corresponding area geom = Column(Geometry("GEOMETRY", 4326))
[docs]def create_gas_voronoi_table(): """ Create gas voronoi table """ engine = db.engine() EgonPfHvGasVoronoi.__table__.drop(bind=engine, checkfirst=True) EgonPfHvGasVoronoi.__table__.create(bind=engine, checkfirst=True)
[docs]def voronoi_egon2035(): """ Create voronoi polygons for all gas carriers in eGon2035 scenario """ for carrier in ["CH4", "H2_grid", "H2_saltcavern"]: create_voronoi("eGon2035", carrier)
[docs]def voronoi_egon100RE(): """ Create voronoi polygons for all gas carriers in eGon100RE scenario """ for carrier in ["CH4", "H2_grid", "H2_saltcavern"]: create_voronoi("eGon100RE", carrier)
[docs]def create_voronoi(scn_name, carrier): """ Create voronoi polygons for specified carrier in specified scenario. Parameters ---------- scn_name : str Name of the scenario carrier : str Name of the carrier """ boundary = db.select_geodataframe( f""" SELECT id, geometry FROM boundaries.vg250_sta_union; """, geom_col="geometry", ).to_crs(epsg=4326) engine = db.engine() db.execute_sql( f""" DELETE FROM grid.egon_gas_voronoi WHERE "carrier" = '{carrier}' and "scn_name" = '{scn_name}'; """ ) buses = db.select_geodataframe( f""" SELECT bus_id, geom FROM grid.egon_etrago_bus WHERE scn_name = '{scn_name}' AND country = 'DE' AND carrier = '{carrier}'; """, ).to_crs(epsg=4326) if len(buses) == 0: return buses["x"] = buses.geometry.x buses["y"] = buses.geometry.y # generate voronois gdf = get_voronoi_geodataframe(buses, boundary.geometry.iloc[0]) # set scn_name gdf["scn_name"] = scn_name gdf["carrier"] = carrier gdf.rename_geometry("geom", inplace=True) gdf.drop(columns=["id"], inplace=True) # Insert data to db gdf.set_crs(epsg=4326).to_postgis( f"egon_gas_voronoi", engine, schema="grid", index=False, if_exists="append", dtype={"geom": Geometry}, )