4 votos

¿Cómo transferir atributos a miles de puntos locales desde la clase de entidad ArcSDE con millones de polígonos?

Tengo un conjunto de puntos y una enorme clase de entidad con información topográfica (OS MasterMap para que lo sabe). Estoy hablando de millones de polígonos enorme. Quiero transferencia de atributos de los polígonos a los puntos donde se intersectan.

He tratado de unión espacial, pero corrió fuera de la memoria. He tratado de identidad y que me da ninguna pista acerca de cuánto tiempo podría tomar, a pesar de que voy a dejar que se ejecute durante el fin de semana para ver donde termina.

Yo entonces pensé en hacer un script para tomar un punto en el tiempo y el uso que para seleccionar el subyacente de los polígonos. Haciendo un seleccionar capa por ubicación con la pequeña ventana de diálogo en ArcMap funciona bien, tarda menos de un segundo. Sin embargo, si sólo que desde la ventana de python lleva muchos minutos. He empezado a escribir un total de ArcPy secuencia de comandos para realizar una selección de la ubicación de uno en uno y, a continuación, actualizar el punto de atributos de los polígonos seleccionados los atributos. La actualización de un punto tomó cerca de 15 minutos. Y tengo alrededor de 8000 puntos para hacer. Por desgracia, mi jefe no me deja de brazos cruzados y esperar a que un script para finalizar, si se tarda 80 días para funcionar :(

Alguien tiene una idea acerca de cómo se podría hacer esto de forma más rápida, y por qué (¿por qué ESRI, ¿por qué???) SelectByLocation funciona mucho más rápido en ArcMap sí mismo?

edit: tal vez debería mencionar los puntos de la clase de entidad local y los polígonos de la clase de entidad es la SDE

============================================================================= SOLUCIÓN: Entre muchas de las sugerencias, que sólo es factible para mí, ser incapaz de instalar cualquier cosa, o el uso de varias estaciones de trabajo en el mismo tiempo, fue Polygeo la solución, por favor consulta la respuesta a continuación. La clave de la cosa a hacer es: un procesamiento de medida a una muy pequeña área alrededor de cada punto (hacer esto en un cursor), haz un polígono copia de la gran conjunto de datos utilizando esta extensión del procesamiento y obtener los atributos de la copia pequeña.

Estoy obligado a tratar de hacer una consulta en la base de datos de oracle a sí mismo como bueno, pero voy a necesitar ayuda de un colega con el que. Así que estoy tratando de conseguir PostGIS instalado y en uso. Voy a informar sobre esto así tan pronto como tengo resultados.

Gracias por su ayuda!

3voto

UnkwnTech Puntos 21942

Creo que usted debería ser capaz de obtener su "Actualización de un punto tomó cerca de 15 minutos" en pocos segundos mediante el uso de arcpy.env.medida.

Con 8.000 puntos el enfoque que estoy sugiriendo debe completar dentro de un día (peor caso) - incluso si usted escribe todo en el disco (que me gustaría hacer en la prueba inicial), pero un in_memory área de trabajo debe recorte que más.

  1. arcpy.da.SearchCursor recorre en su clase de entidad de punto a leer sus coordenadas y un identificador
  2. Select_analysis utiliza el identificador para copiar una clase de entidad de puntos de los 8,000
  3. Conjunto de arcpy.env.grado de un rectángulo es decir una décima parte de un metro alrededor de la coordenada
  4. CopyFeatures_management copias el OSMM capa dentro de la extensión de Geoprocesamiento es decir, casi siempre de un solo punto, pero si de vez en cuando la huelga de un límite, entonces usted puede obtener un par de - este debe tomar sólo un segundo o dos, debido a que con frecuencia el uso de este procedimiento en un 3,5 millones de polígono catastral
  5. Intersect_analysis su clase de entidad de puntos con su uno (o algunos) de polígonos a la clase de entidad. Si "la transferencia de atributos de los polígonos" no todos los atributos, a continuación, sólo de lectura/escritura a ellos a través de los cursores se pueden utilizar para acelerar este proceso.
  6. Append_management su 8,000 interceptó punto de clases de entidad en una sola clase de entidad o, preferiblemente el uso de arcpy.da.InsertCursor para hacer esta parte mucho más rápido.

Todos en todos, se centran en la prueba paso 4 primeros si que es tomar más de un par de segundos y luego multiplicar por 8,000 convierte en un problema.

Cuide a su vez arcpy.env.medida de vuelta a la "MAXOF" una vez que haya terminado de procesar.

3voto

Nick Puntos 3115

Si usted está tratando de hacer esto con TODOS los OS MasterMap de datos, entonces es una gran tarea, de hecho, pero también es algo similar a algunos trabajos que he realizado, por lo que se puede hacer.

En primer lugar, la ejecución de ArcPy a partir de una secuencia de comandos de Python independiente tiene siempre un éxito como no hay tiempo asociados con la carga de las bibliotecas en el inicio, que ya está hecho cuando se abra ArcMap, pero sólo se debe tomar la golpeó una vez por cada proceso.

Movimiento en el problema real: Francamente no me sorprende que se ejecutó fuera de la memoria, como se hubiera tomado de un monstruo de un equipo que no tiene! Me gustaría (did) de la subdivisión de tareas y uso de OS hojas del mapa o de la subdivisión de ellos es un enfoque útil, pero me gustaría certianly NO hacer de esto un punto a la vez. Me gustaría escribir una secuencia de comandos que se seleccionan puntos en un set y los polígonos en otro basado en la red, que coincide con el sistema operativo hojas del mapa (100km cuadrados puede ser demasiado grande la memoria del sabio, por lo que podría tener para ir a 20km o algo). Me gustaría, a continuación, hacer una unión espacial como originalmente probado y enjuague y repita hasta que todos los 20km azulejos se han completado. El truco es conseguir que el tamaño óptimo de la pieza de manera que se tenga memoria suficiente para realizar la tarea en un tiempo razonable, con un mínimo de disco-paliza (especialmente a partir de la paginación) - que sólo se puede determinar que, debido a que depende tanto de sus datos, su versión de ArcGIS y la máquina en la que estamos haciendo esto.

Un refinamiento adicional, si desea que la tarea para completar en algún momento de este siglo, es a la granja para fuera como subprocesos, preferentemente, a través de varias máquinas. He encontrado una regla de oro para no ser más subprocesos que el número de núcleos y si tiene cuatro o más núcleos, dejar uno libre para el sistema operativo para jugar con. Ahora, cuando hice este tipo de trabajo, he tenido acceso a un programador que escribió una utilidad para automáticamente granja de puestos de trabajo a través de una red de ordenadores para mi código a la crisis. Supongo que no tienen ese lujo, así que se podría dividir el país por los conjuntos de 20km azulejos y tener esas como una lista en un archivo de texto simple que el código de python va a leer. Instalar todo esto en tantas máquinas como usted puede conseguir el asimiento de ArcGIS licencias y, la ejecución de los subprocesos, tiene una variable de entorno que se establece en tiempo de ejecución, lo que da una lectura de desplazamiento para los iconos de la lista, de modo que cada equipo se encarga de un único conjunto de azulejos.

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