import geopandas as gpd
= gpd.read_file("data/zeckenstiche.gpkg") zeckenstiche
ModuleNotFoundError: No module named 'geopandas'
Was bringt uns diese Geo Erweiterung? Mit GeoDataFrames sind nun alle räumliche Operationen möglich, die wir bereits aus ArcGIS kennen aber mit einfachen DataFrames noch nicht möglich waren. Ich möchte dies an ein paar Beispielen Demonstrieren. Dazu müssen wir die Zeckenstiche in GeoDataFrame konvertiert und in ein Geopackage exportiert haben, wie in Input: GIS in Python beschrieben.
import geopandas as gpd
= gpd.read_file("data/zeckenstiche.gpkg") zeckenstiche
ModuleNotFoundError: No module named 'geopandas'
type()
.x
)# von GeoDataFrame zu Geoseries:
= gpd.GeoSeries(zeckenstiche["geometry"])
zecken_geoseries
# von GeoSeries zurück zu GeoDataFrame:
= gpd.GeoDataFrame(geometry = zecken_geoseries) zecken_geodataframe
NameError: name 'gpd' is not defined
Eine typische GIS Operation ist das “Buffern” von Objekten. Der ArcGIS Befehl “Buffer” erreichen wir in Geopandas mit .buffer()
. Folgender Code macht einen Buffer mit einer Distanz von 10m.
= zeckenstiche.buffer(10) buffered
NameError: name 'zeckenstiche' is not defined
Um Geopandas-Objekte zu plotten kann man einfach .plot()
verwenden. Zudem kann man mit boundary
die Umrisse eines Polygons extrahieren:
= buffered.boundary.plot() # plottet die boundries
base
= base, color = "black") # plottet die Punkte zeckenstiche.plot(ax
NameError: name 'buffered' is not defined
Mit unary_union
können wir aus unserer Point-Geometrie ein MultiPoint erstellen (siehe Aufbau von GeoDataFrames). Dieser Befehl lautet in ArcGIS Union.
= zeckenstiche["geometry"].unary_union
zeckenstiche_union
type(zeckenstiche_union) # Es handelt sich nun um den Typ "MultiPoint"
NameError: name 'zeckenstiche' is not defined
Wenn wir uns zeckenstiche_union
nun mit print
anschauen sehen wir, dass sämtliche Koordinaten in einem Objekt zusammengepackt sind:
print(zeckenstiche_union)
NameError: name 'zeckenstiche_union' is not defined
Über ein MultiPoint lassen sich jetzt wunderbar sogenannte (in ESRI Terminologie) Minimum Bounding Geometries rechnen. Mit den gleichnamigen Funktionen können wir nun eine convex_hull
1 sowie eine envelope
2 über alle Punkte rechnen.
= zeckenstiche_union.convex_hull
my_convex_hull = zeckenstiche_union.envelope my_envelope
NameError: name 'zeckenstiche_union' is not defined
Nun konvertiere ich beide Polygon-Geometrien in GeoSeries, damit sie einfacher zu visualisieren sind:
= gpd.GeoSeries(my_convex_hull)
my_convex_hull = gpd.GeoSeries(my_envelope) my_envelope
NameError: name 'gpd' is not defined
Um die beiden Objekte nebeneinander zu visualisieren importiere ich zuerst pyplot
aus matplotlib
(mit dem alias plt
) und erstelle subplots
from matplotlib import pyplot as plt
= plt.subplots(1, 2,sharex=True, sharey = True,figsize = (9, 9))
fig, (ax1, ax2)
# Erstellt den linken Plot
= ax1)
my_convex_hull.plot(ax "Convex Hull")
ax1.set_title(= ax1, color = "black")
zeckenstiche.plot(ax
# Erstellt den rechten Plot
= ax2)
my_envelope.plot(ax "Envelope")
ax2.set_title(= ax2, color = "black") zeckenstiche.plot(ax
ModuleNotFoundError: No module named 'matplotlib'
Viele der Funktionen aus dem ESRI Toolset “Overlay” sind in der Geopandas Funktion overlay
verpackt. Um sie zu demonstrieren nutze ich die Geometrien, die wir in weiter oben erstellt haben (buffered
und my_convex_hull
). Zuerst muss ich sie aber noch von GeoSeries in GeoDataFrames konverieren.
= gpd.GeoDataFrame(geometry = buffered, crs = 2056)
buffered_gdf = gpd.GeoDataFrame(geometry = my_convex_hull, crs = 2056) my_convex_hull_gdf
NameError: name 'gpd' is not defined
Nun kann ich zum beispielsweise die Overlay-Funktion difference
ausführen:
= gpd.overlay(my_convex_hull_gdf,buffered_gdf, how='difference') my_difference
NameError: name 'gpd' is not defined
# Bereitet die drei Subplots vor ################
= plt.subplots(1, 3, sharex=True, sharey = True, figsize = (9,9))
fig, (ax1, ax2, ax3) #################################################
# Plot links ####################################
= ax1) #
my_convex_hull_gdf.plot(ax "1. Das Minimum Convex Polygon") #
ax1.set_title(#
ax1.set_axis_off() # Plot mitte ####################################
= ax2) #
buffered_gdf.plot(ax "2. Die gebufferten Punkte") #
ax2.set_title(#
ax2.set_axis_off() # Plot rechts ###################################
= ax3) #
my_difference.plot(ax "Differenz aus 1. & 2.") #
ax3.set_title(#
ax3.set_axis_off() #################################################
NameError: name 'plt' is not defined