Algoritmo: mover una polilínea de origen a una polilínea de referencia (completa o quizás parcialmente)

10

En nuestro sistema, existen los requisitos que queremos mover algunas líneas de origen (con baja precisión) a líneas de referencia (con alta precisión). Las siguientes imágenes muestran los casos de uso normales. La roja es una línea de origen y la azul es una línea de referencia.

La roja es la línea de origen y la azul es la línea de referencia.

Para este caso, la línea de origen se movería parcialmente, y el resultado sería como muestra la línea verde:

Mover resultado 1

Hay situaciones en las que la línea de origen debe moverse por completo.

Ejemplo 2

Resultado:

Mover resultado 2

Actualmente, nuestra solución es proyectar el punto de cabecera / final de la línea de origen a la línea de referencia y viceversa, luego buscar los puntos proyectados en la línea de origen y de referencia. Con estos puntos proyectados, podemos extraer la parte necesaria de la fuente y la línea de referencia y luego combinarlos en uno nuevo.

Esto funciona para la mayoría de los casos, pero hay casos en que este método no funciona. Específicamente, cuando cualquiera de las líneas tiene forma de "C" o el punto de cabecera está muy cerca del punto final. Las siguientes dos imágenes dan el escenario.

C como línea de forma

Aplicando mi algoritmo, obtenemos el resultado:

Resultados

En cierto modo, es comprensible porque el algoritmo actual solo encuentra puntos proyectados y extrae líneas.

Lo que esperábamos es algo como esto:

Resultados previstos

Entonces, lo que necesito es un algoritmo más robusto para hacer esto, de modo que también pueda manejar casos especiales como el anterior. Intenté proyectar todos los puntos de una línea a otra y encontrar los dos puntos proyectados más cercanos al punto de inicio / final de la línea proyectada, pero no tuve suerte. Aún así puedo encontrar casos que dan resultados inesperados.

¿Alguien ha encontrado problemas similares antes? También sería genial si hay un software o una biblioteca que pueda hacer un trabajo similar. Cualquier respuesta será apreciada.

mfdev
fuente
1
Tal vez lo ayude cuando observe cómo la Topología en ArcGIS verifica si los objetos son coincidentes: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… párrafo "Procesamiento de clúster".
Jens
Gracias por tu respuesta, @Jens. Pero me temo que eso no es lo que quiero.
mfdev
¿Estas líneas representan una red? ¿Hay relaciones topológicas entre ellos?
julien
No tiene que ser una red y posiblemente ninguna relación topológica.
mfdev

Respuestas:

4

Mi estimación es que los casos finales a menudo serán excepciones que no son programables por máquina. Trabajé con problemas similares y siempre requirieron una cierta cantidad de edición manual. Lo que debe sintonizar son las excepciones producidas por el caso y servirlas en un sistema de gestión de trabajo a un usuario final.

Luis
fuente
Un ejemplo algo similar de esto se puede ver aquí: vividsolutions.com/jcs JCS hace un largo camino para automatizar la combinación de geometría, pero también incluye control de calidad manual para geometrías que no se pueden fusionar por completo. vividsolutions.com/… está construido a partir de él y permite el control de calidad y agrega el seguimiento de problemas para geometrías difíciles.
DPierce
1
Todas las soluciones topológicas no se pueden automatizar mediante programación y, en las grandes empresas, estas soluciones se desarrollan de manera similar al ejemplo, ya que la fusión puede ser de naturaleza grande y cíclica con geometrías de transporte complejas con una alta tasa de cambio.
Lewis
2

Necesitará una tolerancia de ajuste y una tolerancia de giro para este algoritmo (supongo que ya tiene una tolerancia de ajuste).

Proyecte el punto de cabecera desde la línea de origen a la línea de referencia. Rompa la línea de referencia en este punto proyectado.

Atraviese la línea de origen desde el punto principal hasta el primer vértice para obtener la dirección de desplazamiento a lo largo de la línea de origen. Atraviese cada una de sus dos líneas de referencia desde el punto fuente proyectado hasta el siguiente vértice. Si la dirección de desplazamiento está dentro de la tolerancia de giro de la dirección de desplazamiento desde el punto de cabecera en su línea de origen, aplique su algoritmo normalmente, pero solo usando esa sección de la línea de referencia. Si el algoritmo llega al final de la línea de origen, ya está. De lo contrario, rompa la línea de origen entre la pieza transformada y la pieza no transformada (que incluirá el punto final).

Ahora tome la pieza no transformada y proyecte el punto final en la línea de referencia original. Realice el mismo procedimiento que antes ... atraviese la fuente desde el punto final hasta el primer vértice para encontrar la dirección de desplazamiento. Rompa la línea de referencia en el punto final del proyecto y recorra cada uno para encontrar si la dirección de desplazamiento desde el punto final proyectado está dentro de la tolerancia de giro. Si es así, use esa parte de la línea de referencia para aplicar el algoritmo normalmente.

Recuerde, en este punto solo está utilizando la pieza no transformada, por lo que no se superpondrá con la transformación del punto de cabecera.

Finalmente, combine las dos piezas de línea resultantes si es necesario: la pieza transformada del punto de cabecera desde el punto de cabeza proyectado hasta el punto de ruptura no transformado y luego en la pieza transformada del punto final desde el punto de ruptura no transformado hasta el punto final proyectado.

castillo-blord
fuente