2 votos

Diferentes resultados de ST_AZIMUTH para puntos de ST_PROJECT a lo largo del mismo rumbo original

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

1voto

NilObject Puntos 7874

Estás creando un ejemplo específico de la observación general de que la introducción de vértices en una geometría tiende a hacer que no sea la misma que la original.

SELECT ST_Equals(ST_Segmentize(geom,10),geom);

¿Por qué? Porque es posible (diablos, es común) que las "líneas" entre los vértices atraviesen números reales que no son representables usando números de punto flotante de doble precisión. Los dobles tienen un número finito de bits para mantener la información; los números reales tienen una precisión infinita. Cuando se crea un nuevo vértice en una línea, lo más probable es que sea casi en la línea, pero no exactamente, porque la línea atraviesa una parte del espacio cartesiano que no es representable exactamente con números de doble precisión.

¿Qué es un enfoque alternativo? Bueno, estás creando puntos a intervalos fijos de SP a EP. ¿Por qué no, además de tomar su elevación del MDE, calcular también el valor Z de la línea interpolada de SP a EP en ese punto: si la Z del MDE es superior a la Z interpolada, sabes que la LOS está obstruida y te detienes; de lo contrario, pasas al siguiente punto.

(Otro enfoque, similar al original, sería sustituir las intersecciones en 3D por la distancia en 3D, y comprobar si la distancia es casi cero, lo que indicaría un punto de cruce (o lo suficientemente cerca)).

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