Bij GIS (geographic information system) analyses werk je met ruimtelijke data. Ruimtelijke data kan opgebouwd zijn uit bijvoorbeeld punten, lijnen of vormen. De standaard Python datatypes zijn onvoldoende geschikt om handig met ruimtelijke data te kunnen werken. Package Shapely biedt een uitkomst doordat je hiermee met specifieke datatypes kunt werken voor de verschillende soorten ruimtelijke objecten.
In deze blog gaan we in op:
- Shapely installeren
- Ruimtelijke objecten
- Object Point
- Object LineString
- Object Polygon
Ook interessant: een overzicht van verschillende Python GIS packages
Shapely tutorial: Python GIS tutorial met Shapely, Geopandas, en Folium
Shapely installeren
Package Shapely is niet standaard onderdeel van een Python installatie, je zult het dus zelf moeten installeren. Je kunt het met pip installeren: pip install shapely. Wanneer je Anaconda gebruikt dien je gebruik te maken van het conda-forge channel: conda-forge install shapely. Zodra je het package geïnstalleerd hebt kun moet je het importeren voordat je het in je code kunt gebruiken: dit doe je met de regel "import shapely".
Ruimtelijke objecten
Shapely biedt meerdere soorten geometrische objecten waarmee gewerkt kan worden. Onderstaande afbeelding toont een voorbeeld van een punt, lijn en vorm. Deze objecten heten in Shapely respectievelijk Point, LineString en Polygon. Dit zijn in de praktijk de meest gebruikte vormen, maar weet dat Shapely nog meer objecten aanbiedt zoals een MultiPoint.
De verschillende ruimtelijke objecten (Point, Linestring, etc.) zijn allemaal opgebouwd uit ruimtelijke coördinaten. Deze coördinaten worden veelal in het datatype tuple gespecificeerd.
Verder hebben de ruimtelijke objecten methoden en attributen waarmee je bijvoorbeeld het volgende kunt doen:
- Berekenen van bijvoorbeeld oppervlaktes en lengtes
- Verrichten van geometrische operaties om bijvoorbeeld ruimtelijke overeenkomsten tussen vormen aan te tonen
Object Point
Het eerste ruimtelijke object vanuit Shapely wat we bekijken is Point. Dit is een ruimtelijk punt wat in ieder geval een x- en y-coördinaat moet bevatten. Denk hierbij bijvoorbeeld aan de lengte- en breedte-coördinaten van een stadscentrum.
Aanmaken van een Point object
In onderstaande code importeren we vanuit de Shapely module geometry het object Point. Vervolgens gebruiken we dit in variabele point1, en geven dit twee coördinaten. Tot slot bekijken we de inhoud van point1, we zien een visuele weergave van het punt.
%matplotlib inline
from shapely.geometry import Point
point1 = Point(5, 10)
point1
Met standaard functie type() zien we dat dit een specifiek datatype oplevert.
type(point1)
shapely.geometry.point.Point
Methoden en attributen
Vanwege het specifieke datatype kunnen we specifieke methoden en attributen gebruiken. Kijk in de documentatie voor alle mogelijkheden.
Het soort ruimtelijke object kan als attribuut bekeken worden.
point1.geom_type
'Point'
De coördinaten kunnen verkregen worden.
point1.xy
(array('d', [5.0]), array('d', [10.0]))
Met een methode kan gemakkelijk de afstand tussen punten berekend worden.
point1 = Point(5, 10)
point2 = Point(5.5, -10.5)
print(point1.distance(point2))
20.506096654409877
Object LineString
We weten nu dat een Point een punt is wat uit een x- en y-coördinaat bestaat. Het volgende Shapely object wat we bekijken heet LineString. Dit stelt een lijn voor, opgebouwd uit een verzameling punten. Denk hierbij bijvoorbeeld aan de punten die een treinspoor beschrijven.
Aanmaken van een LineString object
In onderstaande code importeren we vanuit de Shapely module geometry het object LineString. Vervolgens gebruiken we dit in variabele line, en geven 3 punten op in tuple formaat. Tot slot bekijken we de inhoud van variabele line, we zien een visuele weergave van de lijn.
from shapely.geometry import LineString
line = LineString([(5, 10), (10, -10.5), (100, -30.5)])
line
Methoden en attributen
Ook een LineString object heeft net als een Point specifieke methoden en attributen die gebruikt kunnen worden.
Op dezelfde manier als bij een Point kunnen de coördinaten verkregen worden.
line.xy
(array('d', [5.0, 10.0, 100.0]), array('d', [10.0, -10.5, -30.5]))
De totale lengte van de lijn kan gemakkelijk berekend worden.
line_length = line.length
line_length
113.29639241893807
En ook het centerpunt is eenvoudig te vinden. Dit levert een Point object op.
line_centroid = line.centroid
print(line_centroid.geom_type)
line_centroid.xy
Point
(array('d', [46.15333682488995]), array('d', [-16.72852780429519]))
Object Polygon
Naast objecten Point en LineString is Polygon een ander veelgebruikt ruimtelijk object. Dit stelt een vorm voor. Denk hierbij bijvoorbeeld aan de vormen van landen op een kaart. Een vorm is opgebouwd uit een verzameling punten die onderling verbonden zijn.
Aanmaken van een Polygon object
In onderstaande code importeren we vanuit de Shapely module geometry het object Polygon. Vervolgens gebruiken we dit in variabele poly, en geven 3 punten op in tuple formaat. Tot slot bekijken we de inhoud van variabele poly, we zien een visuele weergave van de ruimtelijke vorm.
from shapely.geometry import Polygon
poly = Polygon([(2.2, 4.2), (7.2, -25.1), (30, -2.456)])
poly
Een vorm kan volledig gevuld zijn zoals in bovenstaand voorbeeld. Het kan ook gaten bevatten.
exterior = [(2.2, 4.2), (7.2, -25.1), (30, -2.456)]
hole = [[(4, 2), (8, -20), (25, -3)]]
poly_with_hole = Polygon(shell=exterior, holes=hole)
poly_with_hole
Methoden en attributen
Ook een Polygon object heeft net als een Point en LineString specifieke methoden en attributen die gebruikt kunnen worden.
De oppervlakte van een vorm kan bepaald worden.
poly = Polygon([(2.2, 4.2), (7.2, -25.1), (30, -2.456)])
poly.area
390.63000000000005
Het buitenkader kan getoond worden.
poly_ext = poly.exterior
poly_ext
Hiervan is vervolgens weer de lengte van de omtrek te berekenen.
poly_ext.length
90.44321117704156
Wat je moet onthouden
Package Shapely brengt je in staat om binnen Python met ruimtelijke objecten zoals een Point (punt), LineString (lijn) of Polygon (vorm) te werken. Dit komt goed van pas bij GIS analyses. Doordat de Shapely objecten specifieke methoden en attributen bevatten kunnen veelvoorkomende handelingen gemakkelijk verricht worden. Denk hierbij aan het verkrijgen van coördinaten, bepalen van centerpunten, berekenen van oppervlaktes en lengtes. Naast de hier getoonde voorbeelden is er nog een breed scala aan verdere mogelijkheden. Kijk hiervoor in de documentatie.
Wil je meer leren over werken met ruimtelijke data en het doen van GIS analyses met Python? Schrijf je dan in voor onze Python cursus voor data science, onze machine learning training, of voor onze data science opleiding en leer met vertrouwen te programmeren en analyseren in Python. Of neem contact op over onze in-company GIS training.
Download één van onze opleidingsbrochures voor meer informatie
Peter is een ervaren data scientist en python trainer. Na zijn studie aan de Technische Universiteit Delft heeft hij zich altijd bezig gehouden met data en diverse programmeertalen. Peter heeft veel data analyses uitgevoerd en processen geautomatiseerd met Python in productieomgevingen.