SlideShare una empresa de Scribd logo
1 de 96
Descargar para leer sin conexión
1
Taller de Scripting en gvSIG
Óscar Martínez
omartinez@gvsig.com
Twitter: @masquesig
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
3
Preparación del proyecto
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
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
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.
7
Iniciación al Módulo de Scripting
Preparación del proyecto
● Imagen inicial de gvSIG
8
Iniciación al Módulo de Scripting
Preparación del proyecto
● Creación de una Vista
9
Iniciación al Módulo de Scripting
Preparación del proyecto
● Propiedades de la Vista: Modificar proyección a EPSG:4674
10
Iniciación al Módulo de Scripting
Preparación del proyecto
● Comprobar la proyección de la Vista
11
Iniciación al Módulo de Scripting
Preparación del proyecto
● Añadir capas de trabajo. La ruta estará dentro del addon
12
Ejecutar tu primer script
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
Iniciación al Módulo de Scripting
Ejecución de tu primer script
● Editor de scripts. Donde haremos todo el trabajo de
desarrollo.
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
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
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
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
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
20
Nociones básicas de Python
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
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
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
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
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
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
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
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
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
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()
31
Funcionalidades del Módulo de
Scripting
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
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Teniendo el script anterior abierto. Tal que así:
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
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
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
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
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.
39
Iniciación al Módulo de Scripting
Funcionalidades del Módulo de Scripting
● Javadocs:
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
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
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
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
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.
45
Proceso a desarrollar
46
Proceso a desarrollar:
Problema
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
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.
49
Proceso a desarrollar
Problema
● Planteamiento:
– Capa de polígonos y sus valores
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
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
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.
53
Proceso a desarrollar:
Solución
54
Proceso a desarrollar
Solución 1: Acceso a datos
● 1.1. Crear un script nuevo:
– script02
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
77
Integración en la Caja de Herramientas
78
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.1 Crear un script nuevo:
– script03
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
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
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
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
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
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
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.8 Comprobación
– Aparece en la Caja de Herramientas (Toolbox)
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
Integración en la Caja de Herramientas
Creación del geoproceso
● 5.10 Ejecución correcta
– Comprobar que actualiza los campos deseados
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
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
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.
91
Acceso desde gvpy
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
Integración en la Caja de Herramientas
Acceso con gvpy
● 6.1 Crear un script nuevo:
– script04
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
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)
96
info@gvsig.com
www.gvsig.com
blog.gvsig.com
Óscar Martínez
omartinez@gvsig.com
Twitter: @masquesig

Más contenido relacionado

La actualidad más candente (20)

Primeros Pasos en PyQt4
Primeros Pasos en PyQt4Primeros Pasos en PyQt4
Primeros Pasos en PyQt4
 
Python para todos
Python para todosPython para todos
Python para todos
 
Lenguaje c
Lenguaje c Lenguaje c
Lenguaje c
 
Semana 2 Fundamentos de Python(Variables)
Semana 2   Fundamentos de Python(Variables)Semana 2   Fundamentos de Python(Variables)
Semana 2 Fundamentos de Python(Variables)
 
Exposición Python
Exposición PythonExposición Python
Exposición Python
 
Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015
 
Pucela testingdays testing_en_php
Pucela testingdays testing_en_phpPucela testingdays testing_en_php
Pucela testingdays testing_en_php
 
TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2
 
Tutorial de Python
Tutorial de PythonTutorial de Python
Tutorial de Python
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Python (Lenguaje de Programación)
Python (Lenguaje de Programación)Python (Lenguaje de Programación)
Python (Lenguaje de Programación)
 
Javascript + Angular Sesion 2
Javascript + Angular Sesion 2Javascript + Angular Sesion 2
Javascript + Angular Sesion 2
 
Introduccion a Python
Introduccion a PythonIntroduccion a Python
Introduccion a Python
 
Paralela10
Paralela10Paralela10
Paralela10
 
Introducción a la programación del amigo bot
Introducción a la programación del amigo botIntroducción a la programación del amigo bot
Introducción a la programación del amigo bot
 
Introduccion a MPI
Introduccion a MPIIntroduccion a MPI
Introduccion a MPI
 
Intro Python
Intro PythonIntro Python
Intro Python
 
Articulo Python
Articulo PythonArticulo Python
Articulo Python
 
Introducción a testing en php
Introducción a testing en phpIntroducción a testing en php
Introducción a testing en php
 
Hx c27
Hx c27Hx c27
Hx c27
 

Similar a Taller de Introducción a Scripting con gvSIG

Giseproi curso de programación - sesión 8 - ejemplo de creacion de un programa
Giseproi   curso de programación - sesión 8 - ejemplo de creacion de un programaGiseproi   curso de programación - sesión 8 - ejemplo de creacion de un programa
Giseproi curso de programación - sesión 8 - ejemplo de creacion de un programagiseproi
 
Primeros pasos con Python: Manipulando imágenes ⟷
Primeros pasos con Python: Manipulando imágenes ⟷Primeros pasos con Python: Manipulando imágenes ⟷
Primeros pasos con Python: Manipulando imágenes ⟷Rodolfo Ferro
 
La estructura básica para C++
La estructura básica para C++La estructura básica para C++
La estructura básica para C++LorenaCMtz
 
La estructura basica_para_c_
La estructura basica_para_c_La estructura basica_para_c_
La estructura basica_para_c_GamePlayer35
 
Manual de python
Manual de pythonManual de python
Manual de pythonULEAM
 
Conociendo los Lenguajes de Programacion
Conociendo los Lenguajes de ProgramacionConociendo los Lenguajes de Programacion
Conociendo los Lenguajes de Programacionsandra gutierrez
 
Symfony2 Formacion y primeros pasos
Symfony2  Formacion y primeros pasosSymfony2  Formacion y primeros pasos
Symfony2 Formacion y primeros pasosSoni BM
 
Ejemplos de pseudocódigo
Ejemplos de pseudocódigoEjemplos de pseudocódigo
Ejemplos de pseudocódigoLiliana Nieto
 
Conceptos básicos y aplicaciones prácticas de programación para SEO
Conceptos básicos y aplicaciones prácticas de programación para SEOConceptos básicos y aplicaciones prácticas de programación para SEO
Conceptos básicos y aplicaciones prácticas de programación para SEOnacho mascort
 
PASOS PARA LA SOLUCION DE PROBLEMAS - HTML
PASOS PARA LA SOLUCION DE PROBLEMAS - HTMLPASOS PARA LA SOLUCION DE PROBLEMAS - HTML
PASOS PARA LA SOLUCION DE PROBLEMAS - HTMLfelipeforero72
 
Introducción al curso de C.docx
Introducción al curso de C.docxIntroducción al curso de C.docx
Introducción al curso de C.docxNidia Castro Campo
 

Similar a Taller de Introducción a Scripting con gvSIG (20)

Pseint
PseintPseint
Pseint
 
Giseproi curso de programación - sesión 8 - ejemplo de creacion de un programa
Giseproi   curso de programación - sesión 8 - ejemplo de creacion de un programaGiseproi   curso de programación - sesión 8 - ejemplo de creacion de un programa
Giseproi curso de programación - sesión 8 - ejemplo de creacion de un programa
 
Primeros pasos con Python: Manipulando imágenes ⟷
Primeros pasos con Python: Manipulando imágenes ⟷Primeros pasos con Python: Manipulando imágenes ⟷
Primeros pasos con Python: Manipulando imágenes ⟷
 
Redes
RedesRedes
Redes
 
Pseint tutorial
Pseint tutorialPseint tutorial
Pseint tutorial
 
La estructura básica para C++
La estructura básica para C++La estructura básica para C++
La estructura básica para C++
 
La estructura basica_para_c_
La estructura basica_para_c_La estructura basica_para_c_
La estructura basica_para_c_
 
Vim python-mode
Vim python-modeVim python-mode
Vim python-mode
 
Manual de python
Manual de pythonManual de python
Manual de python
 
Conociendo los Lenguajes de Programacion
Conociendo los Lenguajes de ProgramacionConociendo los Lenguajes de Programacion
Conociendo los Lenguajes de Programacion
 
Symfony2 Formacion y primeros pasos
Symfony2  Formacion y primeros pasosSymfony2  Formacion y primeros pasos
Symfony2 Formacion y primeros pasos
 
Ejemplos de pseudocódigo
Ejemplos de pseudocódigoEjemplos de pseudocódigo
Ejemplos de pseudocódigo
 
PESEINT MANUAL
PESEINT MANUALPESEINT MANUAL
PESEINT MANUAL
 
Dia1
Dia1Dia1
Dia1
 
Conceptos básicos y aplicaciones prácticas de programación para SEO
Conceptos básicos y aplicaciones prácticas de programación para SEOConceptos básicos y aplicaciones prácticas de programación para SEO
Conceptos básicos y aplicaciones prácticas de programación para SEO
 
PASOS PARA LA SOLUCION DE PROBLEMAS - HTML
PASOS PARA LA SOLUCION DE PROBLEMAS - HTMLPASOS PARA LA SOLUCION DE PROBLEMAS - HTML
PASOS PARA LA SOLUCION DE PROBLEMAS - HTML
 
Informatica
InformaticaInformatica
Informatica
 
Introducción al curso de C.docx
Introducción al curso de C.docxIntroducción al curso de C.docx
Introducción al curso de C.docx
 
Manual del uso de codeblocks
Manual del uso de codeblocksManual del uso de codeblocks
Manual del uso de codeblocks
 
Informe#10
Informe#10Informe#10
Informe#10
 

Último

Data Warehouse.gestion de bases de datos
Data Warehouse.gestion de bases de datosData Warehouse.gestion de bases de datos
Data Warehouse.gestion de bases de datosssuser948499
 
La importancia de las pruebas de producto para tu empresa
La importancia de las pruebas de producto para tu empresaLa importancia de las pruebas de producto para tu empresa
La importancia de las pruebas de producto para tu empresamerca6
 
Unidad 3 Elementos y compuestos. Física y química
Unidad 3 Elementos y compuestos. Física y químicaUnidad 3 Elementos y compuestos. Física y química
Unidad 3 Elementos y compuestos. Física y químicaSilvia García
 
bases-cye-2024(2) una sola descarga en base de feria de
bases-cye-2024(2) una sola descarga en base de feria debases-cye-2024(2) una sola descarga en base de feria de
bases-cye-2024(2) una sola descarga en base de feria deCalet Cáceres Vergara
 
tipos de organización y sus objetivos y aplicación
tipos de organización y sus objetivos y aplicacióntipos de organización y sus objetivos y aplicación
tipos de organización y sus objetivos y aplicaciónJonathanAntonioMaldo
 
LA LEY DE LAS XII TABLAS en el curso de derecho
LA LEY DE LAS XII TABLAS en el curso de derechoLA LEY DE LAS XII TABLAS en el curso de derecho
LA LEY DE LAS XII TABLAS en el curso de derechojuliosabino1
 
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,juberrodasflores
 
CUESTIONARIO A ADICCION A REDES SOCIALES.pdf
CUESTIONARIO A ADICCION A REDES SOCIALES.pdfCUESTIONARIO A ADICCION A REDES SOCIALES.pdf
CUESTIONARIO A ADICCION A REDES SOCIALES.pdfEDUARDO MAMANI MAMANI
 
Las mujeres más ricas del mundo (2024).pdf
Las mujeres más ricas del mundo (2024).pdfLas mujeres más ricas del mundo (2024).pdf
Las mujeres más ricas del mundo (2024).pdfJC Díaz Herrera
 
El Teatro musical (qué es, cuál es su historia y trayectoria...)
El Teatro musical (qué es, cuál es su historia y trayectoria...)El Teatro musical (qué es, cuál es su historia y trayectoria...)
El Teatro musical (qué es, cuál es su historia y trayectoria...)estebancitoherrera
 
SUNEDU - Superintendencia Nacional de Educación superior Universitaria
SUNEDU - Superintendencia Nacional de Educación superior UniversitariaSUNEDU - Superintendencia Nacional de Educación superior Universitaria
SUNEDU - Superintendencia Nacional de Educación superior Universitariachayananazcosimeon
 
triptico-de-las-drogas en la adolescencia
triptico-de-las-drogas en la adolescenciatriptico-de-las-drogas en la adolescencia
triptico-de-las-drogas en la adolescenciaferg6120
 
HABILESASAMBLEA Para negocios independientes.pdf
HABILESASAMBLEA Para negocios independientes.pdfHABILESASAMBLEA Para negocios independientes.pdf
HABILESASAMBLEA Para negocios independientes.pdfGEINER22
 
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdfREPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdfIrapuatoCmovamos
 
Cuáles son las características biológicas que están marcadas en tu individual...
Cuáles son las características biológicas que están marcadas en tu individual...Cuáles son las características biológicas que están marcadas en tu individual...
Cuáles son las características biológicas que están marcadas en tu individual...israel garcia
 
Los artistas mexicanos con más ventas de discos en la historia (2024).pdf
Los artistas mexicanos con más ventas de discos en la historia (2024).pdfLos artistas mexicanos con más ventas de discos en la historia (2024).pdf
Los artistas mexicanos con más ventas de discos en la historia (2024).pdfJC Díaz Herrera
 
Critica 1 Grupo 10 RodrigoBenitez_GinaGadea_AlexisGonzález.pdf
Critica 1 Grupo 10 RodrigoBenitez_GinaGadea_AlexisGonzález.pdfCritica 1 Grupo 10 RodrigoBenitez_GinaGadea_AlexisGonzález.pdf
Critica 1 Grupo 10 RodrigoBenitez_GinaGadea_AlexisGonzález.pdfRodrigoBenitez38
 
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdfPREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdfluisccollana
 
Técnica palatina baja, anestesiología dental
Técnica palatina baja, anestesiología dentalTécnica palatina baja, anestesiología dental
Técnica palatina baja, anestesiología dentalIngrid459352
 
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdfREPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdfIrapuatoCmovamos
 

Último (20)

Data Warehouse.gestion de bases de datos
Data Warehouse.gestion de bases de datosData Warehouse.gestion de bases de datos
Data Warehouse.gestion de bases de datos
 
La importancia de las pruebas de producto para tu empresa
La importancia de las pruebas de producto para tu empresaLa importancia de las pruebas de producto para tu empresa
La importancia de las pruebas de producto para tu empresa
 
Unidad 3 Elementos y compuestos. Física y química
Unidad 3 Elementos y compuestos. Física y químicaUnidad 3 Elementos y compuestos. Física y química
Unidad 3 Elementos y compuestos. Física y química
 
bases-cye-2024(2) una sola descarga en base de feria de
bases-cye-2024(2) una sola descarga en base de feria debases-cye-2024(2) una sola descarga en base de feria de
bases-cye-2024(2) una sola descarga en base de feria de
 
tipos de organización y sus objetivos y aplicación
tipos de organización y sus objetivos y aplicacióntipos de organización y sus objetivos y aplicación
tipos de organización y sus objetivos y aplicación
 
LA LEY DE LAS XII TABLAS en el curso de derecho
LA LEY DE LAS XII TABLAS en el curso de derechoLA LEY DE LAS XII TABLAS en el curso de derecho
LA LEY DE LAS XII TABLAS en el curso de derecho
 
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
 
CUESTIONARIO A ADICCION A REDES SOCIALES.pdf
CUESTIONARIO A ADICCION A REDES SOCIALES.pdfCUESTIONARIO A ADICCION A REDES SOCIALES.pdf
CUESTIONARIO A ADICCION A REDES SOCIALES.pdf
 
Las mujeres más ricas del mundo (2024).pdf
Las mujeres más ricas del mundo (2024).pdfLas mujeres más ricas del mundo (2024).pdf
Las mujeres más ricas del mundo (2024).pdf
 
El Teatro musical (qué es, cuál es su historia y trayectoria...)
El Teatro musical (qué es, cuál es su historia y trayectoria...)El Teatro musical (qué es, cuál es su historia y trayectoria...)
El Teatro musical (qué es, cuál es su historia y trayectoria...)
 
SUNEDU - Superintendencia Nacional de Educación superior Universitaria
SUNEDU - Superintendencia Nacional de Educación superior UniversitariaSUNEDU - Superintendencia Nacional de Educación superior Universitaria
SUNEDU - Superintendencia Nacional de Educación superior Universitaria
 
triptico-de-las-drogas en la adolescencia
triptico-de-las-drogas en la adolescenciatriptico-de-las-drogas en la adolescencia
triptico-de-las-drogas en la adolescencia
 
HABILESASAMBLEA Para negocios independientes.pdf
HABILESASAMBLEA Para negocios independientes.pdfHABILESASAMBLEA Para negocios independientes.pdf
HABILESASAMBLEA Para negocios independientes.pdf
 
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdfREPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
 
Cuáles son las características biológicas que están marcadas en tu individual...
Cuáles son las características biológicas que están marcadas en tu individual...Cuáles son las características biológicas que están marcadas en tu individual...
Cuáles son las características biológicas que están marcadas en tu individual...
 
Los artistas mexicanos con más ventas de discos en la historia (2024).pdf
Los artistas mexicanos con más ventas de discos en la historia (2024).pdfLos artistas mexicanos con más ventas de discos en la historia (2024).pdf
Los artistas mexicanos con más ventas de discos en la historia (2024).pdf
 
Critica 1 Grupo 10 RodrigoBenitez_GinaGadea_AlexisGonzález.pdf
Critica 1 Grupo 10 RodrigoBenitez_GinaGadea_AlexisGonzález.pdfCritica 1 Grupo 10 RodrigoBenitez_GinaGadea_AlexisGonzález.pdf
Critica 1 Grupo 10 RodrigoBenitez_GinaGadea_AlexisGonzález.pdf
 
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdfPREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
 
Técnica palatina baja, anestesiología dental
Técnica palatina baja, anestesiología dentalTécnica palatina baja, anestesiología dental
Técnica palatina baja, anestesiología dental
 
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdfREPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
 

Taller de Introducción a Scripting con gvSIG

  • 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.
  • 7. 7 Iniciación al Módulo de Scripting Preparación del proyecto ● Imagen inicial de gvSIG
  • 8. 8 Iniciación al Módulo de Scripting Preparación del proyecto ● Creación de una Vista
  • 9. 9 Iniciación al Módulo de Scripting Preparación del proyecto ● Propiedades de la Vista: Modificar proyección a EPSG:4674
  • 10. 10 Iniciación al Módulo de Scripting Preparación del proyecto ● Comprobar la proyección de la Vista
  • 11. 11 Iniciación al Módulo de Scripting Preparación del proyecto ● Añadir capas de trabajo. La ruta estará dentro del addon
  • 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.
  • 39. 39 Iniciación al Módulo de Scripting Funcionalidades del Módulo de Scripting ● Javadocs:
  • 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.
  • 49. 49 Proceso a desarrollar Problema ● Planteamiento: – Capa de polígonos y sus valores
  • 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.
  • 54. 54 Proceso a desarrollar Solución 1: Acceso a datos ● 1.1. Crear un script nuevo: – script02
  • 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.
  • 77. 77 Integración en la Caja de Herramientas
  • 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)