# -*- coding: utf-8 -*-
"""
Reegis geometry tools.
SPDX-FileCopyrightText: 2016-2019 Uwe Krien <krien@uni-bremen.de>
SPDX-License-Identifier: MIT
"""
__copyright__ = "Uwe Krien <krien@uni-bremen.de>"
__license__ = "MIT"
import os
import warnings
from collections import namedtuple
try:
import geopandas as gpd
except ModuleNotFoundError:
gpd = None
from deflex import config as cfg
[docs]def deflex_regions(rmap=None, rtype="polygons"):
"""
Parameters
----------
rmap : str
Name of the deflex map.
rtype : str
Type of the deflex map ('polygon', 'labels').
Returns
-------
GeoDataFrame
Examples
--------
>>> my_regions=deflex_regions('de17')
>>> len(my_regions)
17
>>> my_regions.geometry.iloc[0].geom_type
'MultiPolygon'
>>> l=deflex_regions('de21', 'labels').loc['DE04', 'geometry']
>>> l.geom_type
'Point'
>>> l.x
13.2
>>> l.y
51.1
>>> cfg.tmp_set('init', 'map', 'de22')
>>> deflex_regions().name
'de22'
>>> list(deflex_regions('de02').index)
['DE01', 'DE02']
"""
if gpd is not None:
if rmap is None:
rmap = cfg.get("init", "map")
name = os.path.join(
os.path.dirname(__file__),
"data",
"geometries",
cfg.get("geometry", "deflex_polygon").format(
suffix=".geojson", map=rmap, type=rtype
),
)
regions = gpd.read_file(name)
regions.set_index("region", inplace=True)
regions.name = rmap
else:
msg = ("\nTo read a deflex map you need to install 'geopandas' "
"\n\n pip install geopandas\n")
warnings.warn(msg, UserWarning)
regions = None
return regions
[docs]def deflex_power_lines(rmap=None, rtype="lines"):
"""
Parameters
----------
rmap : str
Name of the deflex powerline map.
rtype : str
Type of the deflex powerline map ('lines', 'labels').
Returns
-------
Examples
--------
>>> my_lines=deflex_power_lines('de17')
>>> my_lines.geometry.iloc[0].geom_type
'LineString'
>>> len(my_lines)
31
>>> deflex_power_lines('de02').index[0]
'DE01-DE02'
>>> cfg.tmp_set('init', 'map', 'de21')
>>> deflex_power_lines().name
'de21'
"""
if gpd is not None:
if rmap is None:
rmap = cfg.get("init", "map")
name = os.path.join(
os.path.dirname(__file__),
"data",
"geometries",
cfg.get("geometry", "powerlines").format(
map=rmap, type=rtype, suffix=".geojson"
),
)
lines = gpd.read_file(name)
lines.set_index("name", inplace=True)
lines.name = rmap
else:
msg = ("\nTo read a deflex map you need to install 'geopandas' "
"\n\n pip install geopandas\n")
warnings.warn(msg, UserWarning)
lines = None
return lines
[docs]def divide_off_and_onshore(regions):
"""
Sort regions into onshore and offshore regions. A namedtuple with two list
of regions ids will be returned. Fetch the `onshore` and `offshore`
attribute of the named tuple to get the list.
Parameters
----------
regions : GeoDataFrame
A region set with the region id in the index.
Returns
-------
named tuple
Examples
--------
>>> reg=deflex_regions('de02')
>>> divide_off_and_onshore(reg).onshore
['DE01']
>>> reg=deflex_regions('de21')
>>> divide_off_and_onshore(reg).offshore
['DE19', 'DE20', 'DE21']
"""
region_type = namedtuple("RegionType", "offshore onshore")
regions_centroid = regions.copy()
regions_centroid.geometry = regions_centroid.to_crs(
epsg=25832
).centroid.to_crs(epsg="4326")
germany_onshore = gpd.read_file(
os.path.join(
os.path.dirname(__file__),
"data",
"geometries",
cfg.get("geometry", "germany_polygon"),
)
)
gdf = gpd.sjoin(regions_centroid, germany_onshore, how="left", op="within")
onshore = list(gdf.loc[~gdf.gid.isnull()].index)
offshore = list(gdf.loc[gdf.gid.isnull()].index)
return region_type(offshore=offshore, onshore=onshore)