Recorte automático de shapefiles con ArcPy

Python, SIG, ArcGIS

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