|
Ayer 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.
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:
Publicar un comentario