Taller realizado durante las 13as Jornadas Internacionales gvSIG en Valencia y las 4as Jornadas gvSIG de México. Explica las funcionalidades básicas del módulo de programación y un ejemplo de manejo de datos e inserción de un geoproceso en la Toolbox.
1. 1
Taller de Scripting en gvSIG
Óscar Martínez
omartinez@gvsig.com
Twitter: @masquesig
2. 2
Índice
● Iniciación al Módulo de Scripting
– Preparación del proyecto
– Ejecución de tu primer script
– Nociones básicas de Python
– Funcionalidades del Módulo de Scripting
● Proceso a desarrollar
– Problema
– Solución
● Integración en la Caja de Herramientas
– Creación del geoproceso
– Acceso con gvpy
4. 4
Iniciación al Módulo de Scripting
Preparación del proyecto
● Para seguir el siguiente Taller es necesario una versión de
gvSIG 2.3.1 o en adelante.
● Puedes descargar la versión deseada desde aquí
● Versión portable: es un fichero comprimido que con solo
descomprimir ya puede ejecutar gvSIG. La ruta no debe de
contener espacios en blanco ni estar situada directamente
sobre el raiz. Ejemplo válido: C:/gvsig-desktop/gvSIG-2.3…/
● Versión instalable: para realizar el taller deberás de instalar
unas herramientas complementarias. Una vez abierto gvSIG
desde el Administrador de Complementos → Instalación
estandar, deberás de buscar el complemento
ScriptingComposerTools e instalarlo. Esta es una serie de
herramientas que facilitan el desarrollo con gvSIG.
5. 5
Iniciación al Módulo de Scripting
Preparación del proyecto
● Los ejemplos realizados durante este taller los puedes
descargar desde este enlace.
● Es un fichero paquete de gvSIG que puede ser instalado
desde el Administrador de Complementos → Instalación
desde Archivo y seleccionando el paquete Taller de Scripting
como en la imagen.
6. 6
Iniciación al Módulo de Scripting
Preparación del proyecto
● Abrir gvSIG versión portable 2.3.1
● Ejecutar el fichero: gvsig-desktop.cmd
● Este fichero abre una consola que ejecuta gvSIG y que
podremos consultar en caso de errores críticos durante el
desarrollo en tiempo real. Otra forma sería consultar los logs
de la carpeta dentro de la portable: /home/gvSIG/gvSIG.log
● Para un uso normal de gvSIG se recomienda abrir el .exe o el
.vbs.
13. 13
Iniciación al Módulo de Scripting
Ejecución de tu primer script
● Abrir el Módulo de Scripting. Diferentes herramientas
– Lanzador de Scripts para ejecución rápida de scripts ya
hechos
– Editor de Scripts. Con lo que vamos a trabajar
– Consola de Jython para pruebas (no recomendada de
usar)
14. 14
Iniciación al Módulo de Scripting
Ejecución de tu primer script
● Editor de scripts. Donde haremos todo el trabajo de
desarrollo.
15. 15
Iniciación al Módulo de Scripting
Ejecución de tu primer script
● Crearemos una carpeta nueva para el taller donde meteremos nuestros
nuevos scripts
● Botón de Nuevo
● Seleccionar un nombre: taller_scripting
● Tipo: Folder
● Importante: Seleccionar la carpeta donde crear la carpeta. En /User/
16. 16
Iniciación al Módulo de Scripting
Ejecución de tu primer script
● Crearemos un script nuevo
● Botón de Nuevo
● Seleccionar un nombre: script01
● Tipo: Script
● Language: Python
● Importante: seleccionar la carpeta donde guardar. Carpeta
taller_scripting. Seleccionar en la lista.
17. 17
Iniciación al Módulo de Scripting
Ejecución de tu primer script
● Una vez creado el script, se queda abierto en pantalla.
● Aparece la pestaña de script01
● El script aparece en nuestro editor abierto y listo para edición.
18. 18
Iniciación al Módulo de Scripting
Ejecución de tu primer script
● Si realizamos una modificación la pestaña se pondrá en negrita.
● Para que un script se ejecute con su última versión, hay que
grabar siempre antes de ejecutar. Esto lo podemos hacer
usando:
– Guardar + Ejecutar
● O con la forma recomendada:
– Botón de guardar y ejecutar a la vez:
– También podemos usar F5 en el editor para guardar y
lanzar
19. 19
Iniciación al Módulo de Scripting
Ejecución de tu primer script
● Presionamos el botón o F5 y veremos que se ejecuta el
script.
● Importante: gvSIG siempre busca una función main() para
ejecutar. Por tanto, siempre debe existir esta función.
● Vemos la salida por consola
21. 21
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Pequeña aclaración:
– La sintaxis que se usa es la de Python
– Realmente el motor que estamos usando es el de Jython.
Es una implementación de Python en Java. Esta versión
se usara para tareas de scripting sobre plataformas Java
como lo es gvSIG.
Es importante conocer esto para usos más avanzados y
compatibilidad con otras librerías
22. 22
Iniciación al Módulo de Scripting
Nociones básicas de Python
● En el script01 creado,
vamos a copiar y pegar el
siguiente código, con
unas nociones básicas de
Python que vamos a
explicar.
● Salida por consola:
# encoding: utf-8
import gvsig
def main(*args):
#Uso del condicional
numero = 2
if numero > 1:
print "numero mayor a 1"
elif numero == 1:
print "numero igual a 1"
else:
print "Cualquier otra opcion"
# Recorriendo una lista
lista = [1, 2, 3]
for n in lista:
nuevoValor = n + 10
print "Valor de la lista: ", nuevoValor
# Ejecutar una funcion con un parametro
texto = "hola mundo"
ejecutar(texto)
def ejecutar(valor):
print "Valor: ",valor
Running script slj.
numero mayor a 1
Valor de la lista: 11
Valor de la lista: 12
Valor de la lista: 13
Valor: hola mundo
Script slj terminated.
23. 23
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Indentación: Los espacios en blanco delante de las líneas
es la forma que tiene Python de agrupar las líneas que
pertenecer a una estructura o función.
● En gvSIG estos espacios en blanco se representan con
puntos pequeños para tener una correcta visualización.
● Vemos como hay 4 espacios delante de todas las líneas de la
función main
● Lo recomendable es usar 2 o 4 espacios. Siempre que lo
tengas en cuenta no hay problema mientras uses lo mismo.
24. 24
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Indentación:
– Vemos que dentro de las estructuras condicionales (if) o
bucles (for), las líneas que tienen que ir dentro de esa
estructura
– Estas dos líneas se ejecutaran
por cada iteración del for mientras
va recorriendo la lista. Comparten
la misma indentación.
25. 25
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Comentarios:
– Se pueden insertar comentarios poniendo delante el signo #
– De esta forma Python no ejecutará lo que contenta esa línea
– Puedes explicar las funciones
– Tomar apuntes en tus script
– Etc..
– Si añades o borras alguna de estas
líneas, la ejecución del script no se verá
afectada
● Importante: la primera línea de encoding
es un comentario que utiliza Python para la ejecución de los
script. No se debe de modificar
26. 26
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Declarar variables:
– En Python se declaran variables, ya sean números, textos,
booleans (True or False), etc, solamente escribiendo el
nombre de la variable y dándole valor
– Aquí estamos modificando el valor
de una variable por el valor de otra
variable + 10
27. 27
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Estructuras
– Condicional if: Estructura muy sencilla y de uso común.
Basicamente indica que si se cumple una condición (if) se ejecute
lo de dentro de ella. Si no se cumple comprobaría si existe otra
condición (elif)
y comprobaría su valor.
Si no se cumple ningun ejecutaría
lo contenido en el else.
● Si se agrupan como en el ejemplo
if / elif / else
en el momento que se cumple una
acaba la ejecución del if y saltaría
a lo siguiente. En este caso, se
cumple el if (linea 8), ejecutaria línea 9, y pasaría a la línea 15
28. 28
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Estructuras
– Bucle (for): Es una estructura que ejecuta el mismo código de forma
repetida.
– En este ejemplo, se crea una lista
que contiene tres valores, los que
va a recorrer uno a uno.
lista = [1, 2, 3]
– Dentro del for cogerá el valor,
le sumara 10, y lo imprimirá por
consola con el print.
– Consta de una parte que se repite: “Valor de
la lista” y añadido el nuevo valor calculado
– Resultado del for por consola:
Valor de la lista: 11
Valor de la lista: 12
Valor de la lista: 13
29. 29
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Funciones: Se pueden crear agrupaciones de código que hagan una
determinada función. Como ya hemos comentado gvSIG ejecutara la
función main() del script. Pero podemos crear nuevas funciones.
● En este caso creamos una función ejecutar(valor) que lo que hace es
coger un parámetro y realizar un print con él.
● Esta definida con la misma indentación que
la función main. Ningún espacio delante.
● Declaramos la función y establecemos que
tiene un parámetro (valor)
● Dentro de la función main llamamos a esta
función nueva, pasándole una variable “texto
Al ejecutar esta parte del script mostrará por
consola:
Valor: hola mundo
30. 30
Iniciación al Módulo de Scripting
Nociones básicas de Python
● Import: Los imports se encuentran en la parte inicial del script. Hacen importaciones de las
librerías que vamos a utilizar en el desarrollo.
● Por ejemplo, en este caso usamos la librería gvsig con un:
import gvsig
● De esta forma en nuestro código podríamos usar las funciones que están en la librería gvsig
escribiendo:
gvsig.funcion()
● Por ejemplo:
layer = gvsig.currentLayer()
● Esta línea haría que usásemos la función de
currentLayer(), designada para capturar la capa
activa en nuestra vista y la almacenaría en
una variable llamada layer.
● Si solo deseamos importar una función usaremos:
from gvsig import currentLayer
● De esta forma tendríamos que indicar solamente la función:
layer = currentLayer()
32. 32
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Para ayudar en el desarrollo se han creado una sería de herramientas.
● Se denominan ScriptingComposerTools y podemos comprobar si están
instaladas mirando en la carpeta de Addons
● Además aparecerán ya algunas herramientas en la barra de menu como
el icono del Abeille.
● En las versiones portables debería de ir instalado por defecto.
● En las instalables se puede descargar
desde el Administrador de Complementos.
33. 33
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Teniendo el script anterior abierto. Tal que así:
34. 34
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Herramientas de búsqueda:
– Pulsando Control + F estando en el script
35. 35
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Herramientas de búsqueda:
– Find References: para buscar clases,
funciones en diferentes carpetas, etc.
– Aparece en la pestaña references los
resultados
– Puedes clickar para ir directamente a ellos
– Ejemplo busqueda: ejecutar
36. 36
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Code Navigator: Navegador de código. Este navegador sirve para ver
la estructura del script y moverse rápidamente por ella, clickando en la
parte que queremos ir.
– Aparece en las pestañas de scripts. Abajo a la izquierda.
37. 37
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Nota: Para volver a ver nuestros scripts solo hay que presionar en
Scripts.
38. 38
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Javadocs: Herramienta para navegar en la documentación
de gvSIG directamente dentro del Módulo de Scripting.
– Tiene diversa documentación offline y online
– Desde documentación de Java a de Scripting
– Diversas pestañas Contents, Classes, Bookmarks,
Config. Principal la de Bookmarks para iniciados.
– Otra forma de acceder a la documentación
asegurandose que es la más nueva en la web:
– http://downloads.gvsig.org/download/web/es/build/html/index.html
– Se accede desde:
– Aparece abajo izquierda.
40. 40
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Abeille: Herramienta para la generación de interfaces
visuales.
● Se accede mediante el menú o mediante el icono.
41. 41
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Abeille: La primera vez que se ejecuta es posible que pida
seleccionar dónde guardar el proyecto inicial. Esto podemos
hacerlo en cualquier carpeta del ordenador ya que no se
utilizará.
● (No va a ser necesario para el taller)
● Para ello:
●
Presionamos Aceptar.
Ya permitirá crear
ficheros nuevos de
interfaz.
Guardar siempre como
xml.
42. 42
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Abeille: Con esta herramienta crearemos los interfaces
usando ficheros xml.
● Hay una guía completa del uso de Abeille en la
documentación:
● http://downloads.gvsig.org/download/web/es/build/html/scripting_devel_guide/2.3/interfaces_visuales.html
● El aspecto de la herramienta es:
43. 43
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Lint: Es una herramienta avanzada para el análisis de
errores de código. No tienen por qué ser errores críticos. El
script puede funcionar correctamente y aún aparecer errores
aquí.
– Al ejecutarse aparece abajo al lado de la consola
44. 44
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
Recordatorio:
● Organización del Módulo de Scripting:
– Todos los addons de scripting que tengamos
instalados deberían de estar en la carpeta de Addons.
– Llamamos addons a herramientas completas que
tienen ciertas necesidades a la hora de ejecutarse en
gvSIG.
– Los que instalemos a través del Administrados de
Complementos aparecerán siempre en la carpeta de
addons.
47. 47
Proceso a desarrollar
Problema
● Necesidad de una usuaria de gvSIG que no encuentra una
herramienta adecuada que exista actualmente para cumplir
sus necesidades de trabajo.
● Realiza la consulta en la Lista de usuarios.
[Gvsig_usuarios] Actualizar atributos con dados de otros vectores
21/09/2017 18:23
Hola todos,
debería actualizar en campo de atributos de una capa vectorial (linear)
con el valor del mismo atributo en una otra capa vectorial (polígonos)
solamente donde hay intersection de los dos capas (dentro los
polígonos).
Alguien tiene idea si se puede hacer en gvSIG con uno de los vector
tools?
Gracias
Silvia
48. 48
Proceso a desarrollar
Problema
● Planteamiento:
– Input: 2 capas
● Una de lineas (en este taller usaremos de puntos por ser
mas clara de ver)
● Una de polígonos
– Objetivo:
● Actualizar el valor de un campo de las entidades de una
capa, con los valores de la otra capa, allí donde
interseccionen.
50. 50
Proceso a desarrollar
Problema
● Planteamiento:
– Capa de puntos
● Con un campo vacio o con valores que queremos actualizar
con los valores del polígono con el que intersecan.
51. 51
Proceso a desarrollar
Problema
● Planteamiento:
– Ejemplo: Punto 101 que se encuentra dentro del polígono
seleccionado (aparece abajo tabla de atributos del polígono)
– Actualizar el campo UFE del punto con el campo que elijamos
del polígono que interseca anterior.
52. 52
Proceso a desarrollar
Problema
● Planteamiento:
– Buscaríamos que si elegimos el campo NM_ESTADO, el campo
del punto apareciera.
– Esto se haría para toda la capa.
–
● Ventajas de utilizar la API de gvSIG. En este taller, el ejemplo lo
hacemos sobre dos capas shapes en local, pero este mismo
desarrollo se podría aplicar sobre capas externas en servidores.
Siempre que se utilice gvSIG para añadir un servicio, podremos
trabajar con él usando una API común.
● No cambia nada entre tratar con capas vectoriales a tratar con
bases de datos. Una vez cargado, la forma de trabajar es la
misma.
55. 55
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.2. Acceso a los stores: Almacenes de datos
– 1.2.1 Acceso a la Vista.
Vemos que muestra,
por ejemplo, el nombre
de la Vista usando
getName() sobre la
Vista
56. 56
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.2. Acceso a los stores: Almacenes de datos
– 1.2.2. Clase de los objetos. Podemos usar la función type
para saber con que objeto estamos tratando.
– Por consola vemos que es de tipo DefaultViewDocument
– Esta clase podríamos buscarla en los Javadocs. Aquí
– Vemos que sí que tiene un método getName.
57. 57
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.2. Acceso a los stores: Almacenes de datos
– 1.2.3 Nosotros necesitamos acceder a sus almacenes de
datos, así que usamos el método getLayer
– Este método tiene un parámetro, que es el nombre de la capa
a la que acceder.
● Capa A Puntos: “puntos_brasil”
● Capa B Polígonos: “UFEBRASIL”
– Introduciremos estos nombres de las capas a usar en dos
variables al inicio de la función main()
– Recuerda: En python los campos de tipo texto van con
comillas
58. 58
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.2. Acceso a los stores: Almacenes de datos
– 1.2.4: Teniendo la Vista en la variable view, usamos
getLayer sobre ella. Hacemos un print para comprobar
que está cogiendo las capas, y además haremos que
muestra de qué tipo son.
–
59. 59
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.2. Acceso a los stores: Almacenes
de datos
– 1.2.5: Si no escribiste bien el nombre de
la capa aparecerá un valor None
– Debes usar el mismo nombre exacto que
aparece en la Tabla de Contenidos de la
Vista para encontrarlo)
60. 60
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.2. Acceso a los stores: Almacenes de datos
– 1.2.6: Accedemos a sus almacenes de datos usando
getFeatureStore de cada capa
– Nota: Los print se utilizan para ir comprobando los datos
de salida. Puedes dejarlos o irlos borrando según avanza
el taller.
# encoding: utf-8
import gvsig
def main(*args):
capaA = "puntos_brasil"
capaB = "UFEBRASIL"
view = gvsig.currentView() #Acceso a la Vista actual
lyrA = view.getLayer(capaA)
lyrB = view.getLayer(capaB)
fsA = lyrA.getFeatureStore() #Acceso a los feature stores -> fsA
fsB = lyrB.getFeatureStore()
61. 61
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.3. Acceso a las entidades
– 1.3.1: Si queremos recorrer los
valores que contienen estos
almacenes, tendremos que pedirle
un set de estos valores al
almacén de datos.
– Recorreremos la capa
UFEBRASIL
– Esto se hace mediante el método
getFeatureSet() → setB
– Este set de valores podemos
recorrerlo con un bucle(for)
62. 62
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.3. Acceso a las entidades
– 1.3.2: en fB, estamos accediendo a los objetos feature que contienen
los datos de cada entidad.
– Por ejemplo, si queremos acceder al valor del campo NM_ESTADO
hay que hacer un get(nombre_del_campo) sobre la entidad.
– Nota para avanzados: si no sabes que métodos se usan sobre las
entidades, puedes consultar el objeto DefaultFeature en los Javadocs
– Para ello, vamos a añadir dos líneas al inicio: crear dos variables que
contengan el nombre los campos para cada capa que nos interesan
63. 63
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.3. Acceso a las entidades
– 1.3.3: Ahora, accedemos a los valores del campo fieldB,
que están en las entidades de la capaB (UFEBRASIL).
– Sería algo similar a que cada entidad le pregunta un
get(“NM_ESTADO”)
– Por consola vemos los
valores de ese campo:
# encoding: utf-8
import gvsig
def main(*args):
capaA = "puntos_brasil"
capaB = "UFEBRASIL"
fieldA = "UFE"
fieldB = "NM_ESTADO"
view = gvsig.currentView()
lyrA = view.getLayer(capaA)
lyrB = view.getLayer(capaB)
fsA = lyrA.getFeatureStore()
fsB = lyrB.getFeatureStore()
setB = fsB.getFeatureSet()
for fB in setB:
print fB.get(fieldB)
Running script script02.
RONDÔNIA
ACRE
AMAZONAS
RORAIMA
PARÁ
...
64. 64
Proceso a desarrollar
Solución 2: Trabajando con geometrías
● 2.1 Acceso a las geometrías
– 2.1.1 Acceder a las geometrías. Esto se hace mediante el
método getDefaultGeometry sobre las entidades. De la
misma forma que habíamos hecho el get.
– En este caso vamos a almacenar el acceso a este
geometría en la variable geomB
– OJO: Aquí realmente no se guarda la geometría, sino la
dirección interna que usa el ordenador para saber dónde
está almacenada. Una vez acabemos de usar el set de
datos en el for esta dirección dará error. Hay otras formas
de hacer esto si quisiéramos guardar la geometría.
...
setB = fsB.getFeatureSet()
for fB in setB:
geomB = fB.getDefaultGeometry()
...
65. 65
Proceso a desarrollar
Solución 2: Trabajando con geometrías
● 2.1 Acceso a las geometrías
– 2.1.2. Una vez hemos
accedido a la geometría
tenemos una gran cantidad de
métodos para usar según el
tipo de geometría que sea. Por
ejemplo, al ser polígono
podemos usar el cálculo de su
extensión con area() o su
centroide con centroid().
– En consola vemos el area y el
centroide.
– OJO: El area la calcula con las
unidades de la capa. Si no es
una capa en metros tipo UTM
no será correcto este cálculo.
66. 66
Proceso a desarrollar
Solución 2: Trabajando con geometrías
● 2.1 Acceso a las
geometrías
– 2.1.3. Para buscar la
intersección de cada
punto con cada región,
tenemos que recorrer por
cada región todos los
puntos que se encuentran
en la otra capa, la capa de
puntos se recorrerá
muchas veces.
– Cada vez que gastamos
un set (cuando acabamos
de recorrerlo)
desaparecen de memoria.
Así que si queremos
usarlo de nuevo tenemos
que llamarlo otra vez.
67. 67
Proceso a desarrollar
Solución 2: Trabajando con geometrías
● 2.1 Acceso a las geometrías
– 2.1.4. En resumen, cogemos una región (poligono) y
comprobamos si algún punto intersecciona con esa región.
– La intersección la conseguimos con dos geometrías y el
método intersects(..).
– Las geometrías tienen este método y el parámetro que le
pasamos es otra geometría.
– El método intersects devuelve True si hay intersección, y
False si no la hay
– Metiendo un condicional hacemos que solo se ejecute lo
de dentro cuando encuentre una intersección.
68. 68
Proceso a desarrollar
Solución 2: Trabajando con geometrías
● 2.1 Acceso a las geometrías
– 2.1.5. ..(sigue explicación)
– Cuando encuentra una intersección, salta un valor
True, y la condición if True: se cumple. Entonces,
se ejecuta el print. En el print estaría mostrando las
dos entidades que interseccionan.
– Le hemos dicho que muestre valores de la entidad
fB, luego añada un “ con “, y entonces muestre el
punto que intersecta (fA).
Running script script02.
3, 13, AMAZONAS, NORTE, Polygon:2DM con 101, , POINT (-58.81266572531654
-3.952878786125586)
EntidadB interseca con EntidadA
69. 69
Proceso a desarrollar
Solución 3: Editar entidades
● 3.1 Editando las entidades
– 3.1.1 Una vez encontrado la región con la que
intersecan los puntos, hay que actualizar el
campo del punto, por el campo deseado de la
región.
Campo fieldA del punto
actualizarlo con el
Campo fieldB de la región (polígono)
70. 70
Proceso a desarrollar
Solución 3: Editar entidades
● 3.1 Editando las entidades
– 3.1.2 Primero hay que poner en edición la capa
de puntos. Para actualizar una capa hay que
poner en edición tu almacen de datos. En este
caso el featureStore que tenemos en fsA.
– Añadiríamos esta línea antes del primer bucle
(for)
71. 71
Proceso a desarrollar
Solución 3: Editar entidades
● 3.1 Editando las entidades
– 3.1.3. Siempre que editamos
capas no podemos correr el
riesgo de que, si ocurre un error,
se quede la capa en modo de
edición.
– Desde código vamos a
solucionar esto con un try/finally.
– Esto significa que, si ocurre
algún error de código, sea lo
que sea, terminará la edición de
la capa después de que ocurra
el error
– El código se quedaría como
aquí.
– Ten cuidado con la indentación
– Solo quedaría completar el
código donde aparece el pass
# encoding: utf-8
import gvsig
def main(*args):
capaA = "puntos_brasil"
capaB = "UFEBRASIL"
fieldA = "UFE"
fieldB = "NM_ESTADO"
try:
view = gvsig.currentView()
lyrA = view.getLayer(capaA)
lyrB = view.getLayer(capaB)
fsA = lyrA.getFeatureStore()
fsB = lyrB.getFeatureStore()
setB = fsB.getFeatureSet()
fsA.edit()
for fB in setB:
geomB = fB.getDefaultGeometry()
setA = fsA.getFeatureSet()
for fA in setA:
geomA = fA.getDefaultGeometry()
if geomB.intersects(geomA):
pass
finally:
fsA.finishEditing()
72. 72
Proceso a desarrollar
Solución 3: Editar entidades
● 3.1 Editando las entidades
– 3.1.4. Editar entidades: Queremos actualizar fA con valores de fB.
– 1) Obtenemos el valor a actualizar de la región (entidad fB) con:
v = fB.get(fieldB)
– 2) Obtenemos una entidad que podamos editar de la capa de puntos
(editable feature A (efA)) con:
efA = fA.getEditable()
– 3) Modificamos con el valor (v) el campo deseado (fieldA) en esa entidad
ahora editable (efA):
efA.set(fieldA, v)
– 4) Actualizamos el set de datos (setA) con la entidad editable (efA) para que
se modifiquen los valores:
setA.update(efA)
– 5) Todo lo anterior no se grabará si no cerramos la edición del almacen de la
capa. Eso se debe realizar solo al acabar de hacer todas las
modificaciones:
fsA.finishEditing()
73. 73
Proceso a desarrollar
Solución 3: Editar entidades
● 3.1 Editando las entidades
– 3.1.5. Colocando este código, el script estaría
terminado y quedaría así: # encoding: utf-8
import gvsig
def main(*args):
capaA = "puntos_brasil"
capaB = "UFEBRASIL"
fieldA = "UFE"
fieldB = "NM_ESTADO"
try:
view = gvsig.currentView()
lyrA = view.getLayer(capaA)
lyrB = view.getLayer(capaB)
fsA = lyrA.getFeatureStore()
fsB = lyrB.getFeatureStore()
setB = fsB.getFeatureSet()
fsA.edit()
for fB in setB:
geomB = fB.getDefaultGeometry()
setA = fsA.getFeatureSet()
for fA in setA:
geomA = fA.getDefaultGeometry()
if geomB.intersects(geomA):
v = fB.get(fieldB)
efA = fA.getEditable()
efA.set(fieldA, v)
setA.update(efA)
finally:
fsA.finishEditing()
74. 74
Proceso a desarrollar
Solución 4: Ejecución
● 4.1. Resultado
– 4.1.1 Si ejecutamos el script final, veremos que se
actualiza la tabla de de Atributos de puntos_brasil
– Nota: para acceder a la Tabla de Atributos, click
derecho sobre la capa y “Tabla de Atributos”
75. 75
Proceso a desarrollar
Solución 4: Ejecución
● 4.1. Resultado
– 4.1.2. Si lo ejecutamos con los campos: fieldA=”UFE”,
fieldB=”NM_ESTADO” veremos como cambian los
datos.
– Es posible que tengas que cerrar y abrir la tabla de
Atributos para actualizar la visualización
76. 76
Proceso a desarrollar
Solución 4: Ejecución
● 4.1. Resultado
– 4.1.3. Ahora con los campos: fieldA=”UFE”,
fieldB=”NM_REGIAO” veremos como cambian los
datos.
78. 78
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.1 Crear un script nuevo:
– script03
79. 79
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.2 Import al inicio del scripts necesarios
# encoding: utf-8
import gvsig
from gvsig import geom
from gvsig.commonsdialog import *
from gvsig.libs.toolbox import *
from es.unex.sextante.gui import core
from es.unex.sextante.gui.core import NameAndIcon
from es.unex.sextante.gui.core import SextanteGUI
from org.gvsig.geoprocess.lib.api import GeoProcessLocator
80. 80
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.3 Implementar una clase nueva CopyAttributeProcess con
dos métodos:
class CopyAttributeProcess(ToolboxProcess):
def defineCharacteristics(self):
..
def processAlgorithm(self):
..
81. 81
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.4 Definir parámetros de entrada.
– Nombre del proceso en self.setName(), aparecerá en
la toolbox
– Grupo al que pertenecerá
– Establecer el nombre del parámetro, la descripción, el
tipo, y si es de uso obligatorio.
def defineCharacteristics(self):
"""Definir los parametros de entrada y salida de nuestro proceso. """
# Fijamos el nombre con el que se va a mostrar nuestro proceso
self.setName("Actualizar atributo con capa con la que interseca")
# Indicamos el grupo en el que aparecera
self.setGroup("Vectorial")
params = self.getParameters()
# Indicamos que precisamos un parametro LAYER, del tipo poligono y que es obligatorio
params.addInputVectorLayer("LAYER A","Capa a actualizar",SHAPE_TYPE_POINT , True)
params.addInputVectorLayer("LAYER B",u"Capa de intersección", SHAPE_TYPE_POLYGON, True)
params.addTableField("FIELD A", "Campo a actualizar", "LAYER A", True)
params.addTableField("FIELD B", u"Campo de intersección", "LAYER B", True)
82. 82
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.5 Definir proceso
– Podemos casi copiar y pegar el proceso anterior realizado, con lo siguientes
cambios.
– Captura de parámetros a través de la interfaz: Ahora en vez de devolvernos el
nombre, ya nos devuelve directamente el almacén de datos (store)
– Eliminariamos el view, lyrA y lyrB que teníamos del script anterior
– Capturamos los parámetros a traves del params = self.getParameters(), este se
encarga de capturar los datos de la interfaz seleccionados por el usuario.
– Diferencia: los campos los almacena con la posición en el esquema de la capa.
No afecta a nuestro código ya que el método fB.get(“nombreField”) también
admite que le pases un número con fB.get(posicion).
def processAlgorithm(self):
""" Esta operacion es la encargada de realizar nuestro
proceso. """
params = self.getParameters()
lyrA = params.getParameterValueAsVectorLayer("LAYER A")
lyrB = params.getParameterValueAsVectorLayer("LAYER B")
fieldA = params.getParameterValueAsInt("FIELD A")
fieldB = params.getParameterValueAsInt("FIELD B")
try:
#view = gvsig.currentView()
#lyrA = view.getLayer(capaA)
#lyrB = view.getLayer(capaB)
...
83. 83
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.6 Definir proceso
– El código completo del método processAlgorithm
quedaría así.
def processAlgorithm(self):
""" Esta operacion es la encargada de realizar nuestro proceso. """
params = self.getParameters()
lyrA = params.getParameterValueAsVectorLayer("LAYER A")
lyrB = params.getParameterValueAsVectorLayer("LAYER B")
fieldA = params.getParameterValueAsInt("FIELD A")
fieldB = params.getParameterValueAsString("FIELD B")
try:
#view = gvsig.currentView()
#lyrA = view.getLayer(capaA)
#lyrB = view.getLayer(capaB)
fsA = lyrA.getFeatureStore()
fsB = lyrB.getFeatureStore()
setB = fsB.getFeatureSet()
fsA.edit()
for fB in setB:
geomB = fB.getDefaultGeometry()
setA = fsA.getFeatureSet()
for fA in setA:
geomA = fA.getDefaultGeometry()
if geomB.intersects(geomA):
v = fB.get(fieldB)
efA = fA.getEditable()
efA.set(fieldA, v)
setA.update(efA)
finally:
fsA.finishEditing()
return True
84. 84
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.7 Registar geoproceso
– La función main contendrá el registro del geoproceso
– Este código lo que hace es introducir el proceso en la
Toolbox
– Una vez lo tenemos todo en el script lo podemos
ejecutar.
def main(*args):
# Creamos nuesto geoproceso
process = CopyAttributeProcess()
# Lo registramos entre los procesos disponibles en el grupo de "Scripting"
process.selfregister("Scripting")
# Actualizamos el interface de usuario de la Toolbox
process.updateToolbox()
print “Proceso registrado”
85. 85
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.8 Comprobación
– Aparece en la Caja de Herramientas (Toolbox)
86. 86
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.9 Comprobación del Interfaz
– Tiene la interfaz correcta para los parámetros
introducidos.
87. 87
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.10 Ejecución correcta
– Comprobar que actualiza los campos deseados
88. 88
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.11 Autorun
– Si queremos que el proceso se añada a gvSIG cada vez
que este arranque, deberíamos de crear unos ficheros
extras dentro de nuestro paquete:
● Fichero __init__.py que puede estar vacio
● Fichero autorun.py que se ejecutará automáticamente
al abrir gvSIG
89. 89
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.12 Autorun
– El fichero autorun tendrá un import de la clase del
geoproceso que hemos creado
– La ejecución del registro que en el anterior script estaba en
la función main.
90. 90
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.13 Autorun
– En el código de ejemplo que se adjunta como parte de
este taller, el fichero autorun no se ejecuta ya que está
desactivado, y gvSIG lo ignora al iniciarse. Este se puede
activar desde la pestaña de propiedades.
92. 92
Integración en la Caja de Herramientas
Acceso con gvpy
● 6. Objetivo de gvpy:
– Permitir la ejecución de los geoprocesos que se
encuentran en la Toolbox de forma sencilla desde
scripting.
– Se ejecutan con una única línea de código
93. 93
Integración en la Caja de Herramientas
Acceso con gvpy
● 6.1 Crear un script nuevo:
– script04
94. 94
Integración en la Caja de Herramientas
Acceso con gvpy
● 6.2 Script para lanzar el proceso con gvpy
● Ojo: Por un bug esto no funcionará para este
proceso (al no tener capas de salida ocurre un
error).
Se ha corregido y estará para la próxima gvSIG
2.4 por eso lo enseño de todas formas.
95. 95
Integración en la Caja de Herramientas
Acceso con gvpy
● 6.3 Script para lanzar el proceso con gvpy
El código necesario para ejecutar el proceso
desde otro script, una vez estuviera ya en la Caja
de Geoprocesos
# encoding: utf-8
import gvsig
from gvsig.libs import gvpy
def main(*args):
v = gvpy.runalg("CopyAttributeProcess", "puntos_brasil", "UFEBRASIL", 1, 3)