Estoy tratando de desarrollar alguna manera de determinar la línea de visión (LOS) entre dos puntos geográficos de aproximadamente 1 km de distancia o menos utilizando ST_3DINTERSECTS o algo similar.
PROBLEMA BÁSICO:
A lo largo del camino, he descubierto que si calculo el ST_AZIMUTH entre dos puntos y luego utilizo esa marcación en una serie de sentencias ST_PROJECT para crear puntos adicionales a lo largo de la línea que conecta los dos puntos originales, obtengo un resultado cercano pero ligeramente diferentes ST_AZIMUTH cuando se calcula desde el punto de inicio original hasta cada uno de los nuevos puntos a lo largo de la línea.
Creo que esta ligera diferencia de rumbos entre las líneas está causando que mi llamada a la función ST_3DINTERSECTS devuelva false para todos los escenarios, incluso cuando la elevación del terreno debería estar bloqueando la LOS entre los dos puntos originales.
DETALLES:
Para empezar, tengo un punto inicial (SP) y un punto final (EP), ambos representados como geografías. Calculo el rumbo original: (OB) = ST_AZIMUTH(SP, EP)
. A continuación, utilizo el tamaño de mi STEP (STEP = 30 metros), SP y OB para crear puntos a lo largo de la línea que conecta SP y EP con el fin de extraer muestras de elevación a lo largo del camino: ST_PROJECT(SP, STEP, OB)
. De esta manera, ahora tengo aproximadamente 30 puntos geográficos con elevaciones a lo largo de la línea que conecta el SP y el EP.
En todos los casos, los datos de elevación se recuperan utilizando mis datos ráster en conjunción con estos puntos geográficos fundidos como geometrías, por ejemplo: ELEV = ST_VALUE(myraster, SP::geometry)
. También extraigo las coordenadas X e Y de los puntos de la geografía fundidos como geometrías, por ejemplo: X = ST_X(SP::geometry)
y Y = ST_Y(SP::geometry)
. Con esta información, creo una serie de puntos tridimensionales, por ejemplo: ST_MAKEPOINT(X, Y, ELEV)
para representar el SP y el EP originales, así como todos los puntos de muestra a lo largo de la línea que conecta el SP y el EP.
Usando estos puntos 3D, creo dos líneas, por ejemplo: ST_MAKELINE(my3dpoints)
. Una es una línea simple que conecta sólo el SP y el EP en 3D. La otra es una línea segmentada compuesta por todos los puntos de muestra tomados cada 30 metros a lo largo de la línea recta que conecta el SP y el EP. Cuando utilizo ST_3DINTERSECTS en ambas líneas, siempre devuelve un resultado falso, incluso si sé que el terreno debería estar obstruyendo la LOS.
PREGUNTA:
¿Puede alguien verificar si la ligera diferencia de rodamiento es la causa de que mis líneas no se crucen cuando deberían hacerlo? ¿Hay una forma mejor de hacerlo?
CONFIGURACIÓN:
Ejemplo SP = POINT(-74.714919, 41.282384), EP = POINT(-74.7147106468, 41.2913868143398) SP está siempre 3 metros por encima de la elevación real del terreno. EP está siempre 2 metros por encima de la elevación real del terreno. Estos dos puntos no deberían tener LOS debido al terreno.
Mi fuente de datos de elevación es: http://www.viewfinderpanoramas.org/dem3/K18.zip cargado usando raster2pgsql con SRID 4326.
Mi postgis_full_version() es: POSTGIS="2.1.1 r12113" GEOS="3.4.2-CAPI-1.8.2 r3924" PROJ="Rel. 4.8.0, 6 de marzo de 2012" GDAL="GDAL 1.10.0, publicado el 24/04/2013" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER