La aplicación de Python en conjunto con ArcGIS permite facilitar numerosos procesos. Una de las tareas más comunes al comenzar un nuevo proyecto corresponde a la necesidad de clipear varios archivos para acotarlos a un área de estudio. En este caso crearemos un script que permitirá, sin necesidad de abrir ArcMap, el clip o recorte de todos los archivos .shp en una carpeta arbitraria y las subcarpetas que ésta contenga. Para este proceso se usará el módulo os
para interactuar con el sistema operativo y ArcPy para el geoprocesamiento.
Nota: Las versiones preliminares a ArcGIS Pro estan basadas en Python 2.7, por lo que algunas de las sintaxis variarán respecto a las versiones más recientes. Resultados similares pueden lograrse mediante la librería geopandas.
Necesitaremos importar en primer lugar:
import os
from os.path import basename, join, splitext
import arcpy
Encontrando los archivos de formato shape (.shp)
El primer paso corresponde a encontrar todos los archivos de formato .shp existentes en un carpeta y las subcarpetas que esta contenga, para ello se crea una función que dada una carpeta arbitraria nos entregue una lista con las rutas de los archivos a clipear:
def shape_finder(carpeta):
lista_rutas_shp = []
for rutas, carpetas, archivos in os.walk(carpeta):
for archivo in archivos:
if splitext(archivo)[1] == '.shp':
lista_rutas_shp.append(join(rutas, archivo))
return lista_rutas_shp
# Lista de carpetas a partir de input
carpeta_entrada = raw_input('Ruta de la carpeta con shapes a clipear: ')
lista_rutas_shp = shape_finder(carpeta_entrada)
Dentro de la función shape_finder()
se crea en primer lugar una lista que guardará las rutas de todos los archivos de terminación ".shp" presentes (lista_rutas_shp
). Para navegar la carpeta de entrada en busca de los shape se utiliza el método os.walk()
, el cual entrega todas las rutas, y las carpetas y archivos asociados. En este caso nos interesan solo los archivos de terminación .shp, para filtrarlos utilizamos os.path.splitext()
que entrega el nombre y extensión del archivo, y en donde utilizaremos solo la extension (correspondiente al segundo elemento, de índice 1).
La ruta de nuestro shape corresponde a la ruta de la carpeta donde se encuentra sumado al nombre del archivo, los que son unidos mediante os.path.join()
, para ser luego agregados a nuestra lista mediante append()
. Por último, para poder ingresar la carpeta deseada al momento de ejecutar el script asignamos nuestra carpeta de entrada a un input (raw_input
) y posteriormente ejecutamos la función y guardamos la lista en una variable (lista_rutas_shp
).
Realizando el clip con ArcPy
Con la lista de rutas procedemos a utilizar ArcPy para el proceso de clip, ArcPy nos permite acceder a las herramientas normalmente disponibles desde la ArcToolbox, los detalles de la herramienta clip y ejemplos pueden ser revisados en la página oficial de ESRI, donde se indica que la sintaxis sigue el formato:
Clip_analysis (in_features, clip_features, out_feature_class, {cluster_tolerance})
Donde in_features
corresponden a las entidades a recortar, clip_features
al objeto que recorta y out_feature_class
a la entidad a crear. En este caso nuestras entidades a recortar corresponde a cada uno de los elementos de la lista de shapes, el archivo de clip será a elección, y la entidad de salida se designará con el nombre de "clip_" + nombre del archivo (obtenido mediante os.path.basename
) y asociado a una carpeta donde dejaremos todos nuestros nuevos archivos recortados (carpeta_salida
). Así:
archivo_clip = raw_input('Ruta del archivo a utilizar para el recorte: ')
carpeta_salida = raw_input('Ruta de la carpeta de salida: ')
for shape in lista_rutas_shp:
ruta_archivo_salida = join(carpeta_salida, 'clip_' + basename(shape))
arcpy.Clip_analysis(shape, archivo_clip, ruta_archivo_salida)
print('{shp_nombre} clip exitoso!'.format(shp_nombre=basename(shape)))
Finalmente podemos guardar nuestro script en el lugar que deseeamos, y para posteriormente ejecutarlo en la consola con el interprete de Python asociado a la versión de ArcGIS instalada, resultando en algo similar a:
C:\Python27\ArcGIS10.5\python.exe C:\Users\usuario\PythonProjects\arcgisscriptclip\clipper.py