La función get_patt en el aprendizaje de PyQGIS

PyQGIS es la mezcla de Python y Quantum GIS (ahora QGIS) que permite escribir scripts y plugins para implementar, extender e incrementar las opciones de geoprocesamiento en QGIS o realizar tareas repetitivas de manera automatizada. Como PyQGIS tiene más de 500 clases listadas en la documentación y, por tanto, miles de procedimientos, la mayoría de las veces se nos hace abrumadora la tarea de estudiarlo de manera sistemática sin tener que consultar constantemente la documentación. Por ello, es necesario contar con alguna herramienta que permita verificar la sintaxis de los procedimientos o arrojar pistas acerca de éstos en las diferentes clases que tiene PyQGIS sin necesidad de estar conectado a Internet y desde la misma interfaz de la Python Console.

En un artículo pasado implementé una función (get_patt) que permitía explorar patrones de texto en palabras que se puede aplicar a la lista de todos los métodos y procedimientos de una determinada clase que se obtiene con el comando dir. Hay que tener una idea de cómo son las clases en PyQGIS e intuir los posibles métodos que se quieren invocar. Por ejemplo, los objetos de la clase QgisInterface (iface) son los primeros que expone el libro de Gary Sherman y el PyQGIS Cook Book. Ahora, cómo es la sintaxis de los procedimientos que se pueden usar con iface y que llevan la palabra ‘zoom’ o ‘Zoom’ (es ‘Case Sensitive’)?. Como he creado un PYTHONPASS a mis scripts en QGIS entonces con lo siguiente en la Python Console:

>>>import signal2
>>>from signal2 import *
>>>K = dir(iface)
>>>get_patt('zoom',K)
['zoomFull', 'zoomToActiveLayer', 'zoomToNext', 'zoomToPrevious']
>>>get_patt('Zoom',K)
['actionZoomActualSize', 'actionZoomFullExtent', 'actionZoomIn', 'actionZoomLast', 'actionZoomNext', 'actionZoomOut', 'actionZoomToLayer', 'actionZoomToSelected']

tengo la respuesta. Con esto en mente voy a cargar un shapefile tipo ‘Polygon’ y me aseguro que permanece como la capa activa; tal como se presenta en la siguiente imagen (aunque la selección del primer feature se producirá más adelante con las acciones que se realizarán en la Python Console).

pyqgis

Se crea una referencia al objeto (grid) con el método ‘activeLayer’ de iface:

>>>grid=iface.activeLayer()
>>>grid
<qgis.core.QgsVectorLayer object at 0x218DC780>

Observen que al imprimir ‘grid’ nos indica que es un objeto de la clase QgsVectorLayer. Ahora vamos a seleccionar rasgos. Ejecutemos un L=dir(QgsVectorLayer) y filtramos por ‘sel’ con ‘get_patt’:

>>>get_patt('sel',L)
['deselect', 'select', 'selectAll', 'selectedFeatureCount', 'selectedFeatures', 'selectedFeaturesIds', 'selectionChanged']

Apliquemos el método ‘selectedFeatures’ a ver que sucede:

>>>grid.selectedFeatures()
[]

Se obtiene una lista vacía (no vamos bien encaminados). Filtremos por ahora por ‘count’ y ‘Count’:

get_patt('count',L)
['countSymbolFeatures']
get_patt('Count',L)
['featureCount', 'invalidateSymbolCountedFlag', 'pendingFeatureCount', 'selectedFeatureCount']

Contemos los rasgos con ‘featureCount’:

>>>grid.featureCount()
50L

Se obtiene como resultado 50 (es una grid de 5 filas x 10 columnas). Seleccionemos ahora el feature de id=0.

>>>grid.select(0)

El resultado de esta acción se observa ahora en la Map View (ver imagen al inicio). Volvamos ahora a efectuar el procedimiento ‘selectedFeatures’ y nos daremos cuenta que ahora la lista no está vacía pero el objeto pertenece a QgsFeature.

>>>grid.selectedFeatures()[0]
<qgis.core.QgsFeature object at 0x218D3D20>

Hagamos un M=dir(QgsFeatures) y filtremos por geom:

>>>M=dir(QgsFeature)
>>>get_patt('geom',M)
['geometry', 'geometryAndOwnership']

Uno de los métodos es ‘geometry’. Determinemos ahora la geometría:

>>>geom = grid.selectedFeatures()[0].geometry()
>>>geom
<qgis.core.QgsGeometry object at 0x218DE810>

El objeto pertenece a la clase QgsGeometry. Hagamos N = dir(QgsGeometry) e imprimimos N.

N
['Error', '__class__', '__delattr__', '__dict__', '__doc__', '__format__',
'__geo_interface__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'addPart',
'addPartGeometry', 'addRing', 'adjacentVertices', 'area', 'asGeometryCollection', 'asMultiPoint', 'asMultiPolygon',
'asMultiPolyline', 'asPoint', 'asPolygon', 'asPolyline', 'asWkb', 'avoidIntersections', 'boundingBox', 'buffer',
'centroid', 'closestSegmentWithContext', 'closestVertex', 'closestVertexWithContext', 'combine', 'contains',
'convertToMultiType', 'convexHull', 'crosses', 'deletePart', 'deleteRing', 'deleteVertex', 'difference',
'disjoint', 'distance', 'equals', 'exportToGeoJSON', 'exportToWkt', 'fromMultiPoint', 'fromMultiPolygon',
'fromMultiPolyline', 'fromPoint', 'fromPolygon', 'fromPolyline', 'fromRect', 'fromWkb', 'fromWkt', 'insertVertex',
'interpolate', 'intersection', 'intersects', 'isGeosEmpty', 'isGeosEqual', 'isGeosValid', 'isMultipart', 'length',
'makeDifference', 'moveVertex', 'overlaps', 'reshapeGeometry', 'simplify', 'splitGeometry', 'sqrDistToVertexAt',
'symDifference', 'touches', 'transform', 'translate', 'type', 'validateGeometry', 'vertexAt', 'within', 'wkbSize', 
'wkbType']

Si usamos, respectivamente, los métodos ‘area’, ‘length’ y ‘asPolygon’ nos producen resultados. El último puede ser usado, por ejemplo, para aplicar un cambio de proyección a otro sistema de coordenadas.

geom.area()
144080440.56512597
geom.length()
48036.76860000065
geom.asPolygon()
[[(355401,4.47316e+06), (367784,4.47316e+06), (367784,4.46153e+06), (355401,4.46153e+06), (355401,4.47316e+06)]]

En cambio, si se usa ‘centroid’, el resultado es otro objeto de QgsGeometry.

>>>geom.centroid()
<qgis.core.QgsGeometry object at 0x20778390>

Para éste se puede, por ejemplo, comprobar el tipo de geometría (con ‘type’) o encontrar sus coordenadas con ‘asPoint’.

geom.centroid().type()
0
geom.centroid().asPoint()
(361593,4.46734e+06)

Qué utilidad tiene ésto? Se puede producir una nueva capa vectorial de puntos que incluya los centroides de la grilla en un script. Sin embargo, aquí puede resultar más conveniente usar un iterador sobre todos los rasgos de la grid con ‘getFeatures’.

Esta entrada fue publicada en Código Python, PyQGIS, SIG, Software Libre. Guarda el enlace permanente.

Una respuesta a La función get_patt en el aprendizaje de PyQGIS

  1. Pingback: Funciones con PyQGIS | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s