[Gvsig_usuarios] Expresiones avanzadas calculadora de campos

Enrique Lorenzo enrique.lorenzo en geodilab.org
Mar Abr 5 10:34:52 CEST 2011


Yo también tenía interés en ver cómo funciona la expresión "Avanzada". Te
explico mi prueba paso a paso; muchos pasos son obvios pero los indico por
si otras personas quieren hacer el ejemplo completo:

Tres etapas A,  B y C:

A- Preparar un archivo vectorial: para este ejemplo he preparado un pequeño
MDT en formato Shape, con cuatro campos:
X: doble
Y: doble
Z: doble
Tipo: texto, de 20 caracteres

B- Guardar en un archivo clasificaPuntos.py el siguiente código Python (ya
sabes que es imprescindible respetar sangrados y mayúsculas/minúsculas; las
comillas simples pueden ser comillas dobles si se prefieren. En este caso es
puro Python, no se utiliza ningún objeto Java del modelo de objetos de
gvSIG. el archivo puede contener tantas funciones como quieras, de forma que
podría constituir una biblioteca propia de funciones):

# Definicion de una funcion que clasifica puntos segun su altitud
# Licencia GPL v. 3.0
# CopyLeft enrique.lorenzo en geodilab.org

def clasificaPuntos(zeta):
    if zeta > 1000:
        tipoPunto = 'Yo ahi no subo'
    if zeta <= 1000 and zeta >800:
        tipoPunto = 'Medio'
    if zeta <=800:
        tipoPunto = 'Bajito'
    return tipoPunto

C- Aplicación de la función:

1- Cargar la capa vectorial
2- Comenzar edición.
3- Abrir la tabla de atributos y seleccionar el campo Tipo.
4- Menú Campo>Expresión
5- Pestaña Avanzada: seleccionar el archivo que contiene la función Python
ClasificaPuntos.py
6- Pestaña General: escribir clasificaPuntos([Z])
7- Aplicar

Algunos comentarios:
- En el paso 6, cuidado con las mayúsculas/minúsculas.
- Imprescindible respetar los sangrados (cuatro u ocho espacios). No mezclar
tabuladores con espacios en los sangrados.
- No escribo tildes en los comentarios porque no he declarado la
codificación de caracteres del archivo py con una línea al principio (# -*-
coding: cp1252 -*-); solo se usan caracteres ASCII, para simplificar.
- También por simplificar no he añadido la primera línea de declaración del
entorno de ejecución de Python para Linux (#! /usr/bin/env python).
- La función va leyendo el valor del campo Z, se lo pasa como parámetro a la
función, la función devuelve el resultado para ese valor de Z, y guarda ese
resultado en el campo seleccionado en la calculadora. Este tipo de código
servirá para Linux, Windows y Mac tal como está.

Espero que te sirva. Geosaludos.

Enrique Lorenzo
www.geodilab.org


El 5 de abril de 2011 00:17, HUMBERTO NEL FLOREZ RAMOS <
hnflorezramos en gmail.com> escribió:

> Alejandro Buenas Tarde.
>
> Seria mucha molestia si me regalas unas indicaciones de como usaste el
> código de python en gvsig. He tratado de hacerlo con las indicaciones que te
> dieron pero no hace nada...y lo peor es que enuncia ningún error o algo que
> me oriente.
>
> Muchas gracias y disculpa...
>
> El 2 de marzo de 2011 11:40, Alejandro Lorenzo (Genea Consultores) <
> algil en geneaconsultores.com> escribió:
>
>>
>> Hola a todos,
>>
>> Muchas gracias por el código, me funcionó a la perfección.
>>
>>
>> Un saludo  y muchas gracias
>>
>>
>>
>>
>> El 01/02/2011 17:00, "Jose Manuel Vivó Arnal ( Chema )" escribió:
>>
>> Hola Alejandro.
>>
>>
>> El 01/02/11 11:07, Alejandro Lorenzo (Genea Consultores) escribió:
>>
>> Hola,
>>
>> Estoy comenzando con gvSIG, concretamente con la calculadora de campos.
>>
>> Me encuentro en que la forma de trabajar con expresiones avanzadas, es en
>> Phyton, y no conozco este lenguaje.
>>
>> Intenté convertir mis expresiones de vb a Phyton. En la página
>> http://vb2py.sourceforge.net/index.html, existe un convertidor de código
>> de vb a Phyton y este es el resultado:
>>
>> prueba = str()
>>
>> if [EMPRESA_CO] == 'XXX' and [Ejecutado] == 'SI':
>>
>>  [prueba] = 'Correcto'
>>
>> elif  [EMPRESA_CO] == 'XXX' and [Ejecutado] == 'NO':
>>
>> [prueba] = 'Inorrecto'
>>
>> else:
>>
>> prueba = '_'
>>
>> Genero el fichero .py, pero no funciona.
>>
>> Me da la impresión que lo que te estás equivocando es en la forma de
>> aplicar la expresión.
>>
>> Prueba con esto:
>>
>> def miPrueba(EMPRESA_CO,Ejecutado):
>>   prueba = '_'
>>   if EMPRESA_CO == 'XXX' and Ejecutado == 'SI':
>>     prueba = 'Correcto'
>>   elif EMPRESA_CO == 'XXX' and Ejecutado == 'NO':
>>     prueba = 'Inorrecto'
>>   return prueba
>>
>> miPrueba([EMPRESA_CO],[Ejecutado])
>>
>>
>> Nota: MUUUCHO OJO con los sangrados, en python (bueno, realmente es jython
>> ya que es el port de pyhton a java) sirven apara delimitar la expresiones
>> (no hay "end if" ni llaves "{}")
>>
>> Como ves, he definido una función "insitu" que me ha ayudado. También
>> puedes definir varias funciones y meterlas en un fichero ".py" y cargarlas
>> desde la pestaña "avanzado" de la calculadora.
>>
>> Siempre tienes que tener en cuenta que, la expresión de la calculadora,
>> espera que el resultado sea un valor.
>>
>> Si quieres saber más, mira la documentación de python de la versión de
>> gvSIG (creo que es la 2.4.2) que la puedes encontrar aquí:
>>
>> http://docs.python.org/release/2.4.2/
>>
>>
>>
>> Lo que me gustaría sería conseguir una expresión condicional que evaluase
>> dos, o más campos, y en función del valor de los registros, rellenar un
>> nuevo campo con los valores asignados a cada una de las combinaciones
>> anteriores.
>>
>> Muchas gracias
>>
>> Alejandro
>>
>>
>> _______________________________________________
>> gvSIG_usuarios mailing listgvSIG_usuarios en listserv.gva.es
>>
>> Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección:
>> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios
>>
>>
>> Espero que te sea de ayuda.
>>
>> Un Saludo.
>> Chema.
>>
>> --
>> Jose Manuel Vivó Arnal
>> DiSiD Technologies S.L. (http://www.disid.com)
>>
>>
>> _______________________________________________
>> gvSIG_usuarios mailing listgvSIG_usuarios en listserv.gva.es
>>
>> Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección:
>> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios
>>
>>
>> --
>>
>>
>>
>>
>>
>>
>>
>> ______________________________________________________________________________________________________________________________________________________________
>>
>>
>>  <http://www.geneaconsultores.com/>
>> Alejandro Lorenzo Gil
>> Director de Proyectos
>> Consultor Forestal
>>
>> Genea Consultores
>> Seguidillas, 9 2ºB. Edf. Volcán de las Arenas
>> 38107 • Santa Cruz de Tenerife
>> Lat. 28º 26' 36'' N Long. 16º 18' 48'' O<http://maps.google.es/maps?f=q&source=s_q&hl=es&geocode=&q=Calle+de+las+Seguidillas,+Santa+Cruz+de+Tenerife&sspn=0.00259,%0A0.004823&ie=UTF8&hq=&hnear=Calle+de+las+Seguidillas,+38107+Santa+Cruz+de+Tenerife,+Islas+Canarias&ll=28.444629,-16.312122&spn=0.006122,%0A0.011362&z=17&iwloc=lyrftr:m,2105705247863386081,28.44327,-16.313453>
>>
>> Teléfono móvil: 626 990 662
>> Teléfono fijo: 988 271 118 / 922 620 652
>>
>> _______________________________________________
>> gvSIG_usuarios mailing list
>> gvSIG_usuarios en listserv.gva.es
>>
>> Para ver histórico de mensajes, editar sus preferencias de usuario o darse
>> de baja en esta lista, acuda a la siguiente dirección:
>>
>> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios
>>
>>
>
>
> --
> Humberto Nel Florez Ramos
> Ing. Catastral y Geodesta
> Esp en Medio Ambiente y Geoinformatica
>
> _______________________________________________
> gvSIG_usuarios mailing list
> gvSIG_usuarios en listserv.gva.es
>
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse
> de baja en esta lista, acuda a la siguiente dirección:
>
> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_usuarios/attachments/20110405/1c6efd8c/attachment.htm 


Más información sobre la lista de distribución gvSIG_usuarios