Source code for egon.data.datasets.zensus_mv_grid_districts
"""
Implements mapping between mv grid districts and zensus cells
"""
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.ext.declarative import declarative_base
import geopandas as gpd
from egon.data import db
from egon.data.datasets import Dataset
from egon.data.datasets.mv_grid_districts import MvGridDistricts
from egon.data.datasets.zensus_vg250 import DestatisZensusPopulationPerHa
import egon.data.config
[docs]class ZensusMvGridDistricts(Dataset):
"""
Maps zensus cells to MV grid districts and writes it to database.
*Dependencies*
* :py:class:`ZensusPopulation <egon.data.datasets.zensus.ZensusPopulation>`
* :py:class:`MvGridDistricts <egon.data.datasets.mv_grid_districts.mv_grid_districts_setup>`
*Resulting tables*
* :py:class:`boundaries.egon_map_zensus_grid_districts <MapZensusGridDistricts>`
is created and filled
"""
#:
name: str = "ZensusMvGridDistricts"
#:
version: str = "0.0.1"
def __init__(self, dependencies):
super().__init__(
name=self.name,
version=self.version,
dependencies=dependencies,
tasks=(mapping),
)
# will be later imported from another file ###
Base = declarative_base()
[docs]class MapZensusGridDistricts(Base):
"""
Class definition of table boundaries.egon_map_zensus_grid_districts.
"""
__tablename__ = "egon_map_zensus_grid_districts"
__table_args__ = {"schema": "boundaries"}
zensus_population_id = Column(
Integer,
ForeignKey(DestatisZensusPopulationPerHa.id),
primary_key=True,
index=True,
)
bus_id = Column(Integer, ForeignKey(MvGridDistricts.bus_id))
[docs]def mapping():
"""
Map zensus cells and MV grid districts and write to database.
Newly creates and fills table boundaries.egon_map_zensus_grid_districts.
"""
MapZensusGridDistricts.__table__.drop(bind=db.engine(), checkfirst=True)
MapZensusGridDistricts.__table__.create(bind=db.engine(), checkfirst=True)
# Get information from data configuration file
cfg = egon.data.config.datasets()["map_zensus_grid_districts"]
# Delete existsing data
db.execute_sql(
f"""DELETE FROM
{cfg['targets']['map']['schema']}.{cfg['targets']['map']['table']}"""
)
# Select zensus cells
zensus = db.select_geodataframe(
f"""SELECT id as zensus_population_id, geom_point FROM
{cfg['sources']['zensus_population']['schema']}.
{cfg['sources']['zensus_population']['table']}""",
geom_col="geom_point",
)
grid_districts = db.select_geodataframe(
f"""SELECT bus_id, geom
FROM {cfg['sources']['egon_mv_grid_district']['schema']}.
{cfg['sources']['egon_mv_grid_district']['table']}""",
geom_col="geom",
epsg=3035,
)
# Join mv grid districts with zensus cells
join = gpd.sjoin(zensus, grid_districts, how="inner", op="intersects")
# Insert results to database
join[["zensus_population_id", "bus_id"]].to_sql(
cfg["targets"]["map"]["table"],
schema=cfg["targets"]["map"]["schema"],
con=db.engine(),
if_exists="replace",
)