Dentro de nuestros trabajos GIS a menudo encontramos la necesidad de transformar la información de partida o de entrega al formato de trabajo requerido: de CAD a Shapefile, de Shapefile a Kml, de Geodatabase a Shapefile, GPX a Feature, etc.
En ArcGIS, todas las opciones de transformación de información GIS están recogidas en las Tools denominadas Conversion Tools.
Cuando el volumen de la información a manejar es importante lo recomendable es programar la tarea de modo que, toda la información del tipo señalado que esté ubicada en un directorio específico se transforme al formato requerido.
Con ArcPy podemos utilizar cualquiera de las herramientas que vemos en las ToolBoxes en modo de código Python, que además podremos enriquecer con bucles, condiciones, parámetros etc.
En este caso práctico vamos a hacer un script para convertir datos GIS con Python y la ArcPy, que cree una geodatabase y un layer file (.lyr) por cada uno de los archivos tipo kml que se ubique en un directorio específico.
Para llevarlo sólo necesitamos saber:
- La sintáxis de la herramienta kml to layer : Arcpy
- Crear un listado de todos los archivos tipo kml de un directorio: ArcPy o Python
- Hacer un bucle tipo FOR que recorra ese listado y ejecute la herramienta: Python
Unos apuntes sobre ArcPy
En nuestro artículo Qué es ArcPy te explicamos esta librería. A modo de resumen debes saber que ArcPy es una biblioteca de Python creada específicamente por ESRI para programar y automatizar procesos GIS. Contiene Clases, Funciones, etc. específicas de ESRI, las cuales se pueden combinar con las funcionalidades propias de Python así como con otras bibliotecas bajo este lenguaje.
Cómo obtener el código
Tenemos varias opciones para obtener el código que necesitamos. Para empezar, todas las herramientas de las ToolBoxes de ArcGIS vienen acompañadas de su correspondiente Ayuda, a la que podemos acceder bien a través del botón derecho sobre la herramienta, o bien en botón de ayuda del cuadro de diálogo de esa herramienta.
Además contamos con la opción vía Web, tanto en foros específicos, por ejemplo: https://geonet.esri.com/community/developers/gis-developers/python, como en el buscador del ArcGIS for Desktop: http://desktop.arcgis.com/en/
Por suerte la documentación que nos ofrece ESRI es muy sencilla, clara y estructurada. Además siempre se acompaña de un ejemplo práctico que podemos reutilizar y adaptar a nuestras necesidades, aunque evidentemente un mayor grado de conocimientos y de destreza con la programación nos permitirá sacarle más ventaja a la ArcPy.
En el artículo 8 trucos para comenzar a trabajar con python sobre ArcGIS puedes ver nuestras recomendaciones para iniciarse con ArcPy.
Índice
1º La sintáxis de la herramienta kml to layer
Buscamos la herramienta y accedemos a su ayuda tal y como vemos en la imagen anterior. Se abrirá una página de ayuda con diferentes apartados: Sumary, Usage, Syntax, Code Sample… Para nosotros estos dos últimos son los más importantes, con ellos podemos ver cómo se traduce la herramienta a código Python y un ejemplo aplicado.
Como vemos en la ayuda, la sentencia que necesitamos es:
Las sentencias para ejecutar herramientas GIS siempre mantienen la misma estructura:
arcpy + punto + módulo específico (si tiene) + nombre de la herramienta + _apellido de la herramienta (si tiene)+ (parámetros entre paréntesis separados por comas, {parámetros opcionales})
En nuestro caso, vamos a prescindir de los parámetros opcionales, así que nuestra sentencia será:
arcpy.KMLToLayer_conversion (in_kml_file, output_folder)
El valor del parámetro in_kml_file se lo asignaremos a través del listado de archivos kml que generemos.
El valor de output_folder lo podemos asignar como una variable al inicio del script.
2.- Crear un listado de todos los archivos tipo kml de un directorio.
Para este punto utilizaremos el buscador web de ESRI.
En el siguiente enlace: https://pro.arcgis.com/es/pro-app/arcpy/get-started/listing-data.htm vemos las diferentes posibilidades de listados de datos que podemos generar a través de Arcpy. Dado que un archivo tipo kml no es una tipología específica de ESRI, dentro de las posibles herramientas parece que la más adecuada será la de ListFiles, utilizando el filtro de la extensión del archivo. (*.kmz para nuestro ejemplo)
Accedemos a la ayuda específica de esta herramienta para ver su sintaxis y reutilizar su código:
La sintaxis que vamos a necesitar es sencilla:
arcpy.ListFiles('*.kmz')
Tal y como se explica en su ayuda es requisito imprescindible que previa a su ejecución se haya establecido como workspace el directorio del que se quiere obtener el listado. Como vemos en el ejemplo esto se hace con la siguiente sentencia:
arcpy.env.workspace = 'D:/temp/archivos_kml'
Esta sentencia se podría haber hecho a través del módulo os de Python, sin utilizar ArcPy.
Con el código que vemos en el ejemplo de la herramienta podemos abordar nuestro tercer objetivo.
3.- Hacer un bucle tipo FOR que recorra ese listado y ejecute la herramienta
Las creaciones de listados suelen ir acompañadas de estructuras de tipo FOR, que recorren el listado con el objeto de operar con sus elementos.
En el ejemplo que vemos en la ayuda de la herramienta ListFiles se aplica el bucle FOR para crear un archivo tipo dbf a partir de cada uno de los archivos tipo csv listados.
Copiaremos este ejemplo y sustituiremos estos pasos por nuestra herramienta de conversión. La sintaxis del bucle sería:
for in_kml_file in arcpy.ListFiles("*.kmz"):
Transcribiendo y ordenando el código: Creamos del script
OK! Tenemos el código, ahora sólo tenemos que ordenarlo ☺
Podemos escribir nuestro código en un IDE (Integrated Development Environment), lo que nos facilita la trascripción, depuración y ejecución. Nuestra recomendación es utilizar PyScriter.
Ahora, vayamos por orden, y acompañemos cada paso de un comentario (en Python los comentarios se preceden de un símbolo #), de modo que quede clara la intención de cada sentencia:
#importamos arcpy para poder trabajar con esta biblioteca import arcpy #variables de trabajo: directorio de entrada y de salida in_folder = 'D:/temp/archivos_kml' output_folder = 'D:/temp/archivos_gdb' #establecemos el workspace, que es el mismo que el directorio de entrada arcpy.env.workspace = in_folder #bucle FOR y listado de archivos tipo kmz for in_kml_file in arcpy.ListFiles("*.kmz"): #herramienta de conversion de kml a capa arcpy.KMLToLayer_conversion (in_kml_file, output_folder) print in_kml_file + " a capa...." print "SCRIPT EJECUTADO CORRECTAMENTE"
Manos a la obra: Ejecutamos el script
Aunque tenemos varias opciones para ejecutar nuestro código, lo recomendable en un script de este tipo, compuesto por varias líneas de código, es utilizar el propio editor: PyScripter.
En la imagen podemos ver el script ejecutado y los mensajes devueltos en la Ventana Intérprete del programa. Por lo que vemos se ha ejecutado correctamente, y así lo podemos comprobar en los contenidos de la carpeta.
Posibles mejoras y reutilización del código
Esta ejecución nos ha resultado muy útil. Sin necesidad de abrir ArcGIS hemos transformado a layer archivos tipo kmz de modo masivo. De la misma manera, cambiando la herramienta, podremos hacer otro tipo de conversiones de datos:
- FeatureClassToShapefile_conversion
- FeaturesToJSON_conversion
- GPXToFeatures_conversion,
- etc.
Las posibilidades son tantas como las opciones que nos ofrece ArcGIS, con la ventaja de poder ejecutarlo para un número elevado de archivos y fuera del entorno de ESRI. Sólo debes tener en cuenta dos cosas:
- El tipo de herramienta para realizar el listado: dependerá si los archivos son capas de ESRI u otros formatos.
- Los parámetros que cada una de las herramientas de conversión considere obligatorios.
Además el programa se puede mejorar combinando este código con otras acciones como extraer estadísticas, hacer una serie de mapas con la información importada, generar un informe, programar la tarea, etc… las posibilidades son ilimitadas.
Aprende ArcPy en nuestro curso online de Python para ArcGIS.
Muy buen aporte, para los que empezamos a ver python para arcgis
Me parece interesante porque se aprenden cosas nuevas