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


15

Sigo pensando que me falta 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 clase de entidad de punto que contiene el punto y realizando una SelectLayerByLocation en él. Sin embargo, cuando la clase de entidad poligonal está en Oracle (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 un segundo o dos (con menos código) serían 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 pobre.

¿Hay una manera más rápida de hacer esto usando ArcGIS Desktop 10 y ArcPy?


Ahora hay una solución para esto en foros.arcgis.com/threads/... y editaré esa información aquí más tarde hoy, muchas gracias a Jason Scheirer y Chris Snyder
PolyGeo

2
Solo como una nota a esto, puede encontrar los entornos honrados por una herramienta en la parte inferior de la página de referencia de la herramienta. SelectByLocation solo respeta el Espacio de trabajo actual y el Sistema de coordenadas de salida. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

Respuestas:


9

Otro enfoque para esto sería usar la herramienta Unión espacial. Use el punto como capa de entidades de entrada como se muestra arriba y la capa de polígono como entidades de identidad.
A diferencia de SelectLayerByLocation, SpatialJoin hace honor al entorno de medida.

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 dado que solo tiene una función de combinación, la función principal de esta opción es desactivar las reglas de agregación y fusión. KEEP_COMMON se asegurará de que su salida esté restringida solo al polígono que interseca su punto. Fieldmappings restringirá los atributos de salida a la forma y los atributos de la capa de polígono solamente; el valor predeterminado también incluiría los atributos de la capa de puntos.

El resto de los valores predeterminados funcionarán bien, por lo que puede omitir los argumentos restantes.


Muchas gracias por este código que contenía un par de técnicas que no había probado. Anteriormente había probado SpatialJoin (para poder respetar el entorno de geoprocesamiento), pero esa prueba, así como una prueba de su técnica en este momento, todavía me dejaban tiempos de respuesta de 4-5 minutos en comparación con 10-12 segundos por el camino Chris Snyder me llevó a.
PolyGeo

¿Has probado la técnica de Chris Snyder con SpatialJoin también? Creo que la razón principal por la que la técnica del búfer es tan rápida es que usa una copia en memoria de la clase de polígono. Creo que la selección por ubicación debería ser más rápida que la unión espacial, pero no estoy seguro.
blord-castillo

Terminé sin usar el bit in_memory. Ya se había acelerado tanto que lo mantuve en reserva. Creo que lo clave fue establecer la extensión para obtener uno / pocos polígonos (de 3.5 millones), con los que necesitaba verificar X, Y, copiados rápidamente en una geodatabase de archivos local. Entonces, hacer esa parte antes de SpatialJoin creo que conduciría a la misma mejora de rendimiento / similar.
PolyGeo

1

Me acabo de dar cuenta de algo ...

Si está utilizando esto para implementar un Servicio de geoprocesamiento, también podría implementar un Servicio de entidades con su capa de polígono y utilizar la operación Consulta en el servicio de entidades.

Usted puede utilizar una ubicación XY sencillo con Uso de las funciones del servicio de consulta, así como controlar los atributos de salida que incluye la forma.

Es posible que tenga restricciones sobre cuánto puede exponer la clase de entidad poligonal, pero si ya la está haciendo accesible para el servicio de geoprocesamiento, entonces también debería ser capaz de construir un servicio de entidades.


Esta es una idea útil para cumplir con otros requisitos, pero, en este caso, la aplicación del cliente es muy simple y está fuera de mi control, por lo que solo puedo proporcionar un Servicio de geoprocesamiento.
PolyGeo

Pensé que podría haber una restricción en el uso de algo que no sea un Servicio de geoprocesamiento :) Irónicamente, creo que un Servicio de características es una ruta mucho más simple de implementar y mantener. Esto también podría explicar por qué la funcionalidad que desea no está disponible; ya puedes hacerlo en cada nivel de aplicación. Asegúrese de enviar una solicitud a ESRI para implementarla como herramienta en la próxima versión.
blord-castillo

1

Esta respuesta provino de los antiguos foros de discusión de ArcGIS .

Gracias 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 un consejo de rendimiento:

Una solución más rápida podría ser amortiguar un poco su punto y luego usar la extensión del búfer como la extensión del análisis para hacer una copia in_memory (herramienta CopyFeatures) de sus datos SDE, y luego hacer una SelectByLocation en el conjunto de datos in_memory más pequeño y local. De esa manera, está haciendo que la herramienta SelectByLocation respete el entorno de extensión de análisis, lo que normalmente no haría. Por cierto: cualquier característica que se superponga con la extensión del análisis se copiará con la herramienta CopyFeatures. Seguro que deseo que la herramienta SelectByLocation y los métodos de cursores respeten la extensión del análisis ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.