Funciones con PyQGIS: archivos vectoriales

En artículos previos se ha incluido una buena porción de código que considera varios aspectos relacionados con el procesamiento de archivos vectoriales y ráster utilizando la Python Console de QGIS. No obstante, la mayor parte de éste considera casos particulares exitosos para los cuales no se hacen validaciones ni generalizaciones importantes. Para que este código sea reutilizable y más útil, el primer paso que deberíamos hacer sería comenzar a ponerlo todo bajo la forma de funciones de proposito general con validaciones y comprobaciones.

Para realizar esta tarea vamos a considerar la creación del archivo utils.py, en el directorio c:\pyqgis_scripts, el cual iremos poblando con diferentes funciones. Voy a estructurarlo, como primera aproximación, con funciones de propósito general, con funciones para manejar archivos vectoriales y, finalmente, con funciones para manipular archivos ráster. Como éste es un archivo que promete ser voluminoso, a modo de ejemplo, comenzaremos con la función get_patt y la función para crear una memory layer de puntos.

La primera la renombre a getPat(keyword, L) y me va a servir a futuro para explorar los métodos para clases más complejas porque la QgsPoint, necesaria para crear la memory layer de puntos, no tiene muchos métodos y puede explorarse visualmente sin problemas. En el caso de la creación de la memory layer de puntos, se puede observar en el post que ésta se creó mediante una uri (Uniform Resource Identifier) donde se incluía el código EPSG para establecer el Coordinate Reference System y añadir dos campos: id y área.

Como los campos se pueden adicionar con métodos de otras clases, en este caso sólo voy a añadir un campo (el id) y a pasarle como parámetro a la función el código EPSG; para que internamente en ésta se configure la uri. Para no complicarme mucho, verifiqué que una asignación en la Python Console como ésta :

z = -150, 61, -151, 61, -151, 62

producia una tupla de coordenadas que al pasársela como parametro a una función, createQgsPoints(coor), con métodos de la clase QgsPoint, me producía la lista de QgsPoints necesaria para la creación final de la “memory points layer”; mediante createPointLayer(epsg, coor).

El código completo es el siguiente:

#-*- coding: utf-8 -*-
from qgis.core import *
from qgis.utils import iface
import re
 
#Funciones de uso general
 
#Introduzca patron de texto y lista 
def getPat(keyword, L):
 
#declara lista vacia
    list = []
 
    for item in L:
        signal = re.search(keyword, item)
        if signal is not None:
            list.append(item)
 
    print list  #imprime lista con resultados

#Funciones para uso con archivos vectoriales

def createQgsPoints(coor):
    points = []
    my_coor = list(coor)

    for i in range(0, len(my_coor) , 2):
        point = QgsPoint()
        point.setX(my_coor[i])
        point.setY(my_coor[i+1])
        points.append( point )
    return points
 
def createPointLayer(epsg, coor):
    CRS = QgsCoordinateReferenceSystem(epsg)
    
    if CRS.isValid() is not True:
        print "El codigo EPSG no es valido"
        print "La multipoint layer no pudo ser creada"
        return
    
    uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"
    
    mem_layer = QgsVectorLayer(uri,
                         "Points",
                         "memory")

    #add Map Layer to Registry
    QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
     
    #Prepare mem_layer for editing

    mem_layer.startEditing()
  
    #points to add
    points = createQgsPoints(coor)
    #Calculate number points
    n = len(points)
 
    #Set feature
    feature = []
   
    for i in range(n):
         feat =QgsFeature()
         feature.append(feat)

    #set attributes values 
    for i in range(n):
         feature[i].setGeometry(QgsGeometry.fromPoint(points[i]))  #Set geometry
         feature[i].setAttributes([i])
         mem_layer.addFeature(feature[i], True)
  
    #stop editing and save changes
    mem_layer.commitChanges()
    
    if mem_layer is not None:
        print "La capa de puntos se creo satisfactoriamente"
        print "con estos puntos:", points 
        print "con este EPSG: ", epsg
    else:
        print "La memory layer no se creo satisfactoriamente "
        return
 
    #zoom to Active Layer
    iface.zoomToActiveLayer()

Para probarlo en la Python Console:

>>>from utils import *
>>>z = -150, 61, -151, 61, -151, 62
>>>createPointLayer(4326, z)
La capa de puntos se creo satisfactoriamente
con estos puntos: [(-150,61), (-151,61), (-151,62)]
con este EPSG:  4326

En la imagen siguiente se observa la creación efectiva de la capa:

functions

Esta entrada fue publicada en PyQGIS, QGIS, SIG. Guarda el enlace permanente.

7 respuestas a Funciones con PyQGIS: archivos vectoriales

  1. Pingback: Funciones con PyQGIS: archivos ráster | El Blog de José Guerrero

  2. Pingback: Map Renderer con PyQGIS | El Blog de José Guerrero

  3. Pingback: Agregando una QgsMapLayerComboBox (PyQGIS) a un QDialog diseñado previamente con QtDesigner | El Blog de José Guerrero

  4. Pingback: Las clases Qgs…ComboBox de qgis.gui (PyQGIS) | El Blog de José Guerrero

  5. Pingback: Las clases Qgs…Widget de qgis.gui (PyQGIS) | El Blog de José Guerrero

  6. Pingback: Cómo obtener los métodos de clase de PyQGIS en el código de un plugin con un diccionario | El Blog de José Guerrero

  7. Pingback: Función en PyQGIS para crear una memory layer de puntos aleatorios | 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