Afhandeling van geometrie

Naar punten, lijnen en polygonen die een ruimtelijk object weergeven wordt gewoonlijk verwezen als geometrieën. In QGIS worden zij weergegeven door de klasse QgsGeometry. Alle mogelijke typen geometrie worden netjes weergegeven op de pagina JTS discussion.

Soms is één geometrie in feite een verzameling van enkele (ééndelige) geometrieën. Een dergelijke geometrie wordt een geometrie met meerdere delen genoemd. Als het slechts één type eenvoudige geometrie bevat, noemen we het multi-punt, multi-lijn of multi-polygoon. Een land dat bijvoorbeeld bestaat uit meerdere eilanden kan worden weergegeven als een multi-polygoon.

De coördinaten van geometrieën kunnen in elk coördinaten referentiesysteem (CRS) staan. Bij het ophalen van objecten vanaf een laag, zullen de geassocieerde geometrieën in coördinaten in het CRS van de laag staan.

Construeren van geometrie

Er zijn verscheidene opties voor het maken van een geometrie:

  • uit coördinaten

    gPnt = QgsGeometry.fromPoint(QgsPoint(1,1))
    gLine = QgsGeometry.fromPolyline([QgsPoint(1, 1), QgsPoint(2, 2)])
    gPolygon = QgsGeometry.fromPolygon([[QgsPoint(1, 1), QgsPoint(2, 2), QgsPoint(2, 1)]])
    

    Coördinaten worden opgegeven met behulp van de klasse QgsPoint.

    Polylijnen (lijnen) worden weergegeven als een lijst met punten. Polygoon wordt weergegeven als een lijst van lineaire ringen (d.i. gesloten lijnen). De eerste ring is de buitenste ring (grens), optionele volgende ringen zijn gaten in de polygoon.

    Geometrieën die bestaan uit meerdere delen gaan een niveau verder: multi-punt is een lijst van punten, multi-lijnen zijn een lijst van lijnen en multi-polygoon is een lijst van polygonen.

  • uit bekende tekst (WKT)

    gem = QgsGeometry.fromWkt("POINT(3 4)")
    
  • uit bekende binaire (WKB)

    g = QgsGeometry()
    g.setWkbAndOwnership(wkb, len(wkb))
    

Toegang tot geometrie

Als eerste zou u het type geometrie moeten zoeken, de methode wkbType() is die om te gebruiken — het geeft een waarde uit de enumeratie QGis.WkbType terug

>>> gPnt.wkbType() == QGis.WKBPoint
True
>>> gLine.wkbType() == QGis.WKBLineString
True
>>> gPolygon.wkbType() == QGis.WKBPolygon
True
>>> gPolygon.wkbType() == QGis.WKBMultiPolygon
False

Als alternatief kan men de methode type() gebruiken die een waarde teruggeeft uit de enumeratie QGis.GeometryType. Er is ook een hulpfunctie isMultipart() om na te gaan of een geometrie uit meerdere delen bestaat of niet.

Voor elk type vector zijn er functies voor toegang om informatie uit de geometrie op te halen. Hoe deze te gebruiken

>>> gPnt.asPoint()
(1, 1)
>>> gLine.asPolyline()
[(1, 1), (2, 2)]
>>> gPolygon.asPolygon()
[[(1, 1), (2, 2), (2, 1), (1, 1)]]

Opmerking: de tuples (x,y) zijn geen echte tuples, zij zijn objecten QgsPoint, de waarden zijn toegankelijk met de methoden x() en y().

Voor meerdelige geometrieën zijn er soortgelijke functies voor toegang: asMultiPoint(), asMultiPolyline(), asMultiPolygon().

Predicaten en bewerking voor geometrieën

QGIS gebruikt de bibliotheek GEOS voor geavanceerde bewerkingen met geometrieën, zoals de predicaten voor geometrieën (contains(), intersects(), ...) en het instellen van bewerkingen (union(), difference(), ...). Het kan ook geometrische eigenschappen van geometrieën berekenen, zoals gebied (in het geval van polygonen) of lengten (voor polygonen en lijnen)

Hier is een klein voorbeeld dat het doorlopen van de objecten op een laag combineert met het uitvoeren van enkele geometrische berekeningen, gebaseerd op hun geometrieën.

# we assume that 'layer' is a polygon layer
features = layer.getFeatures()
for f in features:
  geom = f.geometry()
  print "Area:", geom.area()
  print "Perimeter:", geom.length()

Gebieden en perimeters gouden geen rekening met het CRS indien wordt berekend met behulp van deze methoden uit de klasse QgsGeometry. Voor een meer krachtige berekening van gebied en afstand, kan de klasse QgsDistanceArea worden gebruikt. Als projecties zijn uitgeschakeld, zullen berekeningen vlak zijn, anders zullen zij op de ellipsoïde worden uitgevoerd. Wanneer niet expliciet een ellipsoïde is ingesteld, worden parameters voor WGS84 gebruikt voor berekeningen.

d = QgsDistanceArea()
d.setProjectionsEnabled(True)

print "distance in meters: ", d.measureLine(QgsPoint(10,10),QgsPoint(11,11))

U kunt zoeken naar vele voorbeelden van algoritmen die zijn opgenomen in QGIS en die methoden gebruiken om vectorgegevens te analyseren en te transformeren. Hier zijn enkele koppelingen naar de code van sommige ervan.

Aanvullende informatie kan worden gevonden in de volgende bronnen: