8 votos

Listar las capas de la vista actual usando Arcpy

Estoy utilizando ArcGIS 10.4.1 y Python 2.7.10.

Tengo un archivo mxd de una zona bastante grande que contiene cientos de capas. Deseo trabajar en una sub-área específica en ese espacio de trabajo, donde sólo unas pocas capas serán relevantes.

Estaba buscando una forma de obtener una lista de las capas que se superponen espacialmente con la vista actual (subárea) en ArcMap. Las capas podrían ser visibles o no, como se comprueba (o no) en el espacio de trabajo. El mxd está actualizado con esta vista.

¿Es posible algo así?

Estoy utilizando como base el siguiente código, que da salida a todas las capas en el espacio de trabajo:

import arcpy

mxd = arcpy.mapping.MapDocument(r"C:\path\to\file.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
print arcpy.mapping.ListLayers(mxd,"", df)

EDIT: un ejemplo práctico para ilustrar se parecería a esto: Digamos que tengo una docena de capas de mapas topográficos y características del terreno (agua, río, nivel de topografía, carreteras, línea eléctrica, asentamientos, glaciares, reservas, carreteras, aeropuertos y bosques) a escala de país.

Hago zoom en una zona boscosa muy remota, donde sólo las capas bosque, río, nivel de topografía se superponen a la vista. Todas las demás no son relevantes. Estoy buscando si es posible arcpy esas capas bosque, río y topoline en una lista y descartar el otro.

1 votos

OK ¿Qué pasa si tienes la situación de un donut, todos tus datos están alrededor del borde pero ninguno de ellos es visible en la vista actual pero la extensión del conjunto de datos lo cubre? Como dice @Aaron actualiza tu pregunta con más información en lugar de responder en los comentarios.

0 votos

@Hornbydd y Aaron gracias por los comentarios - Aclaro en base a sus respectivos comentarios en el post de la pregunta original

0 votos

Por lo tanto, en el escenario de la rosquilla (por ejemplo, asentamientos alrededor de su bosque pero no en la vista), ¿no querría informar de esta capa?

9voto

ansur Puntos 150

A DataFrame tiene un extent propiedad, el extent propiedad/objeto puede utilizarse en los métodos básicos de relación espacial de contains , within , equals , overlaps , touches y disjoint así como distanceTo , ver aquí para más detalles sobre estos métodos.

Con esto en mente, puedes hacer un bucle sobre las capas que recuperas al llamar a arcpy.mapping.ListLayers(mxd,"", df) y recuperar la extensión de cada capa llamando al getExtent en cada capa. Las relaciones espaciales que se han discutido anteriormente pueden ser probadas entre el extent.polygon de cada capa y el marco de datos para determinar si están efectivamente dentro de la extensión del marco de datos. Si se utilizan páginas controladas por datos, la extensión de cada página puede recuperarse con un mxd con esta llamada mxd.dataDrivePages.dataFrame.extent .

Es importante tener en cuenta que la extensión de una capa a menudo tiene una huella más grande que el vector real dentro de la capa (por ejemplo, el polígono, puntos, raster, etc.), por lo que dependiendo de la relación espacial que usted elija para probar puede incluir más capas que son realmente visibles. Aquí hay un ejemplo (gracias @KHibma) de cómo se utilizaría un método de relación espacial del DataFrame con un Layer objeto:

mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
for l in arcpy.mapping.ListLayers(df):
    if not df.extent.disjoint(l.getExtent()): 
        print l.name

0 votos

Si no quieres ese código de ejemplo, no dudes en quitarlo

0 votos

@KHibma muy apreciado. Tal vez debería haberla incluido.

0 votos

Estaba trabajando en el código como respuesta, pero has dedicado más esfuerzo a explicar los procesos de lo que yo habría hecho :)

7voto

Marcin Puntos 11

Como método rápido y sucio, podrías comparar extensiones, como ya se ha contestado. Sin embargo (también se ha mencionado), eso no indica necesariamente si una característica es visible en la vista actual (por ejemplo, si se amplía lo suficiente la extensión de una clase de característica, en algún momento no se verá ninguna característica).

El rendimiento se ve afectado si necesitas encontrar características visibles. Puedes llegar a ello utilizando varios métodos, pero de alguna manera necesitas realizar una operación de superposición a nivel de característica. Puede utilizar: Spatial Join (como abajo), Intersect, Select Layer By Location, o buscar con el cursor a través de todas las características verificando 'overlaps' contra el df.extent, entre otros.

mxd = arcpy.mapping.MapDocument("CURRENT") # map
df = arcpy.mapping.ListDataFrames(mxd)[0] # data frame
arcpy.env.addOutputsToMap = False # disable add outputs
for lyr in arcpy.mapping.ListLayers(df): # loop through layers
    try:
        sp = arcpy.SpatialJoin_analysis(df.extent.polygon,lyr,r'in_memory\sp',"JOIN_ONE_TO_ONE","KEEP_COMMON",'',"INTERSECT") # perform overlay
        if int(arcpy.GetCount_management(sp).getOutput(0)) > 0: # check if overlay found any features
            print '{}: visible'.format(lyr.name)
        else: # no features found
            print '{}: not visible'.format(lyr.name)
    except:
        print '{}: not a feature layer or some other problem'.format(lyr.name) # not feature layer, e.g. WMS

0 votos

Definitivamente, consideraré otras soluciones

1 votos

De acuerdo, desde el punto de vista de la "exhaustividad", esto es mejor. Pero la cuestión/tarea es una que podría resolverse con "rápido y sucio" o "lento y más correcto". Me gustan las dos respuestas. Al final se trata de resolver dicho problema de la manera que más te guste. Por esa razón ambas reciben +1

0 votos

Claro, todos los puntos son justos. Sin embargo, supongo que la razón principal por la que alguien haría esto es para evitar dibujar conjuntos de datos innecesarios y de gran tamaño (por ejemplo, datos base de todo el país para un mapa del sitio), que es más probable que se crucen con un marco de datos si sólo se considera la extensión.

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