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:

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

    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.

  • from well-known text (WKT)

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

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

Accesarea geometriei

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

As an alternative, one can use type() method which returns a value from QGis.GeometryType enumeration. There is also a helper function isMultipart() to find out whether a geometry is multipart or not.

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.

Additional information can be found in followinf sources: