Messstellenstandort Wasserkuppe mit Geopandas Teil 2
Welchen Einfluss hat der Messstellenstandort Wasserkuppe auf die Messdaten? Vor allem die anthropogen Einflüsse der näheren Umgebung. Die Visualisierung wird mit geopandas umgesetzt. Geopandas ist eine Pythonbibliothek für die Arbeit mit Geodaten.
Für eine visuelle Eingrenzung liefert eine Shapefile, ein Format für vektorielle Geodaten, Polygondaten mit Bundesländer und Postleitzahlengebiete. Im weiteren Verlauf wird der Umgang mit dem Koordinatenbezugssystem beschrieben, den Installationsblauf von Geopandas gezeigt und eine OpenStreetMap als Basiskarte eingebunden.
Das Koordinatenreferenzsystem oder Koordinatenbezugsystem (KBS), engl. coordinate reference system, international mit CRS abgekürzt, beschreibt die Lage eines Koordinatensystems zur Angabe einer Position auf der Erde.
Stand: 27.04.2021
EPSG-Codes
Der EPSG-Code ist ein System weltweit eindeutiger, 4- bis 5-stelliger Schlüsselnummern für Koordinatenreferenzsysteme und andere geodätische Datensätze, wie Referenzellipsoide oder Projektionen.
Code | Koordinatenreferenzsystem | Bemerkung |
---|---|---|
4326 | WGS-84 / Geographische Koordinaten | weltweites System für GPS-Geräte, OpenStreetMap Datenbank |
3857 | WGS 84 / Pseudo-Mercator | Google Maps, OpenStreetMap |
31467 | DHDN / Gauß-Krüger Zone 3 | passend für Baden-Württemberg und Hessen. |
Installation
Es wurde Python 3.7 genutzt. Die folgende Installationsreihenfolge ist wichtig. Microsoft Visual C++ 14.0 oder höher wird benötigt. Dieses kann unter https://visualstudio.microsoft.com/de/visual-cpp-build-tools/ runtergeladen werden.
- pip install numpy
- pip install pandas
- pip install shapely
- pip install pipwin
- pipwin install gdal
- pipwin install fiona
- pip install pyproj
- pip install six
- pip install rtree
pip install geopandas
- pip install matplotlib
- pip contextily —> lieferte den Fehler: A GDAL API version must be specified. Provide a path to gdal-config using a GDAL_CONFIG environment variable or use a GDAL_VERSION environment variable.
Deswegen:
- conda install contextily –channel conda-forge
Shapefile Deutschland
Die benötigte Shapefile wurde von folgender Seite runtergeladen: www.suche-postleitzahl.org/downloads. Die folgende Seite war dabei sehr hilfreich.1
- plz-gebiete.shp: Die Datei enthält die Polygone der einzelnen Postleitzahlenbereiche
- zuordnung_plz_ort.csv: Die zugehörige Postleitzahl als Bezeichner für Ort und Bundesland. Das Dateiformat ist im CSV-Format.
import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
%matplotlib inline
Die Postleitzahlen müssen als String gelesen werden. Sonst wird eine 01 beginnende PLZ mit 1 geparst. Die shapefile wird geladen und das CRS ausgegeben. Alle vier Dateien mit den Endungen, .dbf , prj , shp , shx sollten im selben Ordner sein.
dtl_shapefile_df = gpd.read_file('plz-gebiete.shp', dtype={'plz': str}, encoding="utf-8")
dtl_shapefile_df
plz | note | geometry | |
---|---|---|---|
0 | 52538 | 52538 Gangelt, Selfkant | POLYGON ((5.86632 51.05110, 5.86692 51.05124, ... |
1 | 47559 | 47559 Kranenburg | POLYGON ((5.94504 51.82354, 5.94580 51.82409, ... |
2 | 52525 | 52525 Waldfeucht, Heinsberg | POLYGON ((5.96811 51.05556, 5.96951 51.05660, ... |
3 | 52074 | 52074 Aachen | POLYGON ((5.97486 50.79804, 5.97495 50.79809, ... |
4 | 52531 | 52531 Übach-Palenberg | POLYGON ((6.01507 50.94788, 6.03854 50.93561, ... |
... | ... | ... | ... |
8720 | 02899 | 02899 Ostritz, Schönau-Berzdorf | POLYGON ((14.85296 51.06854, 14.85449 51.06859... |
8721 | 02929 | 02929 Rothenburg/O.L. | POLYGON ((14.85491 51.32895, 14.85608 51.33004... |
8722 | 02827 | 02827 Görlitz | POLYGON ((14.91168 51.14243, 14.91571 51.14571... |
8723 | 02828 | 02828 Görlitz | POLYGON ((14.93413 51.16084, 14.93451 51.16123... |
8724 | 02826 | 02826 Görlitz | POLYGON ((14.95374 51.14703, 14.95393 51.14814... |
8725 rows × 3 columns
dtl_shapefile_df.crs
{'init': 'epsg:4326'}
plz_ort_df = pd.read_csv(
'zuordnung_plz_ort.csv',
sep=',',
dtype={'plz': str}
)
plz_ort_df.drop('osm_id', axis=1, inplace=True)
plz_ort_df.head()
ort | plz | bundesland | |
---|---|---|---|
0 | Aach | 78267 | Baden-Württemberg |
1 | Aach | 54298 | Rheinland-Pfalz |
2 | Aachen | 52062 | Nordrhein-Westfalen |
3 | Aachen | 52064 | Nordrhein-Westfalen |
4 | Aachen | 52066 | Nordrhein-Westfalen |
Verbinde die .shape-Datei mit der csv-Datei, nutze dabei die Postleitzahlen. Dies ist ein typischer Excel sverweis.
deutschland_df = pd.merge(
left=dtl_shapefile_df,
right=plz_ort_df,
on='plz',
how='inner'
)
deutschland_df.drop(['note'], axis=1, inplace=True)
deutschland_df.head()
plz | geometry | ort | bundesland | |
---|---|---|---|---|
0 | 52538 | POLYGON ((5.86632 51.05110, 5.86692 51.05124, ... | Gangelt | Nordrhein-Westfalen |
1 | 52538 | POLYGON ((5.86632 51.05110, 5.86692 51.05124, ... | Selfkant | Nordrhein-Westfalen |
2 | 47559 | POLYGON ((5.94504 51.82354, 5.94580 51.82409, ... | Kranenburg | Nordrhein-Westfalen |
3 | 52525 | POLYGON ((5.96811 51.05556, 5.96951 51.05660, ... | Heinsberg | Nordrhein-Westfalen |
4 | 52525 | POLYGON ((5.96811 51.05556, 5.96951 51.05660, ... | Waldfeucht | Nordrhein-Westfalen |
Messstellenstandort Wasserkuppe
import shapely
import contextily as ctx
wasserkuppe_df = deutschland_df.query(('plz == "36129"'))
wasserkuppe_df = wasserkuppe_df.to_crs(epsg=3857)
df = pd.DataFrame({'city': ['Wasserkuppe'],
'latitude': [50.49768412],
'longitude': [9.9358506]})
gdf = gpd.GeoDataFrame(df.drop(['latitude', 'longitude'], axis=1),
crs = {'init': 'epsg:4326'},
geometry = [shapely.geometry.Point(xy)
for xy in zip(df.longitude, df.latitude)])
gdf = gdf.to_crs(epsg = 3857)
print(gdf)
fig = plt.figure(figsize = (15,15))
ax = plt.subplot()
ax.text(x = 1106053.829, y = 6532916.278 - 715, s ='Messstelle Wasserkuppe', size = 18)
wasserkuppe_df = wasserkuppe_df.plot(color='none',edgecolor='black', linewidth=3, ax = ax)
ax.set_axis_off()
gdf.plot(ax = wasserkuppe_df, marker = 'o', color = 'red', markersize = 150)
ctx.add_basemap(ax = ax, source=ctx.providers.OpenTopoMap)
city geometry
0 Wasserkuppe POINT (1106053.829 6532916.278)
Der rote schraffierte Bereich ist das Sperrgebiet Truppenübungsplatz Wildflecken.
Quellenangaben:
Quellenangaben Sonstiges:
https://stackoverflow.com/questions/51621615/which-geopandas-datasets-maps-are-available
https://github.com/geopandas/geopandas/blob/master/doc/source/gallery/plotting_basemap_background.ipynb
https://geopandas.org/gallery/plotting_basemap_background.html
Orduz, J. C. (2020, 7. Januar). Open Data: Germany Maps Viz. Dr. Juan Camilo Orduz. https://juanitorduz.github.io/germany_plots/ ↩