5 votos

Encontrar el polígono límite a partir de un conjunto de puntos cuadriculados (sin agujero)

Consideremos un conjunto de puntos bidimensionales (longitud, latitud) cada uno de los cuales es centro de una cuadrícula cuadrada (punto de intersección de las diagonales del cuadrado).

Intento que se entienda lo que quiero hacer de forma gráfica.

Datos de la muestra (conjunto de puntos):

lon<-c(88.56630, 88.62501, 88.60013, 88.57499, 88.65879, 88.63392, 88.60879)

lat<- c(21.03517, 21.01287, 21.05434, 21.09610, 21.03207, 21.07354, 21.11531)

Parcelas: enter image description here

Figura 1: El primero es el gráfico de dispersión del conjunto de puntos.

Figura 2: Todos los puntos son bilineales (esto es conocido).

Figura 3: Cada punto es el centro de un cuadrado de tamaño (aprox.) 4km por 4km (necesitamos construir esos cuadrados a partir del punto central dado).

Figura 4: Esto es lo que quiero tener, El polígono obtenido por los lados exteriores de los cuadrados (líneas negras).

Nota: Tengo muchos conjuntos de puntos de formas arbitrarias como la muestra anterior con la cardinalidad máxima de los conjuntos como 100.

¿Cómo se puede conseguir este polígono (sin agujero)?

0 votos

En su cita está "centro de un cuadrado de tamaño (aprox.)"- podría aclarar la palabra "aprox"- y/o adjuntar algún dato de muestra..

0 votos

@msi_g Gracias por su atención. Los datos dados en $(lat,lon)$ son los datos reales. Se trata de datos de satélite. Afirman que la distancia entre dos puntos es de 4 km pero podemos comprobar que la distancia geodésica entre dos puntos no es exactamente de 4 km sino un poco menos o más.

4voto

FelixIP Puntos 4035

He generado puntos utilizando líneas con una separación de 4000m en una dirección y 4050m en otra. Pseudocódigo para procesar:

  1. Crear un NIT utilizando cualquier campo. Obtenga triángulos y aristas del TIN utilizando TIN edge y TIN triangle: enter image description here

  2. Ordenar los bordes en orden descendente, ordenar el campo shape_length. Calcular sus puntos medios, mostrados en rojo, etiquetados por OBJECTID: enter image description here

  3. Iterar a través de los puntos y seleccionar los triángulos, utilizando los puntos seleccionados. Romper cuando el número de triángulos seleccionados=2 enter image description here

  4. La unión (geometría arcpy, no una herramienta) de estos 2 triángulos es la forma rectangular a multiplicar. Hay que crear una copia del rectángulo, para que su centro coincida con cada punto siguiente. Se trata de mover (no rotar) la forma, es decir, cambiar las coordenadas de los 5 puntos, utilizando la diferencia de coordenadas del punto objetivo y el centroide del rectángulo. enter image description here

Sí, tienes que codificar esto. Por supuesto, los puntos deben ser proyectados y agrupados primero.

0 votos

Sin embargo, ¿los puntos medios #20, 19, 9, etc. no seleccionarían dos triángulos que no forman un cuadrado?

0 votos

20 y 19 - no es una preocupación, están abajo en la lista descendente. Con el 9 ¡OOPS! Debería haber incluido el paso de delineación del TIN, es decir, la eliminación de los bordes largos.

0 votos

Ya veo. Una forma muy buena de hacerlo.

3voto

John Kramlich Puntos 286

Pude lograr lo siguiente, usando el buffer y la Geometría Mínima Limitada (extrayendo la envoltura de los buffers) y luego alguna intervención manual con la herramienta de rotación. A continuación, puede hacer una disolución final para devolver un solo polígono. No das ninguna indicación de cuántos de estos necesitas resolver, ¿unos pocos como tu captura de pantalla o cientos de miles?

Si la intervención manual no es una opción, entonces hay que girar el sobre para cada uno. No conozco ninguna herramienta de geoprocesamiento que pueda hacer esto y que yo sepa la rotación de geometrías no está expuesta a arcpy. Si sabes un poco de VBA podrías hacer un simple script para hacer esto usando la interfaz ITransform2D .

Example

0 votos

Gracias por su atención y por la respuesta. Tienes razón al señalar que puedo tener un conjunto de puntos con gran variedad de cardinalidad. He añadido este punto como nota en la pregunta original. Además, la intervención manual no es una opción. No estoy familiarizado con VBA. ¿Podría guiarme para hacer esta parte de la rotación en VBA o podría proporcionarme el código necesario? Gracias por su tiempo y consideració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