Outdated version of the documentation. Find the latest one here.

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:

  • from coordinates:

    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 un niveau plus complexe: les multipoints sont une succession de points, les multilignes une succession de lignes et les multipolygones une succession de polygones.

  • from well-known text (WKT):

    gem = QgsGeometry.fromWkt("POINT (3 4)")
    
  • from well-known binary (WKB):

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

Accéder à la Géométrie

First, you should find out geometry type, wkbType() method is the one to use — it returns a value from QGis.WkbType enumeration:

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

To extract information from geometry there are accessor functions for every vector type. How to use accessors:

>>> 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 uses GEOS library for advanced geometry operations such as geometry predicates (contains(), intersects(), ...) and set operations (union(), difference(), ...). It can also compute geometric properties of geometries, such as area (in the case of polygons) or lengths (for polygons and lines)

Here you have a small example that combines iterating over the features in a given layer and perfoming some geometric computations based on their geometries.

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

Areas and perimeters don’t take CRS into account when computed using these methods from the QgsGeometry class. For a more powerful area and distance calculation, the QgsDistanceArea class can be used. If projections are turned off, calculations will be planar, otherwise they’ll be done on the ellipsoid. When an ellipsoid is not set explicitly, WGS84 parameters are used for calculations.

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.