Source code for egon.data.datasets.substation_voronoi

"""The central module containing code to create substation voronois

"""

import egon.data.config
from egon.data import db
from egon.data.datasets import Dataset
from sqlalchemy import Column, Integer, Sequence
from sqlalchemy.ext.declarative import declarative_base
from geoalchemy2.types import Geometry

Base = declarative_base()


[docs]class SubstationVoronoi(Dataset): def __init__(self, dependencies): super().__init__( name="substation_voronoi", version="0.0.0", dependencies=dependencies, tasks=( create_tables, substation_voronoi, ), )
[docs]class EgonHvmvSubstationVoronoi(Base): __tablename__ = "egon_hvmv_substation_voronoi" __table_args__ = {"schema": "grid"} id = Column( Integer, Sequence("egon_hvmv_substation_voronoi_id_seq", schema="grid"), server_default=Sequence( "egon_hvmv_substation_voronoi_id_seq", schema="grid" ).next_value(), primary_key=True, ) bus_id = Column(Integer) geom = Column(Geometry("Multipolygon", 4326))
[docs]class EgonEhvSubstationVoronoi(Base): __tablename__ = "egon_ehv_substation_voronoi" __table_args__ = {"schema": "grid"} id = Column( Integer, Sequence("egon_ehv_substation_voronoi_id_seq", schema="grid"), server_default=Sequence( "egon_ehv_substation_voronoi_id_seq", schema="grid" ).next_value(), primary_key=True, ) bus_id = Column(Integer) geom = Column(Geometry("Multipolygon", 4326))
[docs]def create_tables(): """Create tables for voronoi polygons Returns ------- None. """ cfg_voronoi = egon.data.config.datasets()["substation_voronoi"]["targets"] db.execute_sql( f"""DROP TABLE IF EXISTS {cfg_voronoi['ehv_substation_voronoi']['schema']}. {cfg_voronoi['ehv_substation_voronoi']['table']} CASCADE;""" ) db.execute_sql( f"""DROP TABLE IF EXISTS {cfg_voronoi['hvmv_substation_voronoi']['schema']}. {cfg_voronoi['hvmv_substation_voronoi']['table']} CASCADE;""" ) # Drop sequences db.execute_sql( f"""DROP SEQUENCE IF EXISTS {cfg_voronoi['ehv_substation_voronoi']['schema']}. {cfg_voronoi['ehv_substation_voronoi']['table']}_id_seq CASCADE;""" ) db.execute_sql( f"""DROP SEQUENCE IF EXISTS {cfg_voronoi['hvmv_substation_voronoi']['schema']}. {cfg_voronoi['hvmv_substation_voronoi']['table']}_id_seq CASCADE;""" ) engine = db.engine() EgonEhvSubstationVoronoi.__table__.create(bind=engine, checkfirst=True) EgonHvmvSubstationVoronoi.__table__.create(bind=engine, checkfirst=True)
[docs]def substation_voronoi(): """ Creates voronoi polygons for hvmv and ehv substations Returns ------- None. """ substation_list = ["hvmv_substation", "ehv_substation"] for substation in substation_list: cfg_boundaries = egon.data.config.datasets()["substation_voronoi"]["sources"]["boundaries"] cfg_substation = egon.data.config.datasets()["substation_voronoi"]["sources"][substation] cfg_voronoi = egon.data.config.datasets()["substation_voronoi"]["targets"][substation+ "_voronoi"] view = "grid.egon_voronoi_no_borders" # Create view for Voronoi polygons without taking borders into account db.execute_sql( f"DROP VIEW IF EXISTS {view} CASCADE;" ) db.execute_sql( f""" CREATE VIEW {view} AS SELECT (ST_Dump(ST_VoronoiPolygons(ST_collect(a.point)))).geom FROM {cfg_substation['schema']}. {cfg_substation['table']} a; """ ) # Clip Voronoi with boundaries db.execute_sql( f""" INSERT INTO {cfg_voronoi['schema']}.{cfg_voronoi['table']} (geom) (SELECT ST_Multi(ST_Intersection( ST_Transform(a.geometry, 4326), b.geom)) AS geom FROM {cfg_boundaries['schema']}. {cfg_boundaries['table']} a CROSS JOIN {view} b); """ ) # Assign substation id as foreign key db.execute_sql( f""" UPDATE {cfg_voronoi['schema']}.{cfg_voronoi['table']} AS t1 SET bus_id = t2.bus_id FROM (SELECT voi.id AS id, sub.bus_id ::integer AS bus_id FROM {cfg_voronoi['schema']}.{cfg_voronoi['table']} AS voi, {cfg_substation['schema']}.{cfg_substation['table']} AS sub WHERE voi.geom && sub.point AND ST_CONTAINS(voi.geom,sub.point) GROUP BY voi.id,sub.bus_id )AS t2 WHERE t1.id = t2.id; """ ) db.execute_sql( f""" CREATE INDEX {cfg_voronoi['table']}_idx ON {cfg_voronoi['schema']}.{cfg_voronoi['table']} USING gist (geom); """ ) db.execute_sql(f"DROP VIEW IF EXISTS {view} CASCADE;")