| 1 |  |  | """The central module containing code to create CH4 and H2 voronoi polygons | 
            
                                                        
            
                                    
            
            
                | 2 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 3 |  |  | """ | 
            
                                                        
            
                                    
            
            
                | 4 |  |  | from geoalchemy2.types import Geometry | 
            
                                                        
            
                                    
            
            
                | 5 |  |  | from sqlalchemy import BigInteger, Column, Text | 
            
                                                        
            
                                    
            
            
                | 6 |  |  | from sqlalchemy.ext.declarative import declarative_base | 
            
                                                        
            
                                    
            
            
                | 7 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 8 |  |  | from egon.data import db | 
            
                                                        
            
                                    
            
            
                | 9 |  |  | from egon.data.datasets import Dataset | 
            
                                                        
            
                                    
            
            
                | 10 |  |  | from egon.data.datasets.generate_voronoi import get_voronoi_geodataframe | 
            
                                                        
            
                                    
            
            
                | 11 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 12 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 13 |  |  | class GasAreaseGon2035(Dataset): | 
            
                                                        
            
                                    
            
            
                | 14 |  |  |     def __init__(self, dependencies): | 
            
                                                        
            
                                    
            
            
                | 15 |  |  |         super().__init__( | 
            
                                                        
            
                                    
            
            
                | 16 |  |  |             name="GasAreaseGon2035", | 
            
                                                        
            
                                    
            
            
                | 17 |  |  |             version="0.0.2", | 
            
                                                        
            
                                    
            
            
                | 18 |  |  |             dependencies=dependencies, | 
            
                                                        
            
                                    
            
            
                | 19 |  |  |             tasks=(create_gas_voronoi_table, voronoi_egon2035), | 
            
                                                        
            
                                    
            
            
                | 20 |  |  |         ) | 
            
                                                        
            
                                    
            
            
                | 21 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 22 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 23 |  |  | class GasAreaseGon100RE(Dataset): | 
            
                                                        
            
                                    
            
            
                | 24 |  |  |     def __init__(self, dependencies): | 
            
                                                        
            
                                    
            
            
                | 25 |  |  |         super().__init__( | 
            
                                                        
            
                                    
            
            
                | 26 |  |  |             name="GasAreaseGon100RE", | 
            
                                                        
            
                                    
            
            
                | 27 |  |  |             version="0.0.1", | 
            
                                                        
            
                                    
            
            
                | 28 |  |  |             dependencies=dependencies, | 
            
                                                        
            
                                    
            
            
                | 29 |  |  |             tasks=(voronoi_egon100RE), | 
            
                                                        
            
                                    
            
            
                | 30 |  |  |         ) | 
            
                                                        
            
                                    
            
            
                | 31 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 32 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 33 |  |  | Base = declarative_base() | 
            
                                                        
            
                                    
            
            
                | 34 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 35 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 36 |  |  | class EgonPfHvGasVoronoi(Base): | 
            
                                                        
            
                                    
            
            
                | 37 |  |  |     __tablename__ = "egon_gas_voronoi" | 
            
                                                        
            
                                    
            
            
                | 38 |  |  |     __table_args__ = {"schema": "grid"} | 
            
                                                        
            
                                    
            
            
                | 39 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 40 |  |  |     scn_name = Column(Text, primary_key=True, nullable=False) | 
            
                                                        
            
                                    
            
            
                | 41 |  |  |     bus_id = Column(BigInteger, primary_key=True, nullable=False) | 
            
                                                        
            
                                    
            
            
                | 42 |  |  |     carrier = Column(Text) | 
            
                                                        
            
                                    
            
            
                | 43 |  |  |     geom = Column(Geometry("GEOMETRY", 4326)) | 
            
                                                        
            
                                    
            
            
                | 44 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 45 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 46 |  |  | def create_gas_voronoi_table(): | 
            
                                                        
            
                                    
            
            
                | 47 |  |  |     engine = db.engine() | 
            
                                                        
            
                                    
            
            
                | 48 |  |  |     EgonPfHvGasVoronoi.__table__.drop(bind=engine, checkfirst=True) | 
            
                                                        
            
                                    
            
            
                | 49 |  |  |     EgonPfHvGasVoronoi.__table__.create(bind=engine, checkfirst=True) | 
            
                                                        
            
                                    
            
            
                | 50 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 51 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 52 |  |  | def voronoi_egon2035(): | 
            
                                                        
            
                                    
            
            
                | 53 |  |  |     """ | 
            
                                                        
            
                                    
            
            
                | 54 |  |  |     Create voronoi polygons for all gas carriers in eGon2035 scenario | 
            
                                                        
            
                                    
            
            
                | 55 |  |  |     """ | 
            
                                                        
            
                                    
            
            
                | 56 |  |  |     for carrier in ["CH4", "H2_grid", "H2_saltcavern"]: | 
            
                                                        
            
                                    
            
            
                | 57 |  |  |         create_voronoi("eGon2035", carrier) | 
            
                                                        
            
                                    
            
            
                | 58 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 59 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 60 |  |  | def voronoi_egon100RE(): | 
            
                                                        
            
                                    
            
            
                | 61 |  |  |     """ | 
            
                                                        
            
                                    
            
            
                | 62 |  |  |     Create voronoi polygons for all gas carriers in eGon100RE scenario | 
            
                                                        
            
                                    
            
            
                | 63 |  |  |     """ | 
            
                                                        
            
                                    
            
            
                | 64 |  |  |     for carrier in ["CH4", "H2_grid", "H2_saltcavern"]: | 
            
                                                        
            
                                    
            
            
                | 65 |  |  |         create_voronoi("eGon100RE", carrier) | 
            
                                                        
            
                                    
            
            
                | 66 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 67 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 68 |  |  | def create_voronoi(scn_name, carrier): | 
            
                                                        
            
                                    
            
            
                | 69 |  |  |     """ | 
            
                                                        
            
                                    
            
            
                | 70 |  |  |     Create voronoi polygons for specified carrier in specified scenario. | 
            
                                                        
            
                                    
            
            
                | 71 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 72 |  |  |     Parameters | 
            
                                                        
            
                                    
            
            
                | 73 |  |  |     ---------- | 
            
                                                        
            
                                    
            
            
                | 74 |  |  |     scn_name : str | 
            
                                                        
            
                                    
            
            
                | 75 |  |  |         Name of the scenario | 
            
                                                        
            
                                    
            
            
                | 76 |  |  |     carrier : str | 
            
                                                        
            
                                    
            
            
                | 77 |  |  |         Name of the carrier | 
            
                                                        
            
                                    
            
            
                | 78 |  |  |     """ | 
            
                                                        
            
                                    
            
            
                | 79 |  |  |     boundary = db.select_geodataframe( | 
            
                                                        
            
                                    
            
            
                | 80 |  |  |         f""" | 
            
                                                        
            
                                    
            
            
                | 81 |  |  |             SELECT id, geometry | 
            
                                                        
            
                                    
            
            
                | 82 |  |  |             FROM boundaries.vg250_sta_union; | 
            
                                                        
            
                                    
            
            
                | 83 |  |  |         """, | 
            
                                                        
            
                                    
            
            
                | 84 |  |  |         geom_col="geometry", | 
            
                                                        
            
                                    
            
            
                | 85 |  |  |     ).to_crs(epsg=4326) | 
            
                                                        
            
                                    
            
            
                | 86 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 87 |  |  |     engine = db.engine() | 
            
                                                        
            
                                    
            
            
                | 88 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 89 |  |  |     db.execute_sql( | 
            
                                                        
            
                                    
            
            
                | 90 |  |  |         f""" | 
            
                                                        
            
                                    
            
            
                | 91 |  |  |         DELETE FROM grid.egon_gas_voronoi | 
            
                                                        
            
                                    
            
            
                | 92 |  |  |         WHERE "carrier" = '{carrier}' and "scn_name" = '{scn_name}'; | 
            
                                                        
            
                                    
            
            
                | 93 |  |  |         """ | 
            
                                                        
            
                                    
            
            
                | 94 |  |  |     ) | 
            
                                                        
            
                                    
            
            
                | 95 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 96 |  |  |     buses = db.select_geodataframe( | 
            
                                                        
            
                                    
            
            
                | 97 |  |  |         f""" | 
            
                                                        
            
                                    
            
            
                | 98 |  |  |             SELECT bus_id, geom | 
            
                                                        
            
                                    
            
            
                | 99 |  |  |             FROM grid.egon_etrago_bus | 
            
                                                        
            
                                    
            
            
                | 100 |  |  |             WHERE scn_name = '{scn_name}' | 
            
                                                        
            
                                    
            
            
                | 101 |  |  |             AND country = 'DE' | 
            
                                                        
            
                                    
            
            
                | 102 |  |  |             AND carrier = '{carrier}'; | 
            
                                                        
            
                                    
            
            
                | 103 |  |  |         """, | 
            
                                                        
            
                                    
            
            
                | 104 |  |  |     ).to_crs(epsg=4326) | 
            
                                                        
            
                                    
            
            
                | 105 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 106 |  |  |     if len(buses) == 0: | 
            
                                                        
            
                                    
            
            
                | 107 |  |  |         return | 
            
                                                        
            
                                    
            
            
                | 108 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 109 |  |  |     buses["x"] = buses.geometry.x | 
            
                                                        
            
                                    
            
            
                | 110 |  |  |     buses["y"] = buses.geometry.y | 
            
                                                        
            
                                    
            
            
                | 111 |  |  |     # generate voronois | 
            
                                                        
            
                                    
            
            
                | 112 |  |  |     gdf = get_voronoi_geodataframe(buses, boundary.geometry.iloc[0]) | 
            
                                                        
            
                                    
            
            
                | 113 |  |  |     # set scn_name | 
            
                                                        
            
                                    
            
            
                | 114 |  |  |     gdf["scn_name"] = scn_name | 
            
                                                        
            
                                    
            
            
                | 115 |  |  |     gdf["carrier"] = carrier | 
            
                                                        
            
                                    
            
            
                | 116 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 117 |  |  |     gdf.rename_geometry("geom", inplace=True) | 
            
                                                        
            
                                    
            
            
                | 118 |  |  |     gdf.drop(columns=["id"], inplace=True) | 
            
                                                        
            
                                    
            
            
                | 119 |  |  |     # Insert data to db | 
            
                                                        
            
                                    
            
            
                | 120 |  |  |     gdf.set_crs(epsg=4326).to_postgis( | 
            
                                                        
            
                                    
            
            
                | 121 |  |  |         f"egon_gas_voronoi", | 
            
                                                        
            
                                    
            
            
                | 122 |  |  |         engine, | 
            
                                                        
            
                                    
            
            
                | 123 |  |  |         schema="grid", | 
            
                                                        
            
                                    
            
            
                | 124 |  |  |         index=False, | 
            
                                                        
            
                                    
            
            
                | 125 |  |  |         if_exists="append", | 
            
                                                        
            
                                    
            
            
                | 126 |  |  |         dtype={"geom": Geometry}, | 
            
                                                        
            
                                    
            
            
                | 127 |  |  |     ) | 
            
                                                        
            
                                    
            
            
                | 128 |  |  |  |