Source code for apem.unit_based_model.allocation.algorithms.zonal_clearing.zonal_configuration
[docs]
def node_zone_mapper(zonal_configuration: str, lat: float, lon: float) -> int:
"""
Map a node to a specific zone based on its latitude and longitude coordinates.
Note: The configurations 'zonal_DE2-k', 'zonal_DE2-s', 'zonal_DE3', 'zonal_DE4' were
suggested by ACER for the BZR (see https://www.entsoe.eu/network_codes/bzr/).
:param zonal_configuration: zonal configuration to be used
:type zonal_configuration: str
:param lat: latitude
:type lat: float
:param lon: longitude
:type lon: float
:return: zone where node is located
:rtype: int
"""
if zonal_configuration == 'national': # National
return 1
elif zonal_configuration == 'zonal_DE2-k': # DE2 (k-means)
if (lat < 52 and lon < 7.25) or (lat < 51.4 and lon < 8) or (lat < 51.1 and lon < 10) or (lat < 50.3):
return 2 # SOUTH
else:
return 1 # NORTH
elif zonal_configuration == 'zonal_DE2-s': # DE2 (spectral)
if (lat < 52.9 and lon < 8.5) or (lat < 51.75 and lon < 10.25) or (lat < 50.3):
return 2 # SOUTH
else:
return 1 # NORTH
elif zonal_configuration == 'zonal_DE3': # DE3 (spectral)
if (lat < 51.2 and lon < 8) or (lat < 51 and lon < 10.2) or (lat < 50.3):
return 3 # SOUTH
elif (lat > 52.2 and lon < 11) or (lat > 51.5 and lon < 10.3) or (lon < 10):
return 1 # NORTH-WEST
else:
return 2 # NORTH-EAST
elif zonal_configuration == 'zonal_DE4': # DE4 (spectral, refined)
if ((47.20 <= lat <= 50.63 and 9.52 <= lon <= 12.97) # Bavaria
or (47.55 <= lat <= 49.78 and 7.68 <= lon <= 9.66)
or (lat <= 48.9)):
zone = 4 # SOUTH
elif ((50.56 <= lat <= 51.65 and 9.87 <= lon <= 11.04) # Thuringia
or (50.79 <= lat <= 51.68 and 12.08 <= lon <= 14.60) # Saxony
or (51.35 <= lat <= 53.55 and 11.41 <= lon <= 16) # Brandenburg
or (51.38 <= lat <= 52.88 and 10.88 <= lon <= 12.37) # Saxony-Anhalt
or (52.33 <= lat <= 52.67 and 13.08 <= lon <= 13.76) # Berlin
or (53.21 <= lat <= 54.68 and 11.00 <= lon <= 14.24) # Mecklenburg-Vorpommern
or (53.37 <= lat <= 53.72 and 9.76 <= lon <= 10.23) # Hamburg
or (54.41 <= lat <= 55.05 and 8.08 <= lon <= 10.12) # Schleswig-Holstein
# adjustments
or (lon >= 14.5)
or (lat >= 50.5 and lon >= 11)
or (lat >= 53.6 and lon >= 9)
or (lat >= 54 and lon >= 7)):
zone = 3 # EAST
elif ((50.97 <= lat <= 52.0 and 5.86 <= lon <= 9)
or (49.54 <= lat <= 50.78 and 6.05 <= lon <= 7.72)
or (49 <= lat <= 51)):
zone = 2 # WEST
else:
zone = 1 # NORTH-WEST
# Refinements
if zone == 2:
if (lat >= 51.1 and lon >= 7.8) or (lon > 9):
zone = 1 # NORTH-WEST
if zone == 1 and lat < 50.7:
zone = 4 # SOUTH
if zone == 4 and lat >= 49 and lon <= 8.1:
zone = 2 # WEST
return zone
elif zonal_configuration == 'zonal_DE5':
if 53.7 < lat < 55 and 8 < lon < 11.2:
zone = 5
elif lat > 53 and lon < 11 or 52.8 < lat < 53.9 and lon < 9 or \
52.9 < lat < 53.3 and 7.4 < lon < 10.75 or 51.7 < lat < 52 and 8 < lon < 10:
zone = 1
elif lon < 8.28 or 49.5 < lat < 50.2 and lon < 9.1:
zone = 2
elif lat > 50.35 and lon > 10 or lat > 50.2 and lon > 10:
zone = 3
else:
zone = 4
# Refinements
if 8.2 <= lon <= 10 and 51.9 <= lat <= 53:
zone = 1
if zone == 2 and lat < 49:
zone = 4
if zone == 4 and lat > 49 and 8.2 < lon < 8.5:
zone = 2
if 54.3 < lat < 56 and 7.5 < lon < 8.2 or lat > 55 and lon < 8:
zone = 5
if 53.5 < lat < 54 and 8 < lon < 8.2:
zone = 1
return zone