Algoritmo Geodesia / Topografía / Trigonometría

bLero

Hola,

Quizás este no sea el foro acertado para hacer esta pregunta, pero lo dejo caer por si tenemos algún topógrafo entre nuestras filas, o alguien que entienda del tema.

En primer lugar aclarar que lo mio es la informática y la trigonometría la tengo bastante olvidada.

Necesito encontrar un algoritmo para comprobar si determinada coordenada geográfica está entre ciertas coordenadas dadas.

Explicaré el problema paso a paso.

Supongamos que yo estoy posicionado en: 60.3423º, -2.3234º

y

Tengo una brújula que me dice que estoy mirando hacia: 44ºN.

Mi campo de visión es de 40º con lo cual abarco desde 24ºN a 64ºN. Y la distancia máxima de visualización son 10m. (Coloreado en amarillo).

Lo ilustraré con un dibujo.

Bien, ahora supongamos que tengo una lista de puntos geográficos, necesito saber si algún punto de los que tengo está en mi campo de visión.

¿Cómo lo haríais?

1
elkaoD

EDIT: cagada xD Estoy pensando (siempre me cuesta abstraerme en geometrías que no son inmediatamente planas :() Hay todo tipo de problemas, como que el espacio es toroidal y que tu campo de visión es una proyección sobre una esfera así que está deformado.

Así a bote pronto... si el rango de visión son 10 metros vas a tener todo tipo de problemas. Si era sólo un ejemplo olvida esto xD

http://es.wikipedia.org/wiki/Trigonometr%C3%ADa_esf%C3%A9rica <- aquí un poco del berenjenal en el que te estás metiendo xD

allmy

#1 Todo a base de matemáticas. Yo solo tengo nivel de mates de bachiller eh... xD

Me da que la cosa va a tratar de senos y cosenos. Tienes el punto en una posición X, la que tu has dicho arriba. Bien, los grados hacia donde señala la brújula está justo en medio de tu campo de visión. Por lo tanto, tienes que tu vista se extiende 20º en cada dirección a partir de la ralla central. Eso sabiendo la longitud y con trgonometría no es dificil de calcular. Por simplificar pongamos que partimos del punto 0 y que tienes que sacar el punto que está a 24º del centro, 10 cm más allá. Tienes que dividir la raya del 24 en sus dos componentes, vertical y horizontal. Y a base de trigonometría, coseno del ángulo entre la línea media y la de 24º hallar los dos componentes, vertical y horizontal, y con eso, sumado a los puntos que ya tienes, obtienes el punto. Haces lo mismo en los 64º. A partir de ahí, trazas un triángulo uniendo los puntos más lejanos de 24º y 64º. Y después haces una circunferencia de radio 10 desde el centro. Con eso tienes dos áreas. Ahora no se como tendrías que mirar si está dentro xD.

No se si te habré dado alguna idea, probablemente me haya equivocado en algo xD Tiene que ser más facil

1 respuesta
elkaoD

#3 es más difícil de hecho. No puedes usar trigonometría plana en una esfera porque simplemente... falla.

Me estoy devanando los sesos con la preguntita (no tengo ni idea de geometría esférica.)

Las coordenadas polares son una locura y más cuando están expresadas como dos componentes interdependientes. Cruzas el polo norte y pasas de estar en el meridiano 0º a estar en el 180º inmediatamente.

1 respuesta
allmy

#4 Cierto, me había limitado a pensar en el dibujo que había puesto #.1. Esfericamente tiene pinta de ser un sarao.

#1 Igual te ayuda mirar algo de programación de videojuegos. Como mera idea :D

#4 Tiene que haber alguna ecuación que defina una esfera alrededor de un punto en 3 dimensiones.

1 respuesta
allmy

#1 Esto te ayudará

http://es.wikipedia.org/wiki/Esfera#Ecuaci.C3.B3n_cartesiana

Faltan datos, para definir la posición exacta de la esfera en 3 dimensiones necesitas también la altura no? O se considera altura 0.?

1 respuesta
elkaoD

#5 #6 sigue sin valerle. Con eso defines la esfera en 3D, que es bastante fácil.

El problema viene de que la tierra en un mapa ha pasado de 3D a 2D con una proyección esférica. Se te DEFORMAN los ángulos. Carece de sentido el espacio euclidiano, ya sea 3D o 2D.

Para complicarlo aún más, #1 quiere deshacer la proyección para poder calcular distancias en el espacio euclidiano. Si encima tenemos en cuenta que no quiere sólo trabajar con líneas sino con areas (el campo de visión) tenemos un auténtico quebradero de cabeza.

Además en la representación cartográfica de latitud/longitud se dan MUCHOS problemas (todos los que se dan con las coordenadas polares.) Por ejemplo, en latitud 90ºN se dan TODOS los meridianos, desde el -180º hasta el 180º (que, por cierto, son el mismo ;)) Otro ejemplo: no es lo mismo moverte 90º al E y luego 30º al N, que hacer primero los 30º y luego los 90ºE.

1 respuesta
allmy

#7 Ostia cuando lo lees no parece tan complicado pffff.

Lol, #7 como que no es lo mismo ir a 90N 30E, que 30E 90N? El punto al que vas es el mismo al fin y al cabo

1 respuesta
Soltrac

Trigonometría esférica!!!!!!!!!!!!!!!!

OMG xDDDDDDD

elkaoD

#8 vale, tienes razón. El truco está en que tú ya tienes expresada la latitud y longitud con respecto al eje de la tierra y por eso sí es lo mismo (que no lo sería en otro sistema que no use grados, como por ejemplo, en kilómetros.)

Me expresé mal. El problema no es moverse (por lo que explico en el párrafo anterior, tenemos un Ecuador y un eje de la Tierra fijos) sino cambiar el origen (rotar la Tierra para que el Ecuador esté en otro lugar, que es básicamente lo que necesita #1.)

bLero

Gracias por las respuestas de momento.

El tema es complicado, las coordenadas pueden considerarse como planas, ya que va a haber muy poca distancia entre ellas (20-30m) por lo que no habrá casi error en cuanto a la deformación de los ángulos. El problema lo veo en el tema del ángulo de visión y de determinar si una coordenada está dentro o nó.

Creo que la solución va a estár en transformar las coordenadas geográficas a coordenadas UTM y operar en 2 dimensiones.

http://es.wikipedia.org/wiki/WGS84

1 respuesta
elkaoD

#11 ojo, con Mercator cuando más te alejes del Ecuador peor va a funcionar tu algoritmo.

Yo creo que los tiros van por cambiar el sistema de referencia para que A' = 0º0º

1 respuesta
bLero

#12

Voy a utilizarlo junto a la api de Google Maps que utiliza Mercator modificado.

http://en.wikipedia.org/wiki/Google_Maps#Satellite_view

1 respuesta
elkaoD

#13 Mércator es una proyección cilíndrica. Vas a tener problemas sí o sí, y más a esas escalas.

Si el ángulo y la distancia de visión son importantes, olvídate de Mercator. Si te puedes permitir MUCHO error (y variable además, aumenta según te alejas del ecuador) entonces adelante.

(Esta es la trasversal, que aumenta el error según te alejas del meridiano 0º... no he encontrado una imagen así para el Mercator común.)

Y así es en realidad la tierra EN AREA (proyección de Peters):

Cada proyección deforma una característica del mapa, así que supongo que lo más seguro es NO proyectar y trabajar directamente en coordenadas esféricas... o hacerlo con una proyección adecuada, lo cual se me escapa...

1 respuesta
bLero

#14

La idea es que sea preciso con respecto a los mapas de google maps, si google maps usa mercator y yo uso lo mismo supongo que no habrá problema.

1 respuesta
elkaoD

#15 espérate, que a lo mejor te he entendido mal... ¿vas a pasarle lat/long a Google Maps con el cálculo ya hecho o es Maps el que te la devuelve convertida en km/ángulo?

Si Maps te va a hacer el cálculo, está ok y de hecho es la vía que te recomiendo xD

Si eres tú el que va a realizar los cálculos y necesitas que esa distancia de 20 metros se represente de forma fiel en Google Maps, verás que cuanto más te alejes del ecuador peor representación obtendrás (depende de dónde tomes como referencia los 20m.)

Si necesitas precisión, la geometría esférica sigue siendo lo más simple.

1 respuesta
bLero

#16 Aún nose si maps me va a poder hacer el cálculo, de momento no he visto ningun método de la API que me lo permita así que supongo que haré yo mismo la conversión a WGS84 que es a lo que lo convierte el maps internamente para mostrarlo en el mapa.

El problema también está en mirar si los mapas de google maps son totalmente fieles a las coordenadas.

1 respuesta
elkaoD

#17 en un vistazo rápido a la API no he visto nada. Ya me dirás si encuentras algo porque MOLA :D

El problema también está en mirar si los mapas de google maps son totalmente fieles a las coordenadas.

Eeeeso es a lo que me refiero. Son fieles a las coordenadas PERO su representación no es la misma. A la misma escala, cuanto más te alejas del ecuador, más píxeles son 2km. Vamos, que si no encuentras una API para la distancia/ángulo, eres tú el que te tienes que currar los cálculos igualmente.

De todas formas creo que 20m es pedir mucha precisión, ¿no?

En un vistazo por la internet he encontrado esto (te vas a asustar, yo lo he hecho :P):

http://en.wikipedia.org/wiki/Great-circle_distance
http://www.movable-type.co.uk/scripts/gis-faq-5.1.html <- datos de errores y alternativas más simples

#17, lo tengo:

http://studiowhiz.com/2010/10/02/google-maps-v3-distancefrom/

En la APIv2 hay un método distanceFrom :) Ahí tienes una alternativa para la V3.

Sigo buscando para ángulos, pero cada vez pienso más que entre 0-20m poco vas a poder hacer y más teniendo en cuenta la precisión de la brújula de un móvil.

Más:

http://www.movable-type.co.uk/scripts/latlong.html

Mírate la de "Intersection of two paths given start points and bearings"

1 respuesta
bLero

#18

Interesante, aunque para hayar las distancias iva a utilizar la fórmula de distancias entre 2 puntos del plano.

Lo puntos geográficos que tengo difieren en menos de 100m entre ellos con lo cual no sufren la curvatura de la tierra.

1 respuesta
bLero

Creo que al final lo voy a hacer de una manera no analítica. Quizás sea mejor solución y obtenga menos errores.

Lo que se me ha ocurrido es dibujar todos los puntos en el mapa. Con OpenGL o similares dibujar el area de mi campo de visión que se vaya moviendo según lo que indica la brújula.

Cuando el campo de visión se introduzca en un punto que el sistema me avise.

Algo así:

2 respuestas
allmy

#20 Creo que ya lo tengo. Mirando las ecuaciones de wikipedia, he visto unas cuantas cosas. Si vas a considerar el suelo como plano y obviar la curvatura de la tierra. Es relativamente facil de esta manera, aunque probablemente pueda haber algún pero matemático xD. El algoritmo pasa saber si un punto está dentro es el siguiente:

Primero dibujas una esfera alrededor del punto de visión y comparas si el punto está dentro o no. Esto se hace de la siguiente manera.

(x-a)2+(y-b)2+(z-c)2

(donde x,y,z son las coordenadas espaciales del centro de la esfera, y a,b,c con las coorenadas espaciales del punto que quieres cotejar)

Ahora hallas el cuadrado del radio: r2

Si:

  • Ambos números son iguales, está justo en la línea de la esfera.
  • La parte anterior es mayor que el radio está fuera.
  • Si es menor, está dentro

Después nos queda el problema del ángulo. Para esto solo tenemos que definir una especie de cono dentro de nuestra esfera. Suponiendo que tu ojo esté mirando hacia delante, y no hacia arriba o hacia abajo, tenemos que hallar los puntos delimitados por el rango de visión que están sobre esa línea. En tu caso, como ya tienes hacia donde está mirando el "ojo", solo tienes que restando la mitad a coordenada de eje X, y sabiendo que ambos lados miden 10cm hallar con la tangente, los puntos que te faltan.

Después defines las líneas con una función, y restando miras si el punto está dentro o no. Y tatan!!!!

Creo xD

1 respuesta
squ4r3

no tengo ni idea de lo que estáis hablando pero me molan muchísimo este tipo de hilos xd

allmy

#20 Lo de #21 es una versión con dimensiones mezcladas de un casquete esférico. Puede que el casquete sea más sencillo de obtener.

http://es.wikipedia.org/wiki/Casquete_esf%C3%A9rico

Hallas las medidas a base de trigonometría simple, y haces el casquete, luego defines las funciones que marcan las líneas, y miras si está dentro.

1 respuesta
elkaoD

#19 a mí lo que me da miedo NO es la curvatura de la tierra, que está claro que en 100m no va a ser importante. En efecto recomendaría geometría euclídea para distancias tan pequeñas.

¡El problema es que la representación ORIGINAL está en una esfera! No hay una forma de pasar de lat/long a una geometría plana sin tener METROS de error. En la proyección el espacio se distorsiona no por la curvatura de la tierra (que es despreciable) sino por la proyección de coordenadas cartográficas a cartesianas.

Si realizas la proyección de Mercator, 20metros en tu proyección en el Ecuador no serán los mismo 20 metros que tu proyección en Helsinki, por ejemplo.

Y si sólo hay un margen entre 0-100m es muy fácil que las propias imprecisiones del GPS+brújula+error de cálculo hagan la aplicación inservible.

#21 pues sí, puede ser que trabajar en 3D drectamente sea la solución más simple en relación coste/resultado. #1, yo pobraría la idea de #21 a ver qué tal apaña.

1 respuesta
bLero

#24 #23

Muchas gracias por las respuestas, creo que primero probaré a realizarlo de forma analítica. Si veo que el error es muy grande y se escapa del margen que necesito lo realizaré a partir de gráficos y colisiones.

Actualizaré en el momento que vaya a implementarlo para informaros. Aún estoy en la fase de análisis del proyecto.

Usuarios habituales

  • bLero
  • elkaoD
  • allmy
  • squ4r3
  • Soltrac