Manipularea geometriei

Punctele, liniile și poligoanele, care reprezintă entități spațiale sunt frecvent menționate ca geometrii. În QGIS acestea sunt reprezentate de clasa QgsGeometry. Toate tipurile de geometrie posibile sunt frumos prezentate în pagina de discuții JTS.

Uneori, o geometrie poate fi de fapt o colecție de simple geometrii (simple-părți). O astfel de geometrie poartă denumirea de geometrie multi-parte. În cazul în care conține doar un singur tip de geometrie simplă, o denumim multi-punct, multi-linie sau multi-poligon. De exemplu, o țară formată din mai multe insule poate fi reprezentată ca un multi-poligon.

Coordonatele geometriilor pot fi în orice sistem de coordonate de referință (CRS). Când extragem entitățile dintr-un strat, geometriile asociate vor avea coordonatele în CRS-ul stratului.

Construirea geometriei

Există mai multe opțiuni pentru a crea o geometrie:

  • din coordonate

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

    Coordonatele sunt obținute folosind clasa QgsPoint.

    O polilinie (linie) este reprezentată de o listă de puncte. Poligonul este reprezentat de o listă de inele liniare (de exemplu, linii închise). Primul inel este cel exterior (limita), inele ulterioare opționale reprezentând găurile din poligon.

    Geometriile multi-parte merg cu un nivel mai departe: multi-punctele sunt o listă de puncte, multi-liniile o listă de linii iar multi-poligoanele sunt o listă de poligoane.

  • din well-known text (WKT)

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

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

Accesarea geometriei

În primul rând, ar trebui să găsiți tipul geometriei, metoda wkbType() fiind cea pe care o puteți utiliza — ea returnând o valoare din enumerarea QGis.WkbType

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

Ca alternativă, se poate folosi metoda type() care returnează o valoare din enumerarea QGis.GeometryType. Există, de asemenea, o funcție ajutătoare isMultipart() pentru a afla dacă o geometrie este multiparte sau nu.

Pentru a extrage informații din geometrie, există funcțiile accessor pentru fiecare tip de vector. Iată cum le puteți utiliza

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

Notă: tuplurile (x, y) nu reprezintă tupluri reale, ele sunt obiecte :​​class:QgsPoint, valorile fiind accesibile cu ajutorul metodelor x() și y() .

Pentru geometriile multiparte există funcții accessor similare: asMultiPoint(), asMultiPolyline(), asMultiPolygon ().

Predicate și operațiuni geometrice

QGIS folosește biblioteca GEOS pentru operațiuni geometrice avansate, cum ar fi predicatele geometrice (contains(), intersects(), ...) și operațiunile de setare (union(), difference(), ...). Se pot calcula, de asemenea, proprietățile geometrice, cum ar fi suprafața (în cazul poligoanelor) sau lungimea (pentru poligoane și linii)

Iată un mic exemplu care combină iterarea entităților dintr-un strat dat și efectuarea unor calcule bazate pe geometriile lor.

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

Ariile și perimetrele nu iau în considerare CRS-ul atunci când sunt calculate folosind metodele clasei QgsGeometry. Pentru un calcul mult mai puternic al ariei și al distanței se poate utiliza clasa QgsDistanceArea. În cazul în care proiecțiile sunt dezactivate, calculele vor fi planare, în caz contrar acestea vor fi efectuate pe un elipsoid. Când elipsoidul nu este setat în mod explicit, parametrii WGS84 vor fi utilizați pentru calcule.

d = QgsDistanceArea()
d.setProjectionsEnabled(True)

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

Puteți căuta mai multe exemple de algoritmi care sunt incluși în QGIS și să folosiți aceste metode pentru a analiza și a transforma datele vectoriale. Mai jos sunt prezente câteva trimiteri spre codul unora dintre ele.

Informații suplimentare pot fi găsite în sursele următoare: