python-gis-shapely-tutorial

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”.

Wil jij leren werken met GIS packages in Python? Bekijk de inhoud van onze GIS training of neem contact op voor meer informatie.

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.

python gis met python shapely

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.

In [1]:
%matplotlib inline
from shapely.geometry import Point

point1 = Point(5, 10)
point1
Out[1]:

Met standaard functie type() zien we dat dit een specifiek datatype oplevert.

In [2]:
type(point1)
Out[2]:
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.

In [3]:
point1.geom_type
Out[3]:
'Point'

De coördinaten kunnen verkregen worden.

In [4]:
point1.xy
Out[4]:
(array('d', [5.0]), array('d', [10.0]))

Met een methode kan gemakkelijk de afstand tussen punten berekend worden.

In [5]:
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.

In [6]:
from shapely.geometry import LineString

line = LineString([(5, 10), (10, -10.5), (100, -30.5)])
line
Out[6]:

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.

In [7]:
line.xy
Out[7]:
(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.

In [8]:
line_length = line.length
line_length
Out[8]:
113.29639241893807

En ook het centerpunt is eenvoudig te vinden. Dit levert een Point object op.

In [9]:
line_centroid = line.centroid
print(line_centroid.geom_type)
line_centroid.xy
Point
Out[9]:
(array('d', [46.15333682488995]), array('d', [-16.72852780429519]))
Wil jij leren werken met GIS packages in Python? Bekijk de inhoud van onze GIS training of neem contact op voor meer informatie.

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.

In [10]:
from shapely.geometry import Polygon

poly = Polygon([(2.2, 4.2), (7.2, -25.1), (30, -2.456)])
poly
Out[10]:

Een vorm kan volledig gevuld zijn zoals in bovenstaand voorbeeld. Het kan ook gaten bevatten.

In [11]:
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
Out[11]:

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.

In [12]:
poly = Polygon([(2.2, 4.2), (7.2, -25.1), (30, -2.456)])
poly.area
Out[12]:
390.63000000000005

Het buitenkader kan getoond worden.

In [13]:
poly_ext = poly.exterior
poly_ext
Out[13]:

Hiervan is vervolgens weer de lengte van de omtrek te berekenen.

In [14]:
poly_ext.length
Out[14]:
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

by: