Función en PyQGIS para crear una memory layer de puntos aleatorios

Al disponer de código PyQGIS en forma de función es fácil de modificar y adaptar para realizar otras tareas. Por ejemplo, si queremos generar puntos aleatorios para la extensión de una determinada capa, vectorial o ráster, se puede utilizar el ya considerado en este post. Su adaptación/modificación es la siguiente:

from qgis.gui import QgsMessageBar
import random
 
def createQgsPoints(coor):
    
    return [QgsPoint(coor[i], coor[i+1])  for i in range(0, len(coor) , 2)]
 
def createPointRandomLayer(num_points):
    layer = iface.activeLayer()
     
    if layer is None:
        iface.messageBar().pushMessage("Warning:",
                           "There is not Active Layer",
                           QgsMessageBar.WARNING, 5)
        return
 
    crs = layer.crs()
    epsg = crs.postgisSrid()
 
    extent = layer.extent()
 
    xmax = extent.xMaximum()
    xmin = extent.xMinimum()
    ymax = extent.yMaximum()
    ymin = extent.yMinimum()
     
    coor = []
 
    for i in range(num_points):
        xRandom = random.uniform(xmin, xmax)
        yRandom = random.uniform(ymin, ymax)
        coor.append(xRandom)
        coor.append(yRandom)
 
    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 este EPSG: ", epsg
    else:
        print "La memory layer no se creo satisfactoriamente "
        return
   
createPointRandomLayer(100)

El código anterior emplea el módulo random para generar valores aleatorios entre (xmin, xmax) y (ymin, ymax) de la capa activa (vectorial o ráster) para, posteriormente, conformar QgsPoint(s) que darán lugar a una memory layer de puntos. Los resultados de la ejecución de la función ‘createPointRandomLayer’ cuatro veces para producir en cada oportunidad 100 puntos aleatorios se presentan en la imagen siguiente:

random

Para hacer los resultados permanentes basta grabar cada memory layer como shapefile aunque, si es su deseo, también lo puede programar dentro del código.

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

Una respuesta a Función en PyQGIS para crear una memory layer de puntos aleatorios

  1. Pingback: Listas por comprensión en 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