Estoy tratando de hacer coincidir segmentos pequeños con un segmento más grande con el que probablemente estén más relacionados: relativamente cerca, rumbo similar y uno frente al otro.
Aquí hay un ejemplo típico de los datos que tengo:
Aquí tendría que hacer coincidir el segmento 652 con 198969, mientras que 711 y 707 no coinciden con nada.
He buscado diferentes métodos, en particular la distancia de Hausdorff (basada en las respuestas aquí ). Lo calculé usando PostGIS pero obtengo resultados extraños: la distancia más corta que obtengo es entre 707 y 198985, y 652 tiene una distancia mayor a 198969 que a 198985, por ejemplo (puedo agregar la consulta y los resultados si es necesario).
¿Es Hausdorff realmente el método correcto para resolver esto? ¿Hay otros enfoques? Pensé en simplemente crear un conjunto de comprobaciones en los parámetros que mencioné (distancia, rumbo, etc.), pero tengo miedo de tener que agregar un montón de condiciones para manejar casos extremos o cosas como el umbral de cuánto son uno frente al otro.
Actualización: encontré un método que parece un compromiso aceptable:
- Primero encuentro los 10 segmentos negros más cercanos del azul que estoy tratando de igualar (usando el
<->
operador PostGIS ) que están a menos de 10 metros de distancia. - Luego creo un nuevo segmento al encontrar los puntos más cercanos a los extremos del segmento azul en cada uno de los negros (usando
ST_ClosestPoint
) y filtrar los resultados cuya longitud es inferior al 90% del azul (lo que significa que los segmentos no son frente, o que la diferencia de demora es más de ~ 20 °) - Luego obtengo el primer resultado ordenado por distancia y distancia de Hausdorff, si corresponde.
Puede haber algunos ajustes finos que hacer, pero parece hacer un trabajo aceptable por ahora. Todavía estoy buscando otros métodos o verificaciones adicionales para ejecutar si me perdí algunos casos extremos.
fuente
Respuestas:
Aquí hay un par de funciones que escribí que deberían permitirle hacer lo que necesita hacer. Verifique y vea si la línea es polilínea o segmento si la polilínea explota la línea, luego compare el acimut y el inverso del primer punto y el último punto en las líneas, establezca criterios aceptables para que el código tome una decisión por usted. Estos son métodos arcpy pero podrían modificarse.
devolver azimut desde el segmento de línea ESRI @shape
retorno inverso desde puntos ESRI
explotar polilínea en segmento de línea
recorre tu mesa así
estas propiedades deberían estar disponibles en postgis: primer punto, último punto, pointarray. Supongo que las propiedades de esri anteriores son las que mejor conozco, pero lo anterior se puede cambiar fácilmente para que funcione con postgis.
fuente