Ein beträchtlicher Teil der täglich erzeugten Daten ist räumlich verortet. Von Erdbeobachtungs- und GPS-Daten bis hin zu Informationen in allen Arten von Karten: Räumliche Daten – auch als Geodaten oder geografische Informationen bezeichnet – sind Datensätze, denen jeweils ein konkreter Ort zugeordnet ist.
Jeder räumliche Datenpunkt lässt sich auf einer Karte lokalisieren. Das geschieht über ein Koordinatenreferenzsystem, etwa geografische Koordinaten auf Basis der üblichen Breiten- und Längengrade, mit denen wir Orte auf dem Globus angeben. So können wir räumliche Beziehungen in den Daten untersuchen.
Die eigentliche Stärke von Geodaten liegt jedoch in der Verknüpfung von Inhalten und Ort – dadurch eröffnen sich viele Möglichkeiten für anspruchsvolle Analysen. Geospatial Data Science ist ein Teilgebiet der Data Science, das mithilfe räumlicher Algorithmen und Analysetechniken wie Machine Learning und Deep Learning Informationen aus Geodaten gewinnt. Kurz: Geospatial Data Science hilft uns zu verstehen, wo etwas passiert – und warum genau dort.
Für Geospatial Data Science gibt es viele geeignete Tools. Dieses Tutorial konzentriert sich auf GeoPandas, ein Open-Source-Paket für die Arbeit mit Geodaten in Python.
GeoPandas erweitert die in pandas – dem Standardwerkzeug zur Arbeit mit DataFrames in Python – verwendeten Datentypen und ermöglicht räumliche Operationen auf Geometrien. Da GeoPandas auf pandas aufbaut – ebenso wie auf anderen beliebten Python-Paketen für Data Science, etwa matplotlib –, fällt Python-Profis der Einstieg in die GeoPandas-Syntax leicht.
GeoPandas in Python installieren
Um GeoPandas zu verwenden, musst du es wie jede andere Python-Bibliothek zuerst installieren.
Wichtig: GeoPandas stützt sich auf einen Stack aus Open-Source-Geobibliotheken, um sein volles Potenzial auszuschöpfen, darunter shapely, fiona, pyproj und rtree. Diese Abhängigkeiten müssen mitinstalliert werden, sonst funktioniert GeoPandas möglicherweise nicht wie erwartet.
Um es dir einfach zu machen, empfiehlt GeoPandas die Installation über den Paketmanager conda. Dafür brauchst du zunächst Anaconda. Eine Anleitung zur Installation und Nutzung von Anaconda findest du in unserem Tutorial.
Der Vorteil von conda: Für alle Betriebssysteme (Windows, Mac, Linux) gibt es vorkompilierte Binaries sämtlicher benötigter und optionaler Abhängigkeiten. So installierst du GeoPandas auf der Kommandozeile:
>>conda install geopandas
Alternativ kannst du GeoPandas mit pip, dem Standard-Paketinstaller in Python, installieren. Wie erwähnt, musst du dann ebenfalls die Abhängigkeiten bereitstellen. Falls du pip noch nicht kennst, empfehlen wir unser Pip-Python-Tutorial zum Paketmanagement. Der Befehl zur Installation mit pip lautet:
>>pip install geopandas
Falls bei der Installation Probleme auftreten, hilft dir die Dokumentation weiter.
Nach der Installation kannst du GeoPandas direkt verwenden, indem du es in deine Python-Umgebung importierst. Üblicherweise wird GeoPandas mit dem Alias gpd importiert.
import geopandas as gpd
Grundlegende Operationen mit GeoPandas
In diesem Abschnitt schauen wir uns die wichtigsten Basisoperationen in GeoPandas an. Dabei führen wir zentrale Konzepte der Geodatenanalyse ein, darunter Typen räumlicher Daten, Datenformate und Koordinatenreferenzsysteme (CRS).
Räumliche Daten lesen und schreiben
So wie pandas Eingabedaten benötigt, um sie in einen pandas DataFrame zu verwandeln, liest GeoPandas räumliche Eingabedaten ein und konvertiert sie in ein sogenanntes GeoDataFrame.
Bevor wir auf die zahlreichen räumlichen Dateitypen eingehen, die GeoPandas lesen kann, ist es wichtig, die verschiedenen Arten räumlicher Daten zu unterscheiden. Der Datentyp bestimmt, mit welchen Tools wir analysieren und wie wir visualisieren.
Grundsätzlich gibt es zwei Haupttypen räumlicher Daten:
- Vektordaten. Sie beschreiben geografische Objekte auf der Erde durch diskrete Geometrien, nämlich:
- Punkt. Einzelne Orte wie ein Gebäude oder ein Auto mit X- und Y-Koordinaten.
- Linie. Eine Folge verbundener Punkte, die z. B. Straßen oder Flüsse beschreibt.
- Polygon. Durch eine geschlossene Linie begrenzte Fläche, etwa die Außengrenzen eines Landes. Besteht ein Objekt aus mehreren Geometrien, sprechen wir von einem MultiPolygon.
- Rasterdaten. Sie repräsentieren die Welt als kontinuierliche Oberfläche in einem Raster, ähnlich wie die Pixel eines Bildes. Jedes Rasterelement kann einen kontinuierlichen Wert (z. B. Höhe) oder eine kategoriale Klasse (z. B. Landbedeckung) enthalten. Klassische Beispiele sind Höhendaten oder Satellitenbilder.

Quelle: Humboldt State University
Sowohl Vektor- als auch Rasterdaten werden in der Regel von nicht-räumlichen Daten begleitet, den Attributen. Räumliche Datensätze können beliebig viele zusätzliche Attribute zur Ortsinformation enthalten. Beispielsweise lässt sich zum Standort einer Schule der Name, die Schülerzahl oder die Adresse hinterlegen.
GeoPandas ist für Vektordaten ausgelegt, kann aber mit anderen Python-Paketen wie rasterio leicht für Rasterdaten kombiniert werden. Zum Einlesen räumlicher Daten stellt GeoPandas die Funktion geopandas.read_file() bereit. Diese leistungsfähige Funktion unterstützt automatisch die meisten vektorbasierten Formate.
Zu den gängigsten Vektorformaten gehören:
- Shapefile. Der Branchenstandard und das am weitesten verbreitete Vektorformat. Es besteht aus drei Dateien, die meist gemeinsam als ZIP geliefert werden:
- Die Datei .shp enthält die Geometrien.
- Die Datei .dbf speichert die Attribute je Geometrie,
- Die Datei .shx (Shape-Index) verknüpft Attribute und Geometrien.
- GeoJSON. Ein neueres Geodatenformat (seit 2016). Im Gegensatz zum Shapefile ist GeoJSON eine einzelne Datei und dadurch einfacher zu handhaben.
In den folgenden Beispielen nutzen wir geopandas.read_file(), um eine auf GitHub gehostete GeoJSON-Datei mit Geodaten zu den Bezirken der Stadt Barcelona zu laden.
url = 'https://raw.githubusercontent.com/jcanalesluna/bcn-geodata/master/districtes/districtes.geojson'
districts = gpd.read_file(url)
districts

Gleich kommen wir auf diesen Datensatz zurück. Zuerst solltest du wissen, wie man ein GeoDataFrame wieder in eine Datei schreibt. Das ist sehr einfach: Mit GeoDataFrame.to_file() erstellst du eine Datei mit den Geometriedaten. Standardmäßig ist das Format ein Shapefile, über den Parameter "driver" kannst du es ändern.
Zum Beispiel speicherst du das Bezirks-GeoDataFrame als GeoJSON-Datei:
districts.to_file("districts.geojson", driver="GeoJSON")
GeoDataFrames erkunden
Dir ist vielleicht aufgefallen, dass das GeoDataFrame im vorherigen Abschnitt einem klassischen pandas DataFrame ähnelt. Das ist logisch: GeoDataFrame ist eine Unterklasse von pandas.DataFrame und erbt daher viele Methoden und Attribute. Neu ist, dass ein GeoDataFrame Geometriespalten (GeoSeries) speichern und räumliche Operationen ausführen kann.
Die Geometriespalte kann jeden Vektordatentyp enthalten, also Punkte, Linien und Polygone. Wichtig ist außerdem: Ein GeoDataFrame kann mehrere GeoSeries besitzen, aber nur eine Spalte ist die aktive Geometrie. Alle räumlichen Operationen beziehen sich auf diese aktive Spalte.

Quelle: GeoPandas
Ein weiteres wichtiges Merkmal: Jede GeoSeries bringt CRS-Informationen mit. Das CRS sagt GeoPandas, wo die Koordinaten auf der Erde liegen – essenziell für jede räumliche Analyse. Möchtest du etwa zwei Geodatensätze kombinieren, müssen sie im selben CRS vorliegen. Andernfalls erhältst du nicht die erwarteten Ergebnisse.
Es gibt zwei Hauptkategorien von CRS:
- Geografische Koordinaten. Sie definieren eine globale Position in Gradangaben von Breite und Länge relativ zum Äquator und Nullmeridian. Damit lassen sich Orte weltweit eindeutig angeben, zum Beispiel in GPS. Das populärste CRS ist EPSG:4326, auch WGS84 genannt.
- Projizierte Koordinaten. Die Erde ist rund, wird aber meist auf zweidimensionalen Karten dargestellt. Projizierte Koordinaten geben Lagen in X- und Y-Richtung an und erlauben damit Längeneinheiten wie Meter statt Grad – das macht viele Analysen praktischer und genauer. Der Übergang von der dreidimensionalen Erde auf eine zweidimensionale Karte verursacht jedoch Verzerrungen. Deshalb existieren verschiedene Projektionen, oft haben Länder ein standardisiertes projiziertes CRS für ihre Geografie.
Es gibt noch viel mehr zu CRS, das sprengt aber den Rahmen dieses Tutorials. Eine hervorragende Ressource mit weiteren Infos und Praxisbeispielen ist unser Kurs Working with Geospatial Data in Python.
In GeoPandas sind die CRS-Informationen im Attribut crs gespeichert:
districts.crs

Das GeoDataFrame districts verwendet geografische Koordinaten (EPSG:4326). Für Berechnungen in Metern wollen wir jedoch projizierte Koordinaten. Wir transformieren daher nach EPSG:2062, dem Standard für Spanien. Das erledigt die Methode Geopandas.to_crs().
districts.to_crs(epsg=2062, inplace=True)
districts.crs

Mit dem passenden projizierten CRS können wir nun die Attribute von GeoDataFrames erkunden.
Attribute eines räumlichen Datensatzes erkunden
GeoPandas erbt zahlreiche nützliche Methoden und Attribute aus dem Paket shapely. Vier davon schauen wir uns an.
Area
Das Attribut area gibt die Fläche einer Geometrie zurück. Wir speichern die resultierende Fläche (umgerechnet in km²) in einer neuen Spalte:
districts['area'] = districts.area / 1000000
districts
Centroid
Das Attribut centroid liefert den Mittelpunkt einer Geometrie. Wir fügen ihn als neue Geometriespalte hinzu.
districts['centroid']=districts.centroid
districts
Boundary
Das Attribut boundary gibt die Begrenzung eines Polygons zurück.
districts['boundary']=districts.boundary
Distance
Die Methode distance liefert die minimale Entfernung von einer Geometrie zu einem Ort. Angenommen, wir möchten die Entfernung von der berühmten Kirche Sagrada Família im Bezirk Eixample zu den Zentroiden aller Bezirke Barcelonas berechnen und die Werte (in Kilometern) als neue Spalte hinzufügen.

Die Sagrada Família. Quelle: Wikipedia
Zuerst erstellen wir mit der shapely-Funktion Point() einen Punkt aus den gewünschten Koordinaten (du findest sie leicht in Google Maps), wandeln ihn in eine GeoSeries mit dem richtigen CRS um und nutzen dann GeoPandas.distance():
from shapely.geometry import Point
sagrada_fam = Point(2.1743680500855005, 41.403656946781304)
sagrada_fam = gpd.GeoSeries(sagrada_fam, crs=4326)
sagrada_fam= sagrada_fam.to_crs(epsg=2062)
districts['sagrada_fam_dist'] = [float(sagrada_fam.distance(centroid)) / 1000 for centroid in districts.centroid]
Der resultierende Datensatz nach den oben durchgeführten räumlichen Operationen sieht so aus:

Plotten mit GeoPandas
Die durchgeführten räumlichen Operationen liefern wertvolle Erkenntnisse. Noch aussagekräftiger wird die Analyse, wenn du die Geometrien im Raum visualisierst. Zum Glück ist ein GeoPandas-Plot schnell erstellt: Du rufst einfach GeoDataFrame.plot() auf, das auf Python’s matplotlib basiert.
Starten wir mit einer einfachen Visualisierung der Bezirke Barcelonas.
ax= districts.plot(figsize=(10,6))

Wir machen den GeoPandas-Plot informativer, indem wir die Bezirke einfärben. Mit legend=True fügst du eine Legende hinzu, die die Farben erklärt.
ax= districts.plot(column=district_name', figsize=(10,6), edgecolor='black', legend=True)

Zum Schluss ergänzen wir die Zentroiden der Bezirke und die Sagrada Família auf unserer Karte sowie einen Titel. Um die Darstellung noch ansprechender zu machen, nutzen wir das praktische Paket contextily, um eine Kachelkarte der Stadt Barcelona als Hintergrund hinzuzufügen.
import contextily
ax= districts.plot(column='district_name', figsize=(12,6), alpha=0.5, legend=True)
districts["centroid"].plot(ax=ax, color="green")
sagrada_fam.plot(ax=ax,color='black', marker='+')
contextily.add_basemap(ax, crs=districts.crs.to_string())
plt.title('A Beautiful Map of Barcelona')
plt.axis('off')
plt.show()

Ziemlich cool, oder? Es gibt noch viele Möglichkeiten, räumliche Visualisierungen zu veredeln. Unser Kurs Visualizing Spatial Data With Python hilft dir, deine Visualisierungskompetenz weiter auszubauen.
Räumliche Beziehungen mit GeoPandas
Ein Kernthema bei Geodaten ist ihr räumliches Verhältnis zueinander. GeoPandas nutzt die Stärken von pandas und shapely, um vielfältige räumliche Verknüpfungen zwischen Datensätzen herzustellen. In diesem Abschnitt behandeln wir einige der gängigsten Operationen.
Attribut-Joins
In pandas gibt es zwei Wege, Datensätze zu kombinieren: Attribut-Joins und räumliche Joins.
Attribut-Joins verknüpfen zwei GeoDataFrames über nicht-geometrische Variablen – genau wie reguläre Joins in pandas. Dafür verwendest du die Standardmethode pandas.merge(). Wenn du mehr über Joins in pandas erfahren willst, sieh dir unser Tutorial zu Joins in pandas an.
Zum Beispiel könnten wir unser GeoDataFrame mit den Bevölkerungsdaten von Barcelona für 2022 anreichern.
pop =pd.read_csv('poblacion_barna_2022.csv', usecols=['Nom_Districte','Nombre'])
pop = pd.DataFrame(pop.groupby('Nom_Districte')['Nombre'].sum()).reset_index()
pop.columns=['district_name','population_22']
districts = districts.merge(pop)
districtsv
Räumliche Joins
Räumliche Joins hingegen führen zwei GeoDataFrames basierend auf ihren räumlichen Beziehungen zusammen.
Beispiel: Wir wollen die Bezirke identifizieren, in denen sich die Fahrradwege Barcelonas befinden.
url = 'https://opendata-ajuntament.barcelona.cat/resources/bcn/CarrilsBici/CARRIL_BICI.geojson'
bike_lane = gpd.read_file(url)
bike_lane = bike_lane.loc[:,['ID','geometry']]
bike_lane.to_crs(epsg=2062, inplace=True)


In GeoPandas führst du räumliche Joins mit der Funktion sjoin() aus. Zuerst gibst du das GeoDataFrame an, das angereichert werden soll, danach das GeoDataFrame mit den anzufügenden Informationen. Anschließend legst du die Join-Art fest. Über den Parameter "predicate" definierst du schließlich, welche räumliche Beziehung zum Abgleich verwendet wird, z. B. "intersects", "contains" oder "within".
In unserem Beispiel nutzen wir das Prädikat "intersects". Zwei Geometrien schneiden sich, wenn sie einen Rand- oder Innenpunkt gemeinsam haben.
lanes_districts = gpd.sjoin(districts, bike_lane, how='inner', predicate='intersects')
lanes_districts

Beachte: Das resultierende GeoDataFrame hat mehr Zeilen als das GeoDataFrame bike_lane. Das liegt daran, dass ein Fahrradweg in mehreren Bezirken liegen kann.
Zum Schluss gruppieren wir den Datensatz und zählen die Fahrradwege pro Bezirk:
lanes_districts.groupby('district_name').size()
GeoPandas-Overlay-Operationen
Überlagerungen (Overlays) erlauben es, zwei GeoDataFrames mit Polygon- oder MultiPolygon-Geometrien zu vergleichen und daraus ein neues GeoDataFrame mit den geometrischen Schnittmengen und zusammengeführten Eigenschaften zu erstellen. Die folgende Grafik zeigt die verschiedenen Möglichkeiten:

Quelle: GeoPandas
Stell dir vor, der Stadtrat von Barcelona möchte neue Parks anlegen, um die Luftqualität zu verbessern und das Gemeinwohl zu fördern. Die erste Idee: große, runde Parks im Umkreis von 500 Metern um das Zentrum jedes Bezirks. Das simulieren wir, indem wir einen Buffer um die Zentroiden aller Bezirke bilden.
parks = gpd.GeoDataFrame(districts.centroid.buffer(500), geometry=0)
parks.plot()

Jetzt können wir Overlay-Operationen anwenden. Möchten wir beispielsweise nur die Bezirksflächen sehen, in denen die Parks lägen, nutzen wir GeoPandas.overlay() mit:
parks_intersection = districts.overlay(parks, how='intersection')
ax = parks_intersection.plot(alpha=0.5, edgecolor='black', column='district_name')

Oder wir wollen die Bezirke ohne die von den geplanten Parks eingenommene Fläche sehen – dann ändern wir den Parameter "how" entsprechend:
parks_difference = districts.overlay(parks, how='difference')
ax = parks_difference.plot(alpha=0.5, edgecolor='black', column='district_name')

Fazit
Wir hoffen, dir hat dieses GeoPandas-Tutorial gefallen. Räumliche Analyse gehört zu den spannendsten Bereichen der Data Science und bietet unzählige Möglichkeiten, Analysen mit ortsbezogenen Informationen zu bereichern. Es gibt viele Tools für räumliche Analysen, aber wenn du bereits mit Python arbeitest, ist GeoPandas ein idealer Einstieg.
Du willst beim Thema Geodaten dranbleiben? Wir haben das Richtige für dich. Schau dir diese Materialien an und bring deine Geokompetenz aufs nächste Level:
GeoPandas FAQs
What is geospatial data analysis?
Geospatial Data Science ist ein Teilgebiet der Data Science, das mithilfe räumlicher Algorithmen und Analysetechniken Informationen aus Geodaten gewinnt.
What is GeoPandas?
GeoPandas ist ein Open-Source-Projekt, das die Arbeit mit Geodaten in Python einfacher macht.
What is the difference between pandas and GeoPandas?
GeoPandas erweitert die in pandas verwendeten Datentypen, um räumliche Operationen auf geometrischen Typen zu ermöglichen. GeoPandas nutzt pandas DataFrames, um das sogenannte GeoDataFrame zu erstellen.



