Bienvenidos al Blog de la Comunidad Argentina de GvSIG

La idea de esta Blog es reunir a los usuarios, desarrolladores, interesados y recursos en Argentina del Proyecto GvSIG

jueves, 1 de septiembre de 2016

Camino a gvSIG 2.3: Ejemplo de script con la nueva implementación




geo_gridpol2Ayer hablamos de los cambios en las librerías de Scripting, pero nada mejor para ver algunos de ellos que enseñarlos en un ejemplo.
Da la casualidad que nuestro compañero José Guerrero publicó un script para la generación de una malla de puntos uniforme dentro de cada polígono en una capa designada. Cogiendo su script y aplicando algunos cambios, lo transformé para que pueda ser usado en gvSIG.
Vemos que hacemos uso de la nueva implementación que ya explicamos en otro post, algunas funciones han ampliado su funcionalidad, y en general, funciona como lo hacía anteriormente, aunque por debajo todo sea distinto.
Para ejecutar este script solo es necesario tener una Vista abierta con una proyección por ejemplo EPSG:25830 y con una capa de polígonos seleccionada en esa Vista.
Si quieres cargar el script y probarlo por tu cuenta, debes irte a Herramientas - Scripting - Editor de Scripts. Seleccionamos Nuevo arriba a la izquierda, escribimos un nombre para nuestro script y aceptamos. Ya nos saldrá la pantalla en blanco donde copiar y pegar nuestro script. Para ejecutarlo podemos presionar F5.
# encoding: utf-8

from gvsig import currentLayer, currentView, createSchema, createShape
from gvsig import geom

# Basado en: https://joseguerreroa.wordpress.com/2016/08/31/creando-puntos-espaciados
# -regularmente-dentro-de-los-rasgos-features-de-un-vectorial-tipo-poligono-con-pyqgis/

def main(*args):
    """ Crear grid dentro de polionos con una distancia establecida """
    #Distancia entre puntos
    distancegrid = 5

    # Crear nueva capa
    sch = createSchema()
    sch.append("GEOMETRY", "GEOMETRY")
    sch.get("GEOMETRY").setGeometryType(geom.POINT, geom.D2)
    shp = createShape(sch)
    
    layer = currentLayer()
    features = layer.features()
    
    for feature in features:
        extent = feature.getDefaultEnvelope()

        xmin = extent.getMinimum(geom.DIMENSIONS.X)
        xmax = extent.getMaximum(geom.DIMENSIONS.X)
        
        ymin = extent.getMinimum(geom.DIMENSIONS.Y)
        ymax = extent.getMaximum(geom.DIMENSIONS.Y)

        rows = int(ymax-ymin)/distancegrid
        cols = int(xmax-xmin)/distancegrid
        
        x = xmin
        y = ymax

        for i in range(rows+1):
            for j in range(cols+1):
                pt = geom.createPoint2D(x, y)
                if feature.geometry().contains(pt):
                    # Puntos contenidos en el poligonos
                    # son agregados a la capa
                    shp.append(GEOMETRY=pt)
                x += distancegrid
            x = xmin
            y -= distancegrid
            
    shp.commit() # Guardamos
    currentView().addLayer(shp) # Agregamos a la Vista
Como vemos, queda un script bastante sencillo de leer, sin tener que preocuparnos de rutas o similar. Las proyecciones las coge de la Vista.
geo_gridpol1
Podríamos añadir muchas otras mejoras como la de crear una vista nueva cada vez que se ejecute el script para mostrar resultados currentProject().createView("nueva vista"), preguntar por una capa que no estuviera cargada, etc. Iremos sacando más ejemplos en los que mostrar las nuevas funcionalidades.
En el próximo artículo veremos cómo convertir este script en un geoproceso que aparezca en nuestra Caja de Herramientas, de esta forma lo podríamos tener siempre accesible junto al resto de geoprocesos, dotarle de interfaz, incluirlo en el Model Builder y permitiendo otras funcionalidades como su ejecución desde gvpy.
Interesante crear tu propia caja de herramientas ¿verdad?

No hay comentarios: