7 votos

¿Cómo conectar lugares (puntos) sin cruzar líneas?

Tengo dos conjuntos de datos. Uno con marcadores representados por puntos azules en la imagen de abajo, y otro conjunto de datos geográficos con líneas representadas por líneas grises.

1) Para el primer punto en el dibujo, estoy buscando una forma de conectar automáticamente los marcadores, agregando nuevas líneas de geometría entre ellos, pero sin cruzar las líneas grises (que representan las calles de hecho). En el dibujo, las conexiones verdes son las conexiones deseadas, y las conexiones rojas son las no deseadas.

2) Este segundo punto tal vez sea más difícil de lograr. Las conexiones entre dos puntos no deben existir si no están "siguiendo" (quizás teniendo aproximadamente el mismo ángulo de) las líneas grises.

¿Es posible jugar con los datos para resolver este problema jugando con QGIS, u otra herramienta, y guardar nuevas líneas en la base de datos?

Esquema

P.D.: Soy nuevo en el mundo de los SIG.

2voto

ahockley Puntos 3310

Lo que viene a continuación es solo un concepto y no estoy seguro de si funcionaría, pero me resultó interesante pensar al respecto.

¿Tienes acceso a una base de datos de Oracle con Spatial? Si el trabajo es único y no cuentas con Oracle "en la empresa", tal vez podrías usar la máquina virtual de desarrollo de Oracle (http://www.oracle.com/technetwork/community/developer-vm/index.html) con todos los componentes ya instalados y listos para usar. No estoy seguro sobre las licencias, tendrías que verificarlo.

De todos modos, asumiendo que los puntos están en la tabla de PUNTOS y las líneas en la tabla de LÍNEAS, y ambas tablas tienen columnas ID y GEOM, la siguiente consulta debería devolver pares de puntos paralelos a las líneas grises, junto con la distancia entre los puntos.

select A.id, B.id, sdo_geom.sdo_distance(A.geom, B.geom, :T) as pts_dist 
from points A, points B, lines L
where A.id <> B.id
  and sdo_geom.sdo_distance(A.geom, L.geom, :T) = sdo_geom.sdo_distance(B.geom, L.geom, :T)
  and sdo_geom.sdo_distance(A.geom, L.geom, :T) < :X
  and not exists 
      (select 1 from lines L1
       where sdo_geom.relate(L1.geom, 'ANYINTERACT', 
             mdsys.sdo_geometry(/* parámetros para crear una línea entre A y B */), :T)) = 'TRUE')

No lo he probado en absoluto. El resultado aún tendría que ser procesado, porque obtendrías: a) dos enlaces para cada par de puntos, de A a B y de B a A; b) si hay 3 o más puntos a lo largo de una línea gris, obtendrías enlaces entre todos ellos - creo que la solución sería, para el punto dado A, elegir el enlace más corto desde este punto e ignorar/eliminar el resto (para eso sirve la distancia en el resultado).

Los parámetros utilizados en esta consulta: T - tolerancia (por ejemplo, 0.005); X - la distancia máxima entre el punto y la línea gris - los puntos paralelos posicionados demasiado lejos de la línea gris no se tendrían en cuenta (para esta línea).

La consulta podría cambiarse para comparar la distancia de A desde la línea y la distancia de B desde la línea con un "margen de error", de modo que si dos puntos son "casi" paralelos, igual se tendrían en cuenta en el resultado.

Probablemente la consulta no sea óptima y podría tardar bastante en ejecutarse. Pero, nuevamente, es solo un concepto y si decides probarlo, estoy seguro de que hay mucho por hacer.

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