Manipulation de la géométrie

Les points, lignes et polygones représentant un objet spatial sont couramment appelées des géométries. Dans QGIS, ils sont représentés par la classe QgsGeometry. Tous les types de géométrie sont admirablement présentés dans la page de discussion JTS.

Parfois, une entité correspond à une collection d’éléments géométriques simples (d’un seul tenant). Une telle géométrie est appelée multi-parties. Si elle ne contient qu’un seul type de géométrie, il s’agit de multi-points, de multi-lignes ou de multi-polygones. Par exemple, un pays constitué de plusieurs îles peut être représenté par un multi-polygone.

Les coordonnées des géométries peuvent être dans n’importe quel système de coordonnées de référence (SCR). Lorsqu’on accède aux entités d’une couche, les géométries correspondantes auront leurs coordonnées dans le SCR de la couche.

Construction de géométrie

Il existe plusieurs options pour créer une géométrie:

  • à partir des coordonnées

    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)]])
    

    Les coordonnées sont indiquées à l’aide de la classe QgsPoint.

    La polyligne (Linestring) est représentée par une succession de points. Le polygone est représenté par une succession de polylignes en anneaux (c’est-à-dire des polylignes fermées). Le premier anneau représente l’anneau externe (la limite), les potentiels anneaux ultérieures sont des trous dans le polygone.

    Les géométries multi-parties sont d’un niveau plus complexe: les multipoints sont une succession de points, les multilignes une succession de lignes et les multipolygones une succession de polygones.

  • depuis un Well-Known-Text (WKT)

    gem = QgsGeometry.fromWkt("POINT(3 4)")
    
  • depuis un Well-Known-Binary (WKB)

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

Accéder à la Géométrie

Vous devriez d’abord trouver le type de la géométrie en utilisant la méthode wkbType(). Elle renvoie la valeur depuis l’énumération QGis.WkbType

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

Une autre alternative réside dans l’utilisation de la méthode type() qui renvoie une valeur de la liste QGis.GeometryType. Il existe également une fonction isMultipart() pour vous aider à déterminer si une géométrie est multi-parties ou non.

Pour extraire l’information d’une géométrie il existe des fonctions d’accès pour chaque type de vecteur. Voici comment utiliser ces accès:

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

Note: les tuples (x,y) ne sont pas de vrais tuples, ce sont des objets QgsPoint, leurs valeurs sont accessibles avec les fonctions x() et y().

Pour les géométries multi-parties, il y a des fonctions accesseurs similaires: asMultiPoint(), asMultiPolyline(), asMultiPolygon().

Prédicats et opérations géométriques

QGIS utilise la bibliothèque GEOS pour les opérations avancées de géométrie telles que les prédicats (contains(), intersects(), ...) et les opérations d’ensemble (union(), difference(), ...). QGIS peut également réaliser des calculs sur les propriétés géométriques des géométries comme la surface (dans le cas des polygones) ou la longueur (polygones et lignes).

Voici un exemple succinct qui combine l’itération sur les entités d’une couche donnée et des calculs géométriques sur leur géométrie.

# 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()

Les calculs de surfaces et de périmètres ne prennent pas en compte le SCR lorsque qu’on utilise les méthodes de la classe QgsGeometry class. Pour réaliser des calculs plus précis sur les surfaces ou les distances, la classe QgsDistanceArea peut être utilisée. Si les projections sont désactivées, les calculs seront faits en mode planaire sinon, ils tiendront compte de l’ellipsoïde. Lorsqu’aucune ellipsoïde n’est définie explicitement, les paramètres WGS84 sont utilisés pour les calculs.

d = QgsDistanceArea()
d.setProjectionsEnabled(True)

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

Vous trouverez de nombreux exemples d’algorithmes inclus dans QGIS et utiliser ces méthodes pour analyser et modifier les données vectorielles. Voici des liens vers le code de quelques-uns.

Vous pouvez retrouver plus d’information dans les sources suivantes :