Manejo de Geometría

Puntos, líneas y polígonos que representan una entidad espacial son comunmente referidas como geometrías. En QGIS ellos son representados con la clase QgsGeometry. Todas las posibles geometrías son mostradas agradablemente en la página de discusión JTS.

A veces una geometría es realmente una colección simple (partes simples) geométricas. Tal geometría se llama geometría de múltiples partes. Si contiene un tipo de geometría simple, lo llamamos un punto múltiple, lineas múltiples o polígonos múltiples. Por ejemplo, un país consiste en múltiples islas que se pueden representar como un polígono múltiple.

Las coordenadas de las geometrías pueden estar en cualquier sistema de referencia de coordenadas (SRC). Cuando extrae características de una capa, las geometrías asociadas tendrán sus coordenadas en el SRC de la capa.

Construcción de Geometría

Existen varias opciones para crear una geometría:

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

    Las coordenadas son dadas usando la clase: QgsPoint.

    La Polilínea (Linestring) se representa mediante una lista de puntos. Un Polígono se representa por una lista de anillos lineales (Ej. polilíneas cerradas). El primer anillo es el anillo externo (límite), los subsecuentes anillos opcionales son huecos en el polígono.

    Las geometrías multi-parte van un nivel más allá: multi-punto es una lista de puntos, multi-linea es una lista de polilíneas y multi-polígono es una lista de polígonos.

  • desde well-known text (WKT)

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

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

Acceso a Geometría

En primer lugar, debe saber el tipo de geometría, el método wkbType() es una para usar — devuelve un valor de enumeración QGis.WkbType

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

Como alternativa, se puede utilizar el método type() que devuelve un valor de enumeración QGis.GeometryType. También hay una función auxiliar isMultipart() para averiguar si una geometría es multiparte o no.

Para extraer información de una geometría existen funciones de acceso para cada tipo vectorial. Cómo usar accesos

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

Nota: Las tuplas (x, y) no son tuplas reales, son objetos: QgsPoint , los valores son accesibles con los métodos: x() and y().

Para geometrias multiples existen funciones similares para accesar : asMultiPoint(), asMultiPolyline(), asMultiPolygon().

Geometría predicados y Operaciones

QGIS utiliza la biblioteca GEOS para operaciones avanzadas de geometría como predicados de geometría (contains(), intersects(), ...) y operaciones de conjuntos (union(), difference(),. ..). También se puede calcular propiedades geométricas de geometrías, tales como el área (en el caso de polígonos) o longitudes (por polígonos y líneas)

Aquí tienes un pequeño ejemplo que combina iterar sobre las características de una determinada capa y realizar algunos cálculos geométricos en función de sus geometrías.

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

Las áreas y perímetros no toman en cuenta el SRC cuando se calcula utilizando estos métodos desde la clase QgsGeometry. Para un cálculo más potente de área y la distancia, la clase :class: QgsDistanceArea se puede utilizar. Si las proyecciones se apagan, los cálculos serán planos, de lo contrario van a ser hecho en el elipsoide. Cuando un elipsoide no se establece explícitamente, los parámetros WGS84 se utilizan para los cálculos.

d = QgsDistanceArea()
d.setProjectionsEnabled(True)

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

Puede encontrar muchos ejemplos de algoritmos que se incluyen en QGIS y utilizan estos métodos para analizar y transformar los datos vectoriales. Aquí hay algunos enlaces al código de algunos de ellos.

Información adicional puede ser encontrada en las siguientes fuentes: