Manipulação Geométrica

Pontos, cadeias lineares e polígonos que representam uma característica espacial são comumente referido como geometrias. Em QGIS eles são representados com a classe : class QgsGeometry. Todos os tipos possíveis de geometria são mostrados na página de discussão JTS discussion page.

Às vezes, uma geometria é realmente uma coleção dex simples geometrias (single-part). Tal geometria é chamada de geometria de várias partes. Se ele contém apenas um tipo de simples geometria, podemos chamar de multi-ponto, multi-cadeia linear ou multi-polígono. Por exemplo, um país que consiste de múltiplas ilhas pode ser representado como um sistema multi-polígono.

As coordenadas de geometrias podem estar em qualquer sistema de referência de coordenadas (SRC). Ao buscar feições a partir de uma camada, geometrias associadas terão coordenadas no SRC da camada.

Construção de Geométria

Existem várias opções para criar uma geometria:

  • a partir das coordenadas

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

    As coordenadas são dadas usando a classe QgsPoint.

    Polyline (Cadeia Linear) é representado por uma lista de pontos. Polígono é representado por uma lista de anéis lineares (ou seja, cadeias lineares fechada). Primeiro anel é o anel exterior (fronteira), anéis subsequentes opcionais são buracos no polígono.

    Geometrias multi-parte passam para um nível maior: multi-ponto é uma lista de pontos, multi-cadeia linear é uma lista de cadeias lineares e multi-polígono é uma lista de polígonos.

  • a partir de textos conhecidos (WKT)

    gem = QgsGeometry.fromWkt("POINT(3 4)")
    
  • a partir de binários conhecidos (WKB)

    >>> g = QgsGeometry()
    >>> wkb = '010100000000000000000045400000000000001440'.decode('hex')
    >>> g.fromWkb(wkb)
    >>> g.exportToWkt()
    'Point (42 5)'
    

Acesso a Geometria

Primeiro, você deve descobrir o tipo de geometria, wkbType() é o método único a usar — ele retorna um valor de enumeração do QGis.WkbType

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

Como alternativa, pode-se usar o método type() que retorna um valor de enumeração QGis.GeometryType. Há também uma função de ajuda : isMultipart() para descobrir se uma geometria é multi-parte ou não.

Para extrair informações de geometria existem funções de acesso para cada tipo de vetor. Como usar acessores

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

Nota

The tuples (x,y) are not real tuples, they are QgsPoint objects, the values are accessible with x() and y() methods.

Para geometrias de multi-partes existem funções de acesso similares: asMultiPoint(), asMultiPolyline(), asMultiPolygon().

Operações e Predicados Geométricos

QGIS usa biblioteca GEOS para operações avançadas de geometria como predicados geométrico (contains(), intersects(), ...) e operações de conjunto (union(), difference(), ...). Também podem calcular propriedades geométricas das geometrias, tais como a área (no caso de polígonos) ou comprimentos (para polígonos e linhas)

Aqui você tem um pequeno exemplo que combina a iteração sobre as caracteríticas em uma determinada camada e executando alguns cálculos geométricos com base em suas geometrias.

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

d = QgsDistanceArea()
d.setEllipsoid('WGS84')
d.setEllipsoidalMode(True)

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

Você pode encontrar muitos exemplo de algoritmos que estão incluídos no QGIS e usar esses métodos para analisar e transformar dados vetoriais. Aqui estão alguns links para o código de alguns deles.

Informação adicional pode ser encontada nas seguintes fontes: