[Gvsig_usuarios] rellenar campos con una sintaxis string

Victor Acevedo vacevedo.gvsig.org en gmail.com
Lun Nov 19 12:39:11 CET 2012


El 19/11/12 10:04, pau maudos bonjoch escribió:

> Hola Victor,
>
> muchas gracias por tu respuesta. El script es casi valido, ya que caso de
> que haya más de un parentesis me tendria que quedar solo con el primer
> conjunto de 3 letras y no consigo plasmarlo en el codigo. Si pudieras
> sacarlo me seria clave para conseguirlo.
>
> Aun así  tengo muchas dudas:
> mi objetivo inicial era a partir de un shape de poligonos, en el que cada
> campo contiene estos codigos, crear otro campo nuevo con el resultado de
> las 3 primeras ocurrencias de letras en mayúsculas después de un
> paréntesis, y si no hay paréntesis, lo que sea que haya en la cadena.
> He provado desde calcular expresion y añadir el script pero gvSIG no lo
> detecta, no se immuta...
>
> entonces he visto que ejecutando el script, sí lo has conseguido y el
> resultado también seria válido, pero en la ejecución te lo ejecuto en toda
> un linia seguida y yo quisiera que me saliera el código del SIOSE,
> RESULTADO (salto de linia)
> siguiente codigo, resultado
> siguiente codigo, resultado
>
> otra cosa como lo has ejecutado, ¿mediante un compliador de Phyton? ¿Cual?
>
> Saludos y gracias de antemano,
>
> Pau
>
> PD: Si a otros usuarios se os ocurre como hacerlo promonerlo!
>

Hola Pau,

te cuento cosas. El script que te pasé en el otro correo estaba probado 
desde la extensión de scripting de gvsig 2.0, tal vez se me olvido 
comentártelo.

Si no la tienes instalada, puedes hacerlo desde el gestor de 
complementos, menú Herramientas/Administrador de complementos y luego en 
la instalación standard selecciona Scripting Framework.

Una vez que lo hayas instalado debes cerrar y volver a iniciar gvsig 
2.0. Cuando inicie, verás que en herramientas aparece una opción nueva 
que es Scripting, selecciona 'Scripting Composer'. En el editor de 
scripts selecciona 'File/New' y en el formulario rellena los datos, debe 
quedarte algo parecido a la imagen que te adjunto, sobre todo asegúrate 
que 'type' es script y 'languaje' es 'Python'. Acepta.
Por último abre el script que te adjunto desde un editor de notas y pega 
el contenido en el script en el editor, guarda el script desde el menú 
File/save o pulsando el botón guardar. Ya puedes ejecutarlo desde el 
menú File/Run.

He modificado el script para que se adapte a lo que entiendo que 
quieres. Ejecutado el nuevo código en los datos que pasaste obtengo
(7 primeras líneas)

Número de línea, código, resultado

0, I(90FDPpl_05FDC_05SNE), FDP
1, AAR(80EDFva_10CHLsc_10PRDsc), EDF
2, A(80MTR_10FDPpl_10SNE), MTR
3, FDPpl, FDPpl
4, A(70FDC_30MTR), FDC
5, AAR(70EDFva_10PRDsc_10CHLsc_10FDC), EDF
6, A(85FDPpl_10FDC_05SNE), FDP
7, FDC, FDC

También he añadido una parte para que lo puedas hacer directamente desde 
un shape. Para que funcione. la capa activa del toc de la vista tiene 
que ser la que quieres procesar.
Por último, no modifica el shape si no que crea uno nuevo, copia del que 
estés utilizando, al que añade un campo nuevo de tipo string en el que 
almacena el resultado obtenido. Este nuevo shape se guarda en 
'/tmp/codigosSIOSE.shp', si no es el sitio que quieres modifícalo en el 
código, en la función createLayer

{{{

def createLayer():
   """
   Crea un nuevo shape
   """
   ruta = '/tmp/codigosSIOSE.shp' #donde se guarda el sshape

}}}

El código básicamente hace lo siguiente:

- Obtiene la capa activa
- Pregunta el campo a procesar
- Crea un nuevo shape
- Obtiene los fenómenos de la capa activa
- Para cada fenómeno
   - Obtiene el valor del campo
   - Busca si hay un '('
     - Si encuentra un paréntesis busca 3 primeras mayúsculas después 
del '('
     - Si no guarda la línea
   - Crea una copia del fenómeno y añade el resultado anterior
   - Añade a la nueva capa el fenómeno modificado
- Libera recursos
- Termina

He probado el script usando un archivo de texto que almacena los códigos 
que pasaste, no lo he hecho desde un shape. Si no te funciona pásame el 
shape y lo compruebo.

Espero que te sirva.
Saludos,
Victor Acevedo

>



>
>
>
>
>
> 2012/11/16 Victor Acevedo <vacevedo.gvsig.org en gmail.com>
>
>> El 16/11/12 12:25, pau maudos bonjoch escribió:
>>
>>   Hola soy Pau
>>>
>>> Estoy trabajando con el código de SIOSE y quiero rellenar otro campo según
>>> una serie de parámetros que cito a posteriormente (un poco más abajo).
>>> Este codigo corresponde al SIOSE que catalogó los usos del suelo de
>>> España,
>>> pero la lió muchisima al querer poner demasiada información en un mismo
>>> poligono.
>>>
>>> El codigo es algo parecido a esto:
>>>
>>> I(90FDPpl_05FDC_05SNE)
>>> AAR(80EDFva_10CHLsc_10PRDsc)
>>> A(80MTR_10FDPpl_10SNE)
>>> FDPpl
>>> A(70FDC_30MTR)
>>> AAR(70EDFva_10PRDsc_10CHLsc_**10FDC)
>>> A(85FDPpl_10FDC_05SNE)
>>> FDC
>>> I(40PRDsc_40CHLsc_10FDC_**05EDFva_05VAP)
>>> A(60MTR_40FDPpl)
>>> I(35EDFvd_35UEN(45ZAU_35EDFvd_**20VAP)_15PAG(55SNE_35EDFnv_**
>>> 05OCT_05VAP)_15PRDsc)
>>> I(50PST_25ECM(75OCT_15ZAU_**10VAP)_25SNE)
>>> A(85CNFpl_15MTR)
>>> I(50FDC_40PRDsc_10EDFva)
>>> A(60MTR_30PST_10SNE)
>>> UEN(40EDFvd_40ZAU_20VAP)
>>> NRV(85VAP_15ZAU)
>>> A(70MTR_30SNE)
>>> I(75PRDsc_25IAS(80EDFnv_20ZEV)**)
>>> A(55MTR_30FDC_15SNE)
>>> A(80CNFpl_20MTR)
>>> I(70FDCfr_30ACU)
>>> I(55PRDsc_35MTRpc_05FDPpl_**05SNE)
>>> A(65MTRpc_35FDC)
>>> AAR(60EDFva_20PRDsc_10CHLsc_**10FDC)
>>> A(60FDC_30MTR_10SNE)
>>> I(35PRDsc_30LOCsc_25IAS(**50EDFnv_25VAP_20SNE_05ZAU)_**10EDFva)
>>> I(40PRDsc_25EDFva_25IAS(**80EDFnv_20VAP)_10UEN(80EDFvd_**20SNE))
>>> EDU(35OCT_35SNE_15EDFea_15VAP)
>>> I(60AAR(90EDFva_05PRDsc_**05CHLsc)_40PRDsc)
>>> I(35PRDsc_20CHLsc_20FDC_**10EDFva_10EDFnv_05VAP)
>>> I(80PRDsc_10CHLsc_05FDC_05VAP)
>>> AAR(70EDFva_10FDC_10CHLsc_**10PRDsc)
>>> I(40MTR_40FDC_20EDFva)
>>> FDC
>>> I(25AAR(EDFva)_25CHLsc_**25PRDsc_15FDC_10EDFva)
>>> I(30PRDsc_30EDFva_20AAR(**90EDFva_05PRDsc_05CHLsc)_**
>>> 10UEN(90EDFvd_05ZAU_05VAP)_**05FDC_05LOCsc)
>>> PAG(80ZEV_15EDFnv_05VAP)
>>> I(65PRDsc_20CHLsc_10VAP_05FDC)
>>> I(30PRDsc_30CHLsc_15EDFva_**10MTR_10PAG(80ZEV_20EDFnv)_**05VAP)
>>> A(75FDC_15PRDsc_10FDPpl)
>>> A(55MTR_40FDPpl_05SNE)
>>> A(70MTR_25CNFpl_05SNE)
>>> I(65PRDsc_25CHLsc_05FDC_**05EDFva)
>>> A(70CNFpl_15FDPpl_15MTR)
>>> I(60PRDsc_20CHLsc_10FDC_**05EDFnv_05VAP)
>>> I(65PRDsc_15FDC_10MTRct_05VAP_**05EDFva)
>>> I(55PRDsc_30FDC_10FDPpl_05VAP)
>>> PRDsc
>>> I(55EDFva_30PRDsc_15FDC)
>>> EDP(60ZAU_15SNE_10EDFea_10VAP_**05OCT)
>>> I(65PRDsc_30CHLsc_05SNE)
>>> PAG(70ZEV_15ZAU_10EDFnv_05VAP)
>>> AAR(65EDFva_30PRDsc_05CHLsc)
>>> I(90UEN(75EDFea_10SNE_10VAP_**05ZAU)_10UCS(90EDFva_10ZAU))
>>> ...
>>> ...
>>> ...
>>> estos son los codigos que pertenecen a distintos poligonos...
>>>
>>>
>>> cada grupo de tres letras le corresponde un uso distinto.
>>> yo quisiera rellenar en otra columna la siguiente operación
>>> - haciendo una suma del % del uso predominante (se que este es muy
>>> complicado, debido a que el codigo es muy complejo...)
>>> - o bién, otro caso que se aproximaria al objetivo es que se muestren en
>>> otro campo las tres primeras letras MAYUSCULAS, dentro de cada parentesis
>>> si  contienen parentesis, sino las tres que hay en el poligono en
>>> cuestion.
>>> El problema es que antes del parentesis puedes encontrarte des de una
>>> letra
>>> o tres.
>>>
>>> Al final lo deje, el codigo pudo conmigo, si pudieras darle un par de
>>> vueltas al asunto me harias un gran favor.
>>> Sé que no es tarea fácil, pero seria de muy gran ayuda. Además, pareces
>>> que
>>> dominas el tema a la perfección.
>>>
>>> gracias de antemano
>>>
>>>
>>>
>>> Pau
>>>
>>>
>>> PD: perdon en el anterior no tenia asunto
>>>
>>>
>>>
>>>
>>
>> Hola Pau,
>>
>> no he entendido tu primera intención, pero la aproximación
>>
>>
>>> - o bién, otro caso que se aproximaria al objetivo es que se muestren en
>> otro campo las tres primeras letras MAYUSCULAS, dentro de cada parentesis
>> si  contienen parentesis, sino las tres que hay en el poligono en cuestion.
>> El problema es que antes del parentesis puedes encontrarte des de una letra
>> o tres.
>>
>> no es tan complicada mediante un script. Si lo he entendido bien.
>> Necesitas las 3 primeras ocurrencias de letras en mayúsculas después de un
>> paréntesis, y si no hay paréntesis, lo que sea que haya en la cadena.
>>
>> Lo que he hecho es copiar los datos que adjuntas en el correo en un
>> archivo que he dejado en '/tmp/codigos.txt' y montar el siguiente script.
>> Está hecho deprisa y corriendo pero te dará una idea de lo que pudes hacer.
>>
>> {{{
>>
>> import re
>>
>> def main():
>>
>>    f = file("/tmp/codigos.txt", "r")
>>
>>    #recorre las lineas del archivo
>>    for index, line in enumerate(f.readlines()):
>>      print "%s, %s"%(index,line)
>>
>>      #Si no encuentra un "(" devuelve el codigo
>>      if line.find("(") ==-1:
>>        print line
>>        continue
>>      patron = re.compile("[A-Z]{3}")
>>      index = 0
>>
>>      #busca dentro de la linea todos los "("
>>      while (line.find("(", index, len(line)) !=-1):
>>          index = line.find("(", index, len(line)) +1
>>          dd = line[index:]
>>
>>          #busca las 3 primeras mayusculas en la cadena
>>          r=patron.search(dd)
>>
>>          #si se ha encontrado algo imprime el resultado
>>          if r:
>>              print r.string[r.start():r.end()]
>>
>>    file.close()
>>
>> }}}
>>
>> El resultado que obtengo de tus datos (10 líneas) es:
>>
>> 0, I(90FDPpl_05FDC_05SNE)
>> FDP
>>
>> 1, AAR(80EDFva_10CHLsc_10PRDsc)
>> EDF
>>
>> 2, A(80MTR_10FDPpl_10SNE)
>> MTR
>>
>> 3, FDPpl
>> FDPpl
>>
>> 4, A(70FDC_30MTR)
>> FDC
>>
>> 5, AAR(70EDFva_10PRDsc_10CHLsc_**10FDC)
>> EDF
>>
>> 6, A(85FDPpl_10FDC_05SNE)
>> FDP
>>
>> 7, FDC
>> FDC
>>
>> 8, I(40PRDsc_40CHLsc_10FDC_**05EDFva_05VAP)
>> PRD
>>
>> 9, A(60MTR_40FDPpl)
>> MTR
>>
>> 10, I(35EDFvd_35UEN(45ZAU_35EDFvd_**20VAP)_15PAG(55SNE_35EDFnv_**
>> 05OCT_05VAP)_15PRDsc)
>> EDF
>> ZAU
>> SNE
>>
>> Si resulta que tienes la capa cargada en gvSIG 2.0 puedes crearte una capa
>> nueva con los resultados. Si estas interesado,dímelo y te mando una
>> aproximación.
>>
>> Te adjunto 3 archivos.
>> - los codigos de tu correo en un txt (codigos.txt)
>> - los resultados de ejecutar el script usando el archivo anterior
>> - el código
>>
>> Saludos,
>> Victor Acevedo
>>
>>
>>   ______________________________**_________________
>>> 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<http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios>
>>>
>>>
>>
>> _______________________________________________
>> 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
>>
>
>
>
> _______________________________________________
> 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 mensaje que no está en formato texto plano...
Nombre     : nuevo-script.png
Tipo       : image/png
Tamaño     : 34903 bytes
Descripción: no disponible
Url        : http://listserv.gva.es/pipermail/gvsig_usuarios/attachments/20121119/277f433b/attachment.png 
------------ próxima parte ------------
0, I(90FDPpl_05FDC_05SNE), FDP
1, AAR(80EDFva_10CHLsc_10PRDsc), EDF
2, A(80MTR_10FDPpl_10SNE), MTR
3, FDPpl, FDPpl
4, A(70FDC_30MTR), FDC
5, AAR(70EDFva_10PRDsc_10CHLsc_10FDC), EDF
6, A(85FDPpl_10FDC_05SNE), FDP
7, FDC, FDC
8, I(40PRDsc_40CHLsc_10FDC_05EDFva_05VAP), PRD
9, A(60MTR_40FDPpl), MTR
10, I(35EDFvd_35UEN(45ZAU_35EDFvd_20VAP)_15PAG(55SNE_35EDFnv_05OCT_05VAP)_15PRDsc), EDF
11, I(50PST_25ECM(75OCT_15ZAU_10VAP)_25SNE), PST
12, A(85CNFpl_15MTR), CNF
13, I(50FDC_40PRDsc_10EDFva), FDC
14, A(60MTR_30PST_10SNE), MTR
15, UEN(40EDFvd_40ZAU_20VAP), EDF
16, NRV(85VAP_15ZAU), VAP
17, A(70MTR_30SNE), MTR
18, I(75PRDsc_25IAS(80EDFnv_20ZEV)), PRD
19, A(55MTR_30FDC_15SNE), MTR
20, A(80CNFpl_20MTR), CNF
21, I(70FDCfr_30ACU), FDC
22, I(55PRDsc_35MTRpc_05FDPpl_05SNE), PRD
23, A(65MTRpc_35FDC), MTR
24, AAR(60EDFva_20PRDsc_10CHLsc_10FDC), EDF
25, A(60FDC_30MTR_10SNE), FDC
26, I(35PRDsc_30LOCsc_25IAS(50EDFnv_25VAP_20SNE_05ZAU)_10EDFva), PRD
27, I(40PRDsc_25EDFva_25IAS(80EDFnv_20VAP)_10UEN(80EDFvd_20SNE)), PRD
28, EDU(35OCT_35SNE_15EDFea_15VAP), OCT
29, I(60AAR(90EDFva_05PRDsc_05CHLsc)_40PRDsc), AAR
30, I(35PRDsc_20CHLsc_20FDC_10EDFva_10EDFnv_05VAP), PRD
31, I(80PRDsc_10CHLsc_05FDC_05VAP), PRD
32, AAR(70EDFva_10FDC_10CHLsc_10PRDsc), EDF
33, I(40MTR_40FDC_20EDFva), MTR
34, FDC, FDC
35, I(25AAR(EDFva)_25CHLsc_25PRDsc_15FDC_10EDFva), AAR
36, I(30PRDsc_30EDFva_20AAR(90EDFva_05PRDsc_05CHLsc)_10UEN(90EDFvd_05ZAU_05VAP)_05FDC_05LOCsc), PRD
37, PAG(80ZEV_15EDFnv_05VAP), ZEV
38, I(65PRDsc_20CHLsc_10VAP_05FDC), PRD
39, I(30PRDsc_30CHLsc_15EDFva_10MTR_10PAG(80ZEV_20EDFnv)_05VAP), PRD
40, A(75FDC_15PRDsc_10FDPpl), FDC
41, A(55MTR_40FDPpl_05SNE), MTR
42, A(70MTR_25CNFpl_05SNE), MTR
43, I(65PRDsc_25CHLsc_05FDC_05EDFva), PRD
44, A(70CNFpl_15FDPpl_15MTR), CNF
45, I(60PRDsc_20CHLsc_10FDC_05EDFnv_05VAP), PRD
46, I(65PRDsc_15FDC_10MTRct_05VAP_05EDFva), PRD
47, I(55PRDsc_30FDC_10FDPpl_05VAP), PRD
48, PRDsc, PRDsc
49, I(55EDFva_30PRDsc_15FDC), EDF
50, EDP(60ZAU_15SNE_10EDFea_10VAP_05OCT), ZAU
51, I(65PRDsc_30CHLsc_05SNE), PRD
52, PAG(70ZEV_15ZAU_10EDFnv_05VAP), ZEV
53, AAR(65EDFva_30PRDsc_05CHLsc), EDF
54, I(90UEN(75EDFea_10SNE_10VAP_05ZAU)_10UCS(90EDFva_10ZAU)), UEN
------------ próxima parte ------------
Se ha borrado un mensaje que no está en formato texto plano...
Nombre     : codigos_poligonos.py
Tipo       : text/x-python
Tamaño     : 3463 bytes
Descripción: no disponible
Url        : http://listserv.gva.es/pipermail/gvsig_usuarios/attachments/20121119/277f433b/attachment.py 


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