Passed
Pull Request — dev (#855)
by
unknown
01:28
created

data.datasets.plotdatascn.set_epsg_network()   A

Complexity

Conditions 1

Size

Total Lines 19
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 19
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
# File description
4
"""
5
Created on Tue May 24 14:42:05 2022
6
Plotdatascn.py defines functions to plot to provide a better context of the different parameters part of
7
scenarios eGon2035 and eGon100RE .
8
@author: Alonso
9
10
"""
11
12
13
    
14
   
15
   
16
   
17
import logging
18
import os
19
from matplotlib import pyplot as plt
20
import matplotlib.patches as mpatches
21
import matplotlib as mpl
22
import pandas as pd
23
import numpy as np
24
from math import sqrt, log10
25
from pyproj import Proj, transform
26
import pandas as pd
27
from egon.data import db
28
from egon.data.datasets import Dataset
29
import egon.data.config
30
import geopandas as gpd
31
import tilemapbase
32
from math import sqrt, log10
33
from pyproj import Proj, transform
34
import tilemapbase
35
36
37
logger = logging.getLogger(__name__)
38
39
if 'READTHEDOCS' not in os.environ:
40
    from geoalchemy2.shape import to_shape
41
42
__copyright__ = ("Flensburg University of Applied Sciences, "
43
                 "Europa-Universität Flensburg, "
44
                 "Centre for Sustainable Energy Systems, "
45
                 "DLR-Institute for Networked Energy Systems")
46
__license__ = ""
47
__author__ = ""
48
49
50
51
52
53
54
55
  
56
   
57
def set_epsg_network(network):
58
    """
59
    Change EPSG from 4326 to 3857. Needed when using osm-background.
60
61
    Parameters
62
    ----------
63
    network : PyPSA network container
64
65
    Returns
66
    -------
67
    """
68
69
    inProj = Proj(init='epsg:4326')
70
    outProj = Proj(init='epsg:3857')
71
    x1, y1 = network.buses.x.values, network.buses.y.values
72
    x2, y2 = transform(inProj, outProj, x1, y1)
73
    network.buses.x, network.buses.y = x2, y2
74
    network.epsg = 3857
75
    set_epsg_network.counter = set_epsg_network.counter + 1
76
    
77
def plot_osm(x, y, zoom, alpha=0.4):
78
    """
79
    Plots openstreetmap as background of network-plots
80
81
    Parameters
82
    ----------
83
    x : array of two floats
84
        Define x-axis boundaries (lat) of osm plot
85
    y : array of two floats
86
        Define y-axis boundaries (long) of osm plot
87
    zoom : int
88
        Define zoom of osm, higher values for higher resolution
89
    alpha : float
90
        Sets osm-visibility, increase value if osm covers network-plot
91
92
    Returns
93
    -------
94
    """
95
96
    tilemapbase.init(create=True)
97
98
    extent = tilemapbase.Extent.from_lonlat(x[0], x[1], y[0], y[1])
99
    extent = extent.to_aspect(1.0)
100
    extent = extent.to_project_3857()
101
102
    fig, ax = plt.subplots()
103
    ax.set_zorder(1)
104
    plt.axis('off')
105
    plotter = tilemapbase.Plotter(extent, tilemapbase.tiles.build_OSM(),
106
                                  zoom=zoom)
107
    plotter.plot(ax, alpha=alpha)
108
    #ax.plot(x, y, "ro-")
109
    return fig, ax
110
111
def plot_generation(
112
              carrier,scenario, osm = False
113
            ):
114
   """
115
    Plots color maps according to the capacity of different generators
116
    of the two existing scenarios (eGon2035 and eGon100RE)
117
    
118
119
    Parameters
120
    ----------
121
    carrier : generators
122
    The list of generators: biomass, central_biomass_CHP, central_biomass_CHP_heat,
123
    industrial_biomass_CHP, solar, solar_rooftop, wind_offshore, wind_onshore. 
124
      
125
    scenario: eGon2035, eGon100RE
126
        
127
        
128
   """
129
    
130
131
   con = db.engine()
132
   SQLBus = "SELECT bus_id, country FROM grid.egon_etrago_bus WHERE country='DE'" #imports buses of Germany
133
   busDE = pd.read_sql(SQLBus,con) 
134
   busDE = busDE.rename({'bus_id': 'bus'},axis=1) 
135
136
   sql = "SELECT bus_id, geom FROM grid.egon_mv_grid_district"#Imports grid districs 
137
   distr = gpd.GeoDataFrame.from_postgis(sql, con)
138
   distr = distr.rename({'bus_id': 'bus'},axis=1)
139
   distr = distr.set_index("bus")
140
   distr = pd.merge(busDE, distr, on='bus') #merges grid districts with buses 
141
142
   sqlCarrier = "SELECT carrier, p_nom, bus FROM grid.egon_etrago_generator" #Imports generator
143
   sqlCarrier = "SELECT * FROM grid.egon_etrago_generator"
144
   Carriers = pd.read_sql(sqlCarrier,con)
145
   Carriers = Carriers.loc[Carriers['scn_name'] == scenario]
146
   Carriers = Carriers.set_index("bus")
147
148
149
   CarrierGen = Carriers.loc[Carriers['carrier'] == carrier]
150
151
   Merge = pd.merge(CarrierGen, distr, on ='bus', how="outer") #merges districts with generators 
152
153
    
154
   Merge.loc[Merge ['carrier'] != carrier, "p_nom" ] = 0
155
   Merge.loc[Merge ['country'] != "DE", "p_nom" ] = 0
156
157
   gdf = gpd.GeoDataFrame(Merge , geometry='geom')
158
   print(Merge)
159
   print(gdf.crs)
160
   pnom=gdf['p_nom']  
161
   max_pnom=pnom.quantile(0.95) #0.95 quantile is used to filter values that are too high and make noise in the plots.
162
   print(max_pnom)
163
   gdf = gdf.to_crs(epsg=3857)
164
165
   
166
   # Plot osm map in background
167
   if osm != False:
168
       #if network.srid == 4326:
169
           #set_epsg_network(network)
170
       fig, ax = plot_osm(osm['x'], osm['y'], osm['zoom'])
171
172
   else:
173
       fig, ax = plt.subplots(1, 1)
174
   
175
   
176
   
177
   ax.set_axis_off();
178
   plt.title(f" {carrier} installed capacity in MW , {scenario}")
179
   cmap = mpl.cm.coolwarm
180
   norm = mpl.colors.Normalize(vmin=0, vmax=max_pnom)
181
   gdf.plot(column='p_nom', ax=ax, legend=True,  legend_kwds={'label': "p_nom(MW)",
182
183
                       'orientation': "vertical"}, cmap=cmap, norm=norm, edgecolor='black', linewidth=0.1,zorder=2)
184
   
185
   return 0
186
   plot_generation(carrier, scenario)  
187
   
188
   
189
   
190
   
191
   
192
   
193
194
195
196
197
198