Manejo de Geometría

Points, linestrings and polygons that represent a spatial feature are commonly referred to as geometries. In QGIS they are represented with the QgsGeometry class.

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.

Description and specifications of all possible geometries construction and relationships are available in the OGC Simple Feature Access Standards for advanced details.

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()
    >>> wkb = '010100000000000000000045400000000000001440'.decode('hex')
    >>> g.fromWkb(wkb)
    >>> g.exportToWkt()
    'Point (42 5)'
    

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

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

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

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

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: