De DXF a GML con Python


#1

Hola a todos

En mis primeros pinitos de Python aplicado a temas geo, acabo de subir a GitHub un breve script que convierte archivos DXF a GML (XML geográfico) según los últimos requisitos de la Dirección General de Catastro. Toda la parte teórica la tenéis en el enlace a mi blog.

Desde hace un tiempo, y según tengo tiempo, estoy intentando aprender Python en mi campo de trabajo ya que es el lenguaje principal para desarrollos en SIG tipo QGIS o gvSIG. Sé que habrá mejores formas de escribir el código y creo que aquí es buen sitio para recibir comentarios y seguir aprendiendo.

Saludos y gracias
Patricio

PD: Aunque creo que me he presentado en otros foros (Geoinquietos Almería), sólo comentaros que soy Geógrafo, de Córdoba y llevo ya unos pocos de meses trabajando como técnico del área SIG de Roquetas. Vinculado con Python, además de lo que os he comentado, ahora estoy con dándome golpes con GeoDjango, extensión Django para trabajar con información geográfica.


#2

No está nada mal, enhorabuena, no parece haber sido algo baladí y has tenido que aprender a usar varias librerías que seguro que han dado quebradero de cabeza.

Te puedo haber varios comentarios, mientras veo que la mayoría los has tenido ya en cuenta en la planificacion de la versión 2:

  • Aclara que el script está hecho para Python 2. Con pocos cambios lo puedes hacer compatible con Python 2 y 3, a simple vista sólo he encontrado incompatible los print. Comprueba que las librerías usadas están disponibles también en Py3 y se usan igual.
  • Haz un archivo requirements.txt para poder automatizar la instalación de las dependencias.
  • En la carpeta ejemplos no hace falta que copies de nuevo los scripts, sólo que indiques en un archivo cómo se ejecutan los ejemplos.
  • Haz tests, tests unitarios de tu script (funcionalidades) y de integración (conexión con los archivos externos), y haz una carpeta aparte donde se puedan ejecutar los scripts de test. Estos tests deben ejecutar los scripts de la carpeta raiz y no otros aparte.
  • Aclara para qué versiones de Python funciona. Lo más sencillo es nombrar las versiones actuales y decir que no está testeado en anteriores, y pedir que si tienen noticias de que sea compatible o no te lo hagan saber.
  • A la hora de instalar, pon también ejemplos en otros SOs, y aclara los comandos de PIP (la mejor forma de instalar los módulos).
  • La gestión de los SRC puede ser con varias plantillas, eligiendo una por defecto y permitiendo a través de argumentos de consola elegir otro.
  • Para los argumentos de consola, usa sys.argv.
  • Prepara algo más de documentación en los archivos. Pon enlaces a la entrada del blog y al Github, menciona la licencia.
  • Menciona con qué versiones de GDAL está testeado.
  • Permite elegir ruta de DXF origen y ruta de GML destino.
  • Las variables de la plantilla son constantes, van en mayúscula según los estándares. Dale nombres más informativos, como PLANTILLA_CABECERA_INICIO, PLANTILLA_CABECERA_INTERMEDIA, PLANTILLA_FINAL. 1 y 2 pueden indicar que son cabeceras a elegir entre una y otra.
  • Al final del script declaras datasource como None, lo cual es un poco extraño. Comenta por qué esa decisión, puesto que no es evidente.
  • En vez de abrir el archivo con un open y luego close, puedes usar “with open(…) as f:”, lo cerrará al acabar automáticamente, aunque salte alguna excepción dentro.
  • Este script está hecho sólo para ejecutarlo, pero normalmente ésto no debe ser así, sino que debe permitir importarlo como un módulo tanto completamente como elementos del mismo. Por tanto, usa el “if __name__ == ‘__main__’” que verás en casi todos los archivos, y sólo ejecuta código ahí. El resto, englóbalo en clases o funciones (en este caso, lo 2º), y así podrás importarlo para usar este script en conjunción con otros, expandiéndolos.

Por otro lado, el script no sigue las reglas de estilo del PEP8. Si quieres, mañana te lo puedo editar y te hago un pull-request para que veas la diferencia.

Si tienes alguna duda sobre lo comentado u otra cosa, házmelo saber y lo solucionamos en un momento.

Y poco más, mis felicitaciones de nuevo por el trabajo y a primeros de abril tendremos el primer taller de aprendizaje de Python. ¡Espero que nos puedas acompañar en las siguientes actividades y nos cuentes tu experiencia con éste y otros scripts!


#3

Marcos, ¡¡¡muuchaas gracias de verdad!!!.

Es justo lo que necesitaba y por eso pensé añadir el tema en el foro.
Hay cosas que entiendo y otras en las tendré que documentarte. Lo miraré
con tranquilidad e iré preguntando.

Respecto al taller, si por casualidad es entre semana, los viernes marcho a
Córdoba con la familia, estaré seguro allí.


#4

Va a ser un jueves de 6.30 a 8.30 seguramente, por confirmar día, aunque en breve lo tendré listo.


#5

Perfecto. Pues allí nos veremos


#6

Hola de nuevo Marcos. He creado un nuevo branch llamado “02_crear funcion” intentando seguir algunas de tus aportaciones.

Estos puntos ya están incorporados en mayor o medida al repositorio principal

El tema de los test me queda bastante largo. Tengo que mirar info y lo dejo para más tarde

Esto es lo próximo. Me queda más o menos claro como usar sys.argv para añadir archivo DXF de entrada, GML de salida e indicar el Sistema de Referencia usado.

Esto es la parte del branch y en el que tengo más dudas. No sé si la definición de la funcion crear_gml() está en un sitio correcto. Creo que he entendido más o menos el uso de “if __name__ == ‘__main__’” y que en principio no tengo código que añadir detrás ¿algún ejemplo?

Si tienes un momento sería perfecto ver los cambios que hay que hacer para las reglas del PEP8. He intentado crear los espacios y partir líneas de más de 79 caracteres. Pero seguro que hay más cosas.

Gracias de antemano

Patricio


#7
  • Al final, dentro del if, mete una llamada a la función crea_gml(). En ese if será donde recojas los argumentos con sys.argv y los pasas como parámetros a crea_gml.
  • Todos los nombres de archivos y configuraciones similares, ponlos como variables globales justo después de los imports, para que los scripts sean más fácil de configurar.
  • Veo que el datasource, el driver, ahora no lo estableces como None. ¿Lo has mirado en la doc y no hay que cerrarlo?

Pongo en la todo list el pasarlo a PEP8 compliant. De todas formas, échale un ojo que es la base de Python, puesto que es un lenguaje pensado para tener una sintaxis clara y bella antes que nada.


#8

He mirado la documentación y en los ejemplos no he encontrado ninguno como el que yo he hecho. Igual lo he arrastrado de otro ejemplo. No entiendo muy bien la utilidad, por lo que tras probar que el script funcionaba lo he eliminado


#9

Hola a todo

Despues de casi dos meses, parece que el código Python que planteé ya está terminado. Mil gracias a @Indavelopers que además de varios PRs, me ha guido por la senda pythoniana que espero ir siguiendo.
Todo esto me ha servido para hacer tres [1], [2] y [3] entradas en mi blog y un taller en geoinquietos Córdoba. Os dejo enlaces por si a alguno le interesa. Creo que de forma general lo más interesante es poder utilizar el módulo dentro de otros programas , en mi caso el SIG QGIS.


#10

Ya estaba yo preguntando dónde estaban los post pertinentes en el blog.

Un placer poder haber participado con una pequeña colaboración, y recuerda que python is the way.