Más

Vecinos de parcela determinados mediante PYTHON

Vecinos de parcela determinados mediante PYTHON


Como puede ver en la Primera imagen, tengo la parcela 220 y quiero determinar la posición de cada uno de sus vecinos. Así que la idea era calcular el rumbo entre el centroide de 220 y el otro centroide de vecinos (cuando el rumbo está entre [50,150] = Norte; [150, 250] = Este; [250,350] = Oeste…). Entonces, para determinar los vecinos, uso la funciónarcpy.PolygonNeighbors_analysis (in_features, out_table, {in_fields})(Imagen 2), y en la imagen 3, tenemos una parcela con centroide (X, Y). Así que cada vez que debería tomar

  1. (X, Y) de P220 como punto de inicio y (X, Y) de P228 como punto final que calcular el rumbo
  2. (X, Y) de P220 como punto de inicio y (X, Y) de P227 como punto final, calcular el rumbo
  3. (X, Y) de P220 como punto inicial y (X, Y) de P226 como punto final, calcular el rumbo
  4. que para todos los vecinos de la Imagen 2

Para hacer esto, usé tres bucles para, y creo que está girando a la derecha, pero lo hace solo para la primera fila, ¡y no se mueve a la fila de tritón!

El código es este:

>>> cur = arcpy.UpdateCursor ("Join_Output_12") >>> cur2 = arcpy.UpdateCursor ("Join_Output_12") >>> cur_t = arcpy.UpdateCursor ("tb20_12_2014_") >>> del row2, Refname__table_neighbor, start1x1, start , end_x1, end_y1, copy_field >>> para la fila en cur:… Refname_feature = row.getValue ("RefName")… para row_t en cur_t:… Refname__table_target = row_t.getValue ("src_RefName")… if (Refname__table_target == Refname_feature) :… Start_x1 = row.getValue ("POINT_X")… start_y1 = row.getValue ("POINT_Y")… imprimir Refname_feature… imprimir start_x1… imprimir start_y1… Refname__table_neighbor = row_t.getValue ("nbr_RefName")… imprimir Refname para row__table_neighbor cur2:… copy_field = row2.getValue ("copy_field")… if (copy_field == Refname__table_neighbor):… end_x1 = row2.getValue ("POINT_X")… end_y1 = row2.getValue ("POINT_Y")… imprimir copy_field… imprimir end_x1 … Imprimir end_y1… row = cur.next ()

El resultado es:

1 221408.8543 200288.7235 1 1 221408.8543 200288.7235

¡Así que creo que el problema proviene del bucle for!

Ahora, después de obtener este resultado, puede verlo en la imagen 4 (Posición de cada paquete) ¡El resultado que obtuve fue bueno! Pero no responde al 100% a mi necesidad, para ser más claro veamos el ejemplo de la parcela 221, tiene parcela vecino 220 al norte y también al oeste, pero en la mesa podemos ver solo el norte, para eso quiero para cancatenar este resultado al resultado de la funciónCalcular la cartografía de campos adyacentes (in_features, in_field)me dirás por qué no usar solo esta función? ¡pero también es incompleto! mira la imagen 5 para ver el resultado Tomemos el ejemplo P220, podemos ver que establece solo 224, 226 en el norte, ¡incluso si hay más! ¡Entonces la idea es concatenar los dos resultados para obtener al menos un resultado más completo y confiable! Pero como hacerlo ? ¡¡No encuentro una lógica para combinarlos !!

EDITAR: Este es un ejemplo de relación complicada, y sobre la mesa después de lo que obtengo como resultado la línea en color, presenta Vecinos recogidos por el programa, y ​​cuando miré qué tipo de desorden de paquetes, encontré quién no está en contacto con el paquete de taget (como 164 P2 y 150 en el norte…) !!


Los cursores integrados son la peor forma de programar cualquier cosa. No lo hagas. Su código falla porque los cursores solo leen de una manera una vez. Por lo tanto, el cursor interior debe reconstruirse completamente desde cero y comenzar de nuevo para cada registro del cursor externo. Por cada registro adicional que tiene que comparar en cada tabla, el tiempo que lleva comparar las dos tablas crece básicamente en una curva de crecimiento exponencial, lo que debe evitarse a toda costa si tiene más de 50 registros en cada tabla.

Tus cursores tampoco son dadores, por lo que son 10 veces más lentos al salir de la puerta. Utilice dos bucles de cursor completamente separados. Uno para leer los datos de las fuentes en dos diccionarios y el otro para actualizar las funciones en función de las coincidencias realizadas con los diccionarios. Los diccionarios son estructuras de acceso aleatorio, los cursores no y los diccionarios están en la memoria, mientras que los cursores no. Por lo tanto, obtiene un rendimiento de 20 a 100 veces mejor con el enfoque que estoy recomendando. Consulte mi blog sobre manipulación de datos de carga turbo con cursores y diccionarios de Python.

Está utilizando UpdateCursors pero no escribe nada en la tabla. ¿Por qué? Necesita un campo X e Y para escribir. Solo necesita un UpdateCursor en una fuente, nunca dos en la misma fuente de datos. Defina esos campos y sus nombres y en qué tabla residirán.

Así que estudia mi blog y empieza de nuevo. usted será feliz de haberlo hecho.

Gracias por editar tu publicación con un gráfico que explica la fuente de las tablas y el objetivo del análisis, así como mejores tablas para trabajar. El primer paso es agregar 4 campos Double a la tabla con los dos campos src_RefName y nbr_RefName para contener las XY de los dos centroides de la otra tabla para que haya un lugar para almacenar los resultados del curso de actualización. Los llamaré X_Start, Y_Start, X_End e Y_End. También agregue otro campo doble para Bearing. El rumbo calculado a continuación es el rumbo trigonométrico que comienza en el este y va en sentido contrario a las agujas del reloj, no el rumbo de navegación que comienza en el norte y va en el sentido de las agujas del reloj. Si desea el rumbo de navegación, cambie la línea que dice: updateRow6 = (ángulo + 360)% 360 a updateRow6 = (90 - angle)% 360. La asociación de rumbos a los puntos de la brújula es [45-135] = Norte, [ 135-225] = Oeste, [225-315] = Sur, [315-359.9…, 0-45] = Este.

Ahora cargue la tabla con el centroide XY en un diccionario. Luego, obtenga los dos valores de RefName de cada fila y complete las 2 coordenadas XY y los campos dobles de rumbo. El tercer ejemplo de mi blog se puede adaptar para hacer el proceso.

from time import strftime print "Iniciar script:" + strftime ("% Y-% m-% d% H:% M:% S") importar arcpy desde matemáticas importar grados, atan2 sourceFC = r "C:  Path  SourceFeatureClass "sourceFieldsList = [" RefName "," POINT_X "," POINT_Y "] # Utilice la lista de comprensión para construir un diccionario a partir de un da SearchCursor valueDict = {r [0] :( r [1:]) para r en arcpy.da. SearchCursor (sourceFC, sourceFieldsList)} updateFC = r "C:  Path  UpdateFeatureClass" updateFieldsList = ["src_RefName", "nbr_RefName", "X_Start", "Y_Start", "X_End", "Y_End", "Bearing"] con arcpy.da.UpdateCursor (updateFC, updateFieldsList) como updateRows: para updateRow en updateRows: # almacenar el valor src_RefName y nbr_RefName de la fila en un par de variables keyValue keyValue1 = updateRow [0] keyValue2 = updateRow [1] # verificar que el keyValues ​​están en el Diccionario si keyValue1 en valueDict y keyValue2 en valueDict: # transfiere el valor almacenado bajo keyValues ​​del diccionario al campo actualizado. updateRow [2] = valueDict [keyValue1] [0] updateRow [3] = valueDict [keyValue1] [2] updateRow [4] = valueDict [keyValue2] [0] updateRow [5] = valueDict [keyValue2] [3] ángulo = grados (atan2 (valueDict [keyValue1] [4] - valueDict [keyValue2] [5], valueDict [keyValue1] [0] - valueDict [keyValue2] [0])) updateRow [6] = (ángulo + 360)% 360 updateRows .updateRow (updateRow) del valueDict print "Script terminado:" + strftime ("% Y-% m-% d% H:% M:% S")

Editar:

Ha extendido su pregunta a un problema diferente sobre cómo tratar de describir con precisión la imagen utilizando una tabla de direcciones de la brújula. Al hacer esto, está planteando un problema mucho mayor. Escribir un programa para evaluar tu imagen correctamente en esta tabla es como intentar que un grupo de ciegos se pongan de acuerdo sobre cómo es un elefante cuando solo experimentan una pequeña parte de él. Eso es lo que intenta cuando programa realidades complejas en generalizaciones simplificadas y las divide en exámenes separados de partes pequeñas. Es casi imposible que los ciegos que operan de esta manera presenten la misma descripción de la realidad que explicaría una persona vidente.

Nuestros ojos y cerebro son asombrosos para determinar casi instantáneamente qué tomar y qué tirar al tratar de evaluar la imagen que dio, y ningún programa que usted o yo podamos escribir puede igualarlo. Sin embargo, incluso para las personas videntes, la complejidad de sus formas significa que no existe una tabla perfecta, ya que incluso las personas videntes pueden abordar su problema desde varios puntos de vista y crear diferentes tablas de descripción de la dirección de la brújula (yo mismo puedo ver varias respuestas correctas, dependiendo de los métodos que adopte). Así que en algún momento tienes que estar satisfecho con las imperfecciones que siempre crean las generalizaciones y las limitaciones de la metodología elegida. Pero eso no significa que esté limitado a un programa que solo considera una metodología. Sin embargo, las metodologías deben aplicarse de una manera progresivamente más compleja después de que los enfoques menos complejos resulten inadecuados.

Por ejemplo, no ha evaluado realmente los rumbos de sus polígonos donde se tocan, solo ha evaluado los rumbos de sus centroides poligonales. Esta es la parte del elefante que tus ciegos han experimentado y te han contado actualmente sobre este elefante.

Esos centroides pueden tener una mala relación con el borde compartido de sus polígonos. Un análisis potencialmente mejor es examinar los dos cojinetes de los centroides del polígono al centroide que cae en el borde compartido de sus polígonos. Como parte de ese análisis, probablemente también deba determinar qué polígono está a lo largo del lado derecho del borde compartido y cuál está a lo largo del lado izquierdo del borde compartido para obtener el ángulo normal a la línea en el centroide de la línea para cada polígono. Esto formará otro conjunto de ángulos que podrían revelar la suficiencia o insuficiencia del rumbo del centroide que ya ha examinado para describir las orientaciones relativas de la brújula de los dos polígonos. Obviamente, traducir este conjunto de ángulos para equipararlo a lo que sus ojos y su mente consideran es más desafiante, pero probablemente se parezca más a lo que realmente está haciendo su cerebro. También puede mirar los extremos del borde compartido y sus ángulos normales como una forma más de evaluar la adecuación del centroide del borde compartido para dar una imagen de la realidad. Aquí hay una imagen de la parte del elefante que este análisis de centroide de borde compartido podría pintar:

Si observa el rumbo del centroide del polígono 224 al centroide del polígono 220 en la primera imagen, parece que la relación de rumbo debería describirse como hacia el suroeste. Sin embargo, cuando mira la imagen de los rumbos del centroide del polígono 224 al centroide de su borde compartido con el polígono 220, está claro que la relación de rumbo entre 224 y 220 desde ese punto de vista se describe con mayor precisión como un Relación con rumbo sureste. Desde diferentes puntos de vista, ambos son ciertos de este elefante. La pregunta es, ¿solo acepta una de estas respuestas como verdadera o acepta ambas como verdaderas?

Pero, ¿qué pasa si los dos polígonos se tocan en varios lugares y comparten más de un borde continuo? ¿Que haces entonces? La respuesta es siempre resolver primero los problemas más simples y luego encontrar una manera de aislar el conjunto de objetos que desafían esa solución y volver a probar solo ese conjunto. Eso es lo que hace que un buen proceso de programa sea eficiente sin perder un tiempo precioso haciendo muchas evaluaciones innecesarias.

Como puede ver, este problema puede ir mucho más allá de lo que una simple publicación puede responder y, dependiendo de la importancia de esta tabla para sus necesidades de análisis, solo usted puede determinar cuánto tiempo está dispuesto a dedicar a acercar a los ciegos programáticos a la realidad. del elefante que tú, el hombre vidente, ves. No obstante, ahora puede ver que la técnica de convertir cursores de acceso no aleatorio en diccionarios de acceso aleatorio (y ahora listas dentro de diccionarios) es esencial para que sea posible evaluar el problema de manera eficiente.


Ver el vídeo: 10. Introduction to Learning, Nearest Neighbors