Een aanzienlijk deel van de data die elke dag wordt gegenereerd, is van nature ruimtelijk. Van Earth Observation- en GPS-gegevens tot data in allerlei soorten kaarten: ruimtelijke data –ook wel geospatiale data of geografische informatie genoemd– zijn gegevens waarbij aan elk record een specifieke locatie is gekoppeld.
Elk ruimtelijk datapunt is op een kaart te lokaliseren. Dit kan met behulp van een coördinaatreferentiesysteem, bijvoorbeeld geografische coördinaten, gebaseerd op de gebruikelijke breedte- en lengtegraden waarmee we aangeven waar iets zich op de wereldbol bevindt. Zo kunnen we ruimtelijke relaties tussen de data bestuderen.
De echte kracht van geospatiale data zit echter in het combineren van zowel de data zelf als hun locatie, waardoor je tal van mogelijkheden krijgt voor geavanceerde analyses. De zogenaamde geospatiale data science is een deelgebied van data science dat zich richt op het extraheren van informatie uit geospatiale data door het inzetten van ruimtelijke algoritmen en analytische technieken, zoals machine learning en deep learning. Met andere woorden: geospatiale data science helpt ons begrijpen waar dingen gebeuren en waarom ze daar gebeuren.
Er zijn veel tools geschikt voor geospatiale data science. Deze tutorial richt zich op GeoPandas, een open-sourcepakket om met geospatiale data in Python te werken.
GeoPandas breidt de datatypes uit die door pandas worden gebruikt –de standaardtool voor het manipuleren van dataframes in Python– zodat ruimtelijke operaties op geometrische types mogelijk worden. Omdat GeoPandas is gebouwd op pandas –en op andere populaire Python-pakketten voor data science, zoals matplotlib–, is het voor dataprofessionals die Python gebruiken heel eenvoudig om vloeiend te raken met de GeoPandas-syntaxis.
GeoPandas voor Python installeren
Om GeoPandas in Python te gebruiken, moet je het eerst installeren, net als elke andere Python-bibliotheek.
Belangrijk om te weten is dat GeoPandas afhankelijk is van een stapel open-source geospatiale bibliotheken om zijn volledige ruimtelijke potentieel te leveren, waaronder shapely, fiona, pyproj en rtree. Je moet ervoor zorgen dat je al deze dependencies installeert, anders werkt GeoPandas mogelijk niet zoals verwacht.
Om gedoe te voorkomen, raadt GeoPandas aan de bibliotheek te installeren met de conda-pakketmanager. Dat betekent dat je eerst Anaconda moet installeren. Voor een handleiding over hoe je Anaconda installeert en gebruikt, bekijk onze tutorial.
Het voordeel van conda is dat het vooraf gebouwde binaries levert voor alle vereiste en optionele dependencies van GeoPandas voor alle besturingssystemen (Windows, Mac, Linux). Om GeoPandas via de command line te installeren:
>>conda install geopandas
Je kunt Anaconda ook met pip installeren, de standaard pakketinstaller in Python. Zoals al genoemd, moet je dan ook de vereiste dependencies installeren. Als je niet vertrouwd bent met pip, raden we je aan onze Pip Python Tutorial voor pakketbeheer te lezen. De instructie die je moet uitvoeren om GeoPandas met pip te installeren is:
>>pip install geopandas
Als je problemen ondervindt tijdens de installatie van GeoPandas, raadpleeg dan in elk geval de documentatie voor meer informatie.
Zodra je het pakket hebt geïnstalleerd, kun je GeoPandas gaan gebruiken. Importeer het in je Python-omgeving. Let op: het is heel gebruikelijk om GeoPandas te importeren met het alias gpd.
import geopandas as gpd
Basisbewerkingen met GeoPandas
In deze sectie behandelen we de meest basale bewerkingen die je met GeoPandas kunt doen. Daarbij maken we je wegwijs in enkele cruciale concepten in georuimtelijke analyse, waaronder typen ruimtelijke data, ruimtelijke dataformaten en coördinatenreferentiesystemen (CRS).
Ruimtelijke data lezen en schrijven
Net zoals pandas invoergegevens nodig heeft om om te zetten naar een pandas-dataframe, leest GeoPandas invoer (ruimtelijke) data en zet die om naar de zogeheten GeoDataFrame.
Voordat we ingaan op de verschillende ruimtelijke bestandsindelingen die GeoPandas kan lezen, is het belangrijk om de verschillende typen ruimtelijke data te onderscheiden. Het type data waarmee we werken, bepaalt welke tools we moeten gebruiken om de data te analyseren en vervolgens te visualiseren.
In grote lijnen zijn er twee hoofdtypen ruimtelijke data:
- Vectordata. Beschrijft de kenmerken van geografische locaties op aarde met behulp van discrete geometrieën, namelijk:
- Punt. Individuele locaties, zoals een gebouw of een auto, met X- en Y-coördinaten.
- Lijn. Een reeks verbonden punten die dingen beschrijft als wegen of beken.
- Polygoon. Gevormd door een gesloten lijn die een gebied omcirkelt, zoals de grenzen van een land. Wanneer één feature uit meerdere geometrieën bestaat, noemen we dat bovendien een MultiPolygon.
- Rasterdata. Codeert de wereld als een continu oppervlak dat wordt weergegeven door een raster, zoals de pixels van een afbeelding. Elk onderdeel van het raster kan ofwel een continue waarde hebben (zoals een hoogtewaarde) of een categorische classificatie (zoals landbedekkingsklassen). Klassieke voorbeelden zijn hoogtegegevens of satellietbeelden.

Bron: Humboldt State University
Zowel vector- als rasterdata gaan meestal vergezeld van niet-ruimtelijke data, ook wel attributen genoemd. Ruimtelijke data kunnen een willekeurig aantal aanvullende attributen bevatten naast de informatie over de locatie. De locatie van een school kan bijvoorbeeld worden gekoppeld aan de naam van de school, het aantal leerlingen of het adres.
GeoPandas is ontworpen om met vectordata te werken, al kan het eenvoudig samenwerken met andere Python-pakketten om rasterdata te verwerken, zoals rasterio. Om ruimtelijke data te lezen, biedt GeoPandas de functie geopandas.read_file(). Deze krachtige functie kan automatisch de meeste voorkomende vectorgebaseerde ruimtelijke data lezen.
Enkele van de meest gangbare vectordataformaten zijn:
- Shapefile. Als industriestandaard zijn shapefiles het meest voorkomende vectordataformaat. Het bestaat uit drie bestanden die meestal in een zip-bestand worden aangeleverd:
- Het .shp-bestand bevat de vormgeometrie.
- Het .dbf-bestand bevat attributen voor elke geometrie,
- Het .shx-bestand of shape-indexbestand helpt de attributen aan de vormen te koppelen.
- GeoJSON. Dit is een nieuwer formaat voor geospatiale data, uitgebracht in 2016. In tegenstelling tot shapefiles is GeoJSON één bestand, wat het werken ermee eenvoudiger maakt.
In de volgende voorbeelden gebruiken we de functie geopandas.read_file() om een GeoJSON-bestand te lezen dat is gehost op GitHub en geospatiale data bevat over de verschillende districten van de stad Barcelona.
url = 'https://raw.githubusercontent.com/jcanalesluna/bcn-geodata/master/districtes/districtes.geojson'
districts = gpd.read_file(url)
districts

We komen zo terug op deze dataset, maar eerst moet je weten hoe je een GeoDataFrame weer naar een bestand schrijft. Dat is vrij eenvoudig. Je gebruikt GeoDataFrame.to_file() om een bestand met de ruimtelijke data te maken. Standaard is het formaat van het nieuwe document een shapefile, maar je kunt dit wijzigen met de parameter “driver”.
Je kunt bijvoorbeeld het GeoDataFrame met districten opslaan als een geoJSON-bestand:
districts.to_file("districts.geojson", driver="GeoJSON")
GeoDataFrames verkennen
Het zal je zijn opgevallen dat het GeoDataFrame in de vorige sectie lijkt op een traditioneel pandas-dataframe. Die gelijkenis is logisch, want GeoDataFrame is een subklasse van pandas.DataFrame. Dat betekent dat het veel methoden en attributen van een pandas-dataframe erft. Wat nieuw is in GeoDataFrame, is dat het geometriekolommen (ook wel GeoSeries genoemd) kan opslaan en ruimtelijke operaties kan uitvoeren.
De geometriekolom kan elk type vectordata bevatten, zoals punten, lijnen en polygonen. Verder is het belangrijk om te weten dat hoewel een GeoDataFrame meerdere GeoSeries kan hebben, slechts één kolom wordt beschouwd als de actieve geometrie, wat betekent dat alle ruimtelijke operaties op die kolom gebaseerd zullen zijn.

Bron: GeoPandas
Een ander belangrijk kenmerk van GeoDataFrames is dat elke GeoSeries bijbehorende CRS-informatie heeft. Deze CRS-informatie vertelt GeoPandas waar de coördinaten zich op aarde bevinden. Deze informatie is cruciaal voor ruimtelijke analyse. Als je bijvoorbeeld twee ruimtelijke datasets wilt combineren, moet je ervoor zorgen dat ze in hetzelfde CRS zijn uitgedrukt. Anders krijg je niet het verwachte resultaat.
Er zijn twee hoofdcategorieën CRS:
- Geografische coördinaten. Ze definiëren een globale positie in graden breedte en lengte ten opzichte van de evenaar en de nulmeridiaan. Met dit systeem kunnen we eenvoudig elke locatie op aarde specificeren. Het wordt veel gebruikt, bijvoorbeeld in GPS. Het populairste CRS is EPSG:4326, ook wel WGS84.
- Geprojecteerde coördinaten. Hoewel de aarde rond is, tonen we die meestal op een tweedimensionale kaart. Geprojecteerde coördinaten drukken locaties uit in X- en Y-dimensies, waardoor we met een lengtemaat zoals meters kunnen werken in plaats van graden. Dat maakt de analyse handiger en effectiever. Maar de overgang van de driedimensionale aarde naar een tweedimensionale kaart leidt onvermijdelijk tot vervormingen. Daarom zijn er verschillende benaderingen om geprojecteerde coördinaten te maken. Zo hebben veel landen een standaard geprojecteerd CRS aangenomen dat past bij hun specifieke geografie.
Er is veel meer te vertellen over CRS, maar dat valt buiten de scope van deze tutorial. Een uitstekend hulpmiddel voor extra informatie en praktische voorbeelden is onze cursus Working with Geospatial Data in Python.
In GeoPandas wordt de CRS-informatie opgeslagen in het crs-attribuut:
districts.crs

Het GeoDataFrame met districten is gekoppeld aan geografische coördinaten (EPSG: 4326), maar we willen het omzetten naar geprojecteerde coördinaten zodat we berekeningen in meters kunnen doen. Laten we het omzetten naar EPSG:2062, het standaard geprojecteerde CRS voor Spanje. Dat kan met de methode Geopandas.to_crs().
districts.to_crs(epsg=2062, inplace=True)
districts.crs

Nu we het juiste geprojecteerde CRS hebben ingesteld, zijn we klaar om de attributen van GeoDataFrames te verkennen.
De attributen van een ruimtelijke dataset verkennen
GeoPandas erft een aantal handige methoden en attributen van het shapely-pakket. We behandelen er vier.
Oppervlakte
Het area-attribuut geeft de berekende oppervlakte van een geometrie terug. We kunnen de resulterende oppervlakte (omgezet naar km2) in een nieuwe kolom opslaan:
districts['area'] = districts.area / 1000000
districts
Centroid
Het centroid-attribuut geeft het middelpunt van een geometrie terug. We kunnen het aan onze dataset toevoegen en zo een nieuwe geometriekolom maken.
districts['centroid']=districts.centroid
districts
Grens
Het boundary-attribuut geeft de omtrek van een polygoon.
districts['boundary']=districts.boundary
Afstand
De distance-methode geeft de minimale afstand van een geometrie tot een locatie. Stel dat we de afstand willen berekenen van de beroemde Sagrada Familia, gelegen in het district Eixample, tot de centroiden van elk district in Barcelona, en vervolgens de afstanden (in kilometers) toevoegen in een nieuwe kolom.

De Sagrada Familia. Bron: Wikipedia
Eerst moeten we een punt maken met de functie Point() van shapely met de gewenste coördinaten (die vind je eenvoudig op Google Maps), het omzetten naar een GeoSeries met het juiste CRS, en vervolgens de methode GeoPandas.distance() gebruiken:
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]
De resulterende datasets, na de voorgaande ruimtelijke bewerkingen, zien er zo uit:

Plotten met GeoPandas
De ruimtelijke bewerkingen die we hebben uitgevoerd, leveren waardevolle inzichten op voor onze studie. Maar je geometrieën in de ruimte visualiseren is een geweldige manier om je analyse te verbeteren. Gelukkig is een plot maken met GeoPandas supermakkelijk. Je hoeft alleen de functie GeoDataFrame.plot() aan te roepen, die is gebouwd op het Python-pakket matplotlib.
Laten we beginnen met een eenvoudige visualisatie van de districten van Barcelona.
ax= districts.plot(figsize=(10,6))

We kunnen onze GeoPandas-plot informatiever maken door elk district in te kleuren. Door legend op 'True' te zetten, wordt een legenda toegevoegd die helpt de kleuren te interpreteren.
ax= districts.plot(column=district_name', figsize=(10,6), edgecolor='black', legend=True)

Tot slot kunnen we de centroiden van de districten en de Sagrada Familia aan onze kaart toevoegen, evenals een titel. Ook kunnen we, om de plot aantrekkelijker te maken, het fijne pakket contextily gebruiken om een tegelkaart van de stad Barcelona toe te voegen.
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()

Gaaf, toch? Er is nog veel meer mogelijk om prachtige ruimtelijke visualisaties te maken. Onze cursus Visualizing Spatial Data With Python is een geweldige bron om je visualisatievaardigheden naar een hoger niveau te tillen.
Ruimtelijke relaties met GeoPandas
Een van de belangrijkste aspecten van geospatiale data is hoe ze ruimtelijk met elkaar samenhangen. GeoPandas benut de kracht van de pakketten pandas en shapely om allerlei ruimtelijke relaties tussen datasets uit te voeren. In deze sectie behandelen we enkele van de meest voorkomende bewerkingen.
Attribuutjoins
Er zijn twee manieren om datasets in pandas te combineren: attribuutjoins en ruimtelijke joins.
Met attribuutjoins kunnen we twee GeoDataFrames samenvoegen op basis van niet-geometrische variabelen, net als een gewone join in pandas. De manier om attribuutjoins uit te voeren is dan ook via de standaardmethode pandas.merge(). Als je meer wilt weten over joins in pandas, bekijk dan onze tutorial DataFrames samenvoegen in pandas.
Zo zou het interessant zijn om ons GeoDataFrame te verrijken met de bevolkingsgegevens van Barcelona in 2022.
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
Ruimtelijke joins
Ruimtelijke joins daarentegen maken het mogelijk om twee GeoDataFrames te combineren op basis van hun ruimtelijke relatie.
Zo willen we bijvoorbeeld de districten identificeren waarin de fietspaden in Barcelona liggen.
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 is de bewerking ruimtelijke join beschikbaar als de functie sjoin(). Het eerste argument dat we opgeven, is het GeoDataFrame waaraan we informatie willen toevoegen, en het tweede argument is het GeoDataFrame dat de informatie bevat die we willen toevoegen. Daarna moeten we het type join specificeren. Tot slot geeft de parameter “predicate” aan welke ruimtelijke relatie we willen gebruiken om beide datasets te matchen. Enkele van de meest voorkomende relaties zijn “intersects”, “contains” en “within”.
In ons voorbeeld gebruiken we de predicaat “intersects”. Twee geometrische objecten snijden elkaar als ze een grens- of binnenpunt gemeen hebben.
lanes_districts = gpd.sjoin(districts, bike_lane, how='inner', predicate='intersects')
lanes_districts

Let op dat het resulterende GeoDataFrame meer rijen heeft dan het GeoDataFrame bike_lane. Dat komt doordat een fietspad in meer dan één district kan liggen.
Tot slot kunnen we onze dataset groeperen om het aantal fietspaden per district te krijgen:
lanes_districts.groupby('district_name').size()
GeoPandas overlay-bewerkingen
Tot slot kun je met ruimtelijke overlays twee GeoDataFrames met polygoon- of multipolygoongeometrieën vergelijken en een nieuw GeoDataFrame maken met de nieuwe geometrieën die de ruimtelijke combinatie en samengevoegde eigenschappen weergeven. De afbeelding hieronder toont de verschillende mogelijkheden:

Bron: GeoPandas
Stel dat de gemeenteraad van Barcelona nieuwe wijkparken wil aanleggen om vervuiling aan te pakken en het welzijn van de gemeenschap te bevorderen. Een voorlopig idee is om grote, ronde parken te maken binnen 500 meter van het centrum van elk district. Dat kunnen we simuleren door een buffer te maken op basis van de centroid van elk district.
parks = gpd.GeoDataFrame(districts.centroid.buffer(500), geometry=0)
parks.plot()

Nu zijn we klaar om wat overlay-bewerkingen uit te voeren. Als we bijvoorbeeld alleen de gebieden van de districten willen zien waar de parken zouden komen, kunnen we de methode GeoPandas.overlay() gebruiken:
parks_intersection = districts.overlay(parks, how='intersection')
ax = parks_intersection.plot(alpha=0.5, edgecolor='black', column='district_name')

Of als we de districten willen zien zonder het gebied dat door de geplande parken wordt ingenomen, kunnen we de parameter “how” wijzigen om een andere overlay-bewerking uit te voeren.
parks_difference = districts.overlay(parks, how='difference')
ax = parks_difference.plot(alpha=0.5, edgecolor='black', column='district_name')

Conclusie
Hopelijk vond je deze GeoPandas-tutorial leuk. Ruimtelijke analyse is een van de coolste domeinen binnen data science en biedt eindeloze mogelijkheden om je analyses te verrijken met locatiegebonden informatie. Er zijn veel tools voor ruimtelijke analyse, maar als je al bekend bent met Python, is GeoPandas een geweldige plek om te beginnen.
Wil je verder met je georuimtelijke opleiding? Wij helpen je graag! Bekijk het volgende materiaal en word een geospatiale meester:
GeoPandas-veelgestelde vragen
Wat is georuimtelijke data-analyse?
Geospatiale data science is een deelgebied van data science dat zich richt op het extraheren van informatie uit geospatiale data door de kracht van ruimtelijke algoritmen en analytische technieken te benutten.
Wat is GeoPandas?
GeoPandas is een open-sourceproject om werken met geospatiale data in Python eenvoudiger te maken.
Wat is het verschil tussen pandas en GeoPandas?
GeoPandas breidt de datatypes uit die door pandas worden gebruikt, zodat ruimtelijke operaties op geometrische types mogelijk zijn. GeoPandas gebruikt pandas DataFrames om de zogeheten GeoDataFrame te maken.




