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.
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 un niveau plus complexe: les multipoints sont une succession de points, les multilignes une succession de lignes et les multipolygones une succession de polygones.
à partir d’une description en well-known text (WKT):
gem = QgsGeometry.fromWkt("POINT (3 4)")
à partir d’une description en well-known binary (WKB):
g = QgsGeometry()
g.setWkbAndOwnership(wkb, len(wkb))
D’abord, vous devriez identifier le type de géométrie, notamment à l’aide de la méthode wkbType() — elle renvoie une valeur de la liste 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 les informations de géométrie, il existe des fonctions accesseurs pour chaque type de vecteur. Pour utiliser des accesseurs:
>>> 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().
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.
Modification de la géométrie: Algorithme de Reprojection
Distance et surface avec la classe QgsDistanceArea : Algorithme Matrice des Distances