¿Seleccionando el polígono ArcSDE por punto en ArcGIS Desktop usando ArcPy?

15

Sigo pensando que debo faltar algo, pero no parece haber una herramienta en ArcGIS 10 para seleccionar entidades (en particular polígonos) de una capa en una ubicación de punto (X, Y) a través de ArcPy. Los parámetros para tal herramienta serían solo un nombre de capa y una ubicación XY.

En este momento, soluciono esto creando una entidad de puntos que contiene el punto y realizando una SelectBloberLocation en él. Sin embargo, cuando la clase de entidad poligonal está en Oracle (a la que se accede a través de ArcSDE 9.x) y contiene 3.5 millones de polígonos, el tiempo necesario para realizar la selección puede ser de más de 5 minutos cuando creo que uno o dos segundos (con menos código) más apropiado. La clase de entidad tiene un índice espacial y he intentado usar arcpy.env.extent (que SelectLayerByLocation parece ignorar) para restringir el área geográfica a la que se accede, pero el rendimiento sigue siendo muy bajo.

¿Hay una forma más rápida de hacerlo usando ArcGIS Desktop 10 y ArcPy?

    
pregunta PolyGeo 21.07.2011 - 01:10

3 respuestas

9

Otro enfoque para esto sería utilizar la herramienta de unión espacial. Use el punto como su capa de entidad de entrada como se indica arriba y la capa de polígono como sus entidades de identidad.
A diferencia de SelectLayerByLocation, SpatialJoin respeta el entorno de extensión.

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

JOIN_ONE_TO_MANY puede parecer contrario a la intuición, pero como solo tiene una función de combinación, la función principal de esta opción es desactivar las reglas de combinación y combinación. KEEP_COMMON se asegurará de que su salida esté restringida solo al polígono que cruza su punto. Los Fieldmappings restringirán los atributos de salida solo a la forma y a los atributos de la capa de polígono; el valor predeterminado también incluiría los atributos de la capa de puntos.

El resto de los valores predeterminados funcionarán bien, así que puedes omitir los argumentos restantes.

    
respondido por el blord-castillo 03.08.2011 - 17:08
1

Me acabo de dar cuenta de algo ...

Si está usando esto para implementar un Servicio de Geoprocesamiento, también podría implementar un Servicio de Características con su capa de polígono y usar la operación de Consulta en el servicio de características.

Usted puede usar una ubicación XY simple con la operación de Consulta del Servicio de Características, así como controlar los atributos de salida, incluida la forma.

Es posible que tenga restricciones sobre cuánto puede exponer la clase de entidad poligonal, pero si ya lo está haciendo accesible al servicio de geoprocesamiento, también debería poder crear un Servicio de características.

    
respondido por el blord-castillo 06.08.2011 - 19:07
1

Esta respuesta proviene de foros de discusión de ArcGIS antiguos .

Gracias a Jason Scheirer por un código más conciso:

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

Y especialmente a Chris Snyder por una sugerencia de rendimiento:

  

Una solución más rápida podría ser amortiguar un poco tu punto y luego   utilizar la extensión del búfer como la extensión de análisis para hacer una copia en memoria   (Herramienta CopyFeatures) de sus datos SDE, y luego haga una SelectByLocation   en el conjunto de datos in_memory más pequeño y local. De esa manera eres una especie de   Hacer que la herramienta SelectByLocation respete la extensión del análisis.   Medio ambiente, que normalmente no haría. BTW: Cualquier característica que   La superposición con la extensión del análisis se copiará con las funciones de copia.   herramienta. Seguro que deseo la herramienta SelectByLocation y los métodos de cursores   honró la extensión del análisis ...

    
respondido por el PolyGeo 04.09.2014 - 13:48

Lea otras preguntas en las etiquetas