Gestione della Geometria

Ci si riferisce comunemente a punti, linee e poligoni che rappresentano una caratteristica spaziale come geometrie. In QGIS sono rappresentate tramite la classe QgsGeometry. Tutti i possibili tipi di geometria sono mostrati nella pagina di discussione JST.

Alcune volte una geometria é effettivamente una collezione di geometrie (parti singole) piú semplici. Se contiene un tipo di geometria semplice, la chiameremo punti multipli, string multi linea o poligoni multipli. Ad esempio, un Paese formato da piú isole puó essere rappresentato come un poligono multiplo.

Le coordinate delle geometrie possono essere in qualsiasi sistema di riferimento delle coordinate (CRS). Quando si estraggono delle caratteristiche da un vettore, le geometrie associate avranno le coordinate nel CRS del vettore.

Costruzione della Geometria

Esistono diverse opzioni per creare una geometria:

  • dalle coordinate

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

    Le coordinate vengono fornite utilizzando la classe QgsPoint.

    Una polilinea (linestring) é rappresentata da una lista di punti. Un poligono é rappresentato da una lista di anelli lineari (i.e. linee chiuse). Il primo anello é l’anello esterno (confine), gli altri anelli opzionali sono buchi nel poligono.

    Le geometrie a parti multiple vanno ad un livello successivo: punti multipli é una lista di punti, una stringa multi linea é una linea di linee ed un poligono multiplo é una lista di poligoni.

  • da well-known text (WKT)

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

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

Accedere alla Geometria

Come prima cosa si deve individuare il tipo di geometria, utilizzando il metodo wkbType() — che restituisce un valore dell’enumerazione QGis.WkbType

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

Come alternativa, é possibile utilizzare il metodo type() che restituisce uno dei valori dell’enumerazione QGis.GeometryType. Esiste inoltre la funzione di aiuto isMultipart() per capire se la geometria é multiparte o meno.

Per estrarre informazioni dalla geometria esistono delle funzioni di accesso per ogni tipo di vettore. Come usare le funzioni di accesso

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

Nota: le tuple (x, y) non sono vere tuple, ma sono oggetti QgsPoint, i valori sono accessibili tramite i metodi x() e y().

Per le geometrie multiparte esistono funzioni di accesso simili: asMultiPoint(), asMultiPolyline(), asMultiPolygon().

Predicati ed Operazioni delle Geometrie

QGIS usa la libreria GEOS per operazioni avanzate sulle geometrie come i predicati (contains(), intersects(), ...) e operazioni di set (union(), difference(), ...). Inoltre la libreria calcola le proprietá geometriche della geometria come l’area (nel caso di poligoni) o le lunghezze (per linee e poligoni)

Di seguito un piccolo esempio che combina l’iterazione sulle caratteristiche di un vettore e l’esecuzione di alcuni calcoli geometrici basati sulle loro geometrie.

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

Aree e perimetri non considerano il CRS quando vengono calcolate utilizzando questi metodi della classe QgsGeometry. Per un calcolo piú potente di area e distanza si puó utilizzare la classe QgsDistanceArea. Se le proiezioni vengono spente, i calcoli saranno planari, altrimenti verranno eseguiti sull’ellissoide. Quando un ellissoide non viene specificato si utilizzano i parametri del WGS84 per i calcoli.

d = QgsDistanceArea()
d.setProjectionsEnabled(True)

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

É possibile trovare molti esempi di algoritmi che sono inclusi in QGIS ed utilizzare questi metodi per analizzare e trasformare i dati vettoriali. Di seguito i link al codice di alcuni di questi.

É possibile trovare ulteriori informazioni alle seguenti fonti: