5 votos

¿Búsqueda de directorios y subdirectorios para realizar intersecciones y clips con ArcGIS Desktop?

Estoy intentando desarrollar una herramienta con ArcGIS 10 que consulte los almacenes de datos de nuestra empresa en busca de cualquier dato que se cruce con una característica.

De modo que cuando adquirimos una nueva propiedad podemos ejecutar esta herramienta y encontrará todos los datos que tenemos que se cruzan con la nueva propiedad, los recortará y los guardará en una nueva ubicación.

6voto

Nick Puntos 3115

Depende mucho de cómo se almacenen los datos. Si tu almacén de datos ha crecido orgánicamente y los datos están mezclados en un montón de directorios y una mezcla de shapefiles y geodatabases, podrías usar el programa Python os.walk para listar su estructura de directorios y, a continuación, subestablecer su lista para incluir sólo GDBs y SHPs. A continuación, tendría que trabajar recursivamente a través de cada conjunto de datos en los GDBs y cada uno de los SHPs. Este enfoque es un poco de fuerza bruta, pero usted podría cultivar a unos pocos núcleos de la CPU con un poco de hilo y el uso juicioso del módulo de subproceso.

Si tus datos están ordenados en una única base de datos (ya sea una geodatabase basada en archivos o SDE) tu vida debería ser mucho más fácil. Sólo tienes que recorrer recursivamente la estructura de la base de datos (usando SQL y no el os.walk función obviamente)

EDITAR tras los comentarios de Visceral: Dado que su árbol de directorios incluye principalmente shapefiles necesita tamizar sus archivos para incluir sólo los que terminan en '.shp'. Aunque SÓLO contengan shapefile, sólo le interesan los que tienen la extensión '.shp'. Hay varias maneras de hacer esto, pero aquí hay un ejemplo:

def dirsearch(basedir):
    '''Gets all the shapefiles in the directory structure'''
    shpList = []
    for dirpath,dirnames,filenames in os.walk(basedir):
        shpList.extend([os.path.join(dirpath, fnm) for fnm in filenames if fnm.endswith('.shp')])
    return shpList

5voto

Van Gale Puntos 170

Esto es lo que he utilizado para hacer un recuento rápido de los datos del SIG en un servidor. Debería ser fácil de modificar para la intersección.

import arcpy
from arcpy import env
import os
env.workspace = "G:/data"

fcList = []
count = 0
for dirname, dirnames, filenames in os.walk('G:/data'):
    for subdirname in dirnames:
        print os.path.join(dirname, subdirname)
        env.workspace = os.path.join(dirname, subdirname)
        fcList = arcpy.ListFeatureClasses()
        for fc in fcList:
            print fc
            count = count + 1
            print count

0voto

sh1mmer Puntos 1011

No soy un gran scriptor de python pero un cliente nos envió unos trescientos shapefiles en unas 100 carpetas y no tuve tiempo de extraerlos por separado.

He creado el modelo de abajo usando model builder y funciona bien.

enter image description here

0voto

Michael Puntos 604

Esto es más para ArcGIS 10.1 Service Pack 1 a las versiones actuales. Arcpy tiene un método llamado Caminar que permite buscar a través de directorios y subdirectorios. El método walk es útil ya que se pueden especificar los tipos de datos que se buscan. El siguiente es el ejemplo de la documentación. El ejemplo muestra la función Walk siendo utilizada para catalogar clases de características de polígonos.

import arcpy
import os
workspace = "c:/data"
feature_classes = []
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,
                                              datatype="FeatureClass",
                                              type="Polygon"):
    for filename in filenames:
    feature_classes.append(os.path.join(dirpath, filename))

Podrías modificar el código para hacer un bucle a través del catálogo, añadir una comprobación para ver si las características se cruzan y si es cierto, recortar los datos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X