Solución al reto 8 de la nave perdida

La semana pasada os planteábamos el reto de la nave perdida, nuestro octavo reto de este año y el primero que utiliza el API de Google Maps.

El objetivo era obtener las coordenadas exactas de la ubicación de una nave alienígena perdida en la Tierra a partir de la observación del recorrido de una sonda de búsqueda.

El código del reto se basa en epoly.js de Mike Williams, una extensión que añade siete métodos extra para las clases GPolygon y GPolyline.
Gracias a esta extensión podemos mover fácilmente la sonda (marker) a través del mapa mundi de Google, siguiendo una poli línea "invisible" que primero tenemos que decodificar para poder obtener cada uno de los puntos del itinerario por donde la sonda de búsqueda va pasando. Una vez conseguidos, debemos observar la sucesión matemática de las coordenadas para obtener el lugar exacto dónde la nave alienígena se estrelló...

Pero veamos la forma de resolverlo a través de la perspectiva del ganador del reto: Brixton Cat, que nos ha enviado el siguiente y fantástico solucionario:

Reto HackPlayers: La nave perdida
Fecha de realización 26/11/2010
Autor: Brixton Cat

Lo primero que hago es revisar la fuente de la página para localizar el trozo de código donde obtener pistas sobre la animación.


Se trata de un script JavaScript y según el nombre de las clases, junto con un poco de intuición, podemos suponer que se tiene que tratar de alguna API de Google[1].


Ya deteniéndome en el código y en las distintas opciones que se utilizan, veo que inicialmente se crea el mapa y posteriormente la poli-línea que marca el trazado de la nave.

points: "osrkKntgd]fmxaQ_nszCmsrkKohwu\\txduD_nszCwyluEj`saI",

Ya tenemos los puntos por los que pasa pero están codificados :-(

Vuelvo a dirigirme a Google para que me aporte más información de su programa y encuentro una Web[3] donde se detalla la codificación de la clase GPolyline.fromEncoded[2] y más específicamente sobre las variables que se pueden utilizar



De ahí obtengo que las coordenadas se codifican con la herramienta Interactive Polyline Encoder Utility[4] por lo que busco un poco de información sobre la misma y, aprovechando que tiene un decodificador, intento fallidamente obtener los puntos por los que ha pasado la nave.


Sigo revisando los resultados que me ofrece Google sobre su herramienta y encuentro otra Web[5] con información interesante sobre dicha clase y sobre el algoritmo[6] que se utiliza para codificar las coordenadas.

Ahí encuentro una pista reveladora: Las barras invertidas (\) son caracteres de escape por lo que deben duplicarse en los resultados en los que aparezca.



Me vuelvo a dirigir a la herramienta de Google para volverlo a intentar con esta nueva información quitando esta vez una de las barras invertidas y ahí está


Sigo buscando sobre el tema y sobre la codificación de las coordenadas y encuentro más información sobre la codificación de las poli-líneas para Google-Maps[7] en el que también tenemos otro decodificador[8] que pruebo de nuevo.

En este caso ni siquiera es necesario quitar la doble barra invertida ;-)



Gracias a las pistas y a la ayuda prestada, obtengo que las coordenadas corresponden a una sucesión matemática. Las coordenadas son:

64.9812,-158.1500
-29.8486,-132.6500

35.1326,23.1224

5.2840,48.6224

40.4166,-4.2367


Y si separamos latitud y longitud obtenemos:

64.9812, -29.8486, 35.1326, 5.2840, 40.4166, X
-158.1500, -132.6500, 23.1224, 48.6224, -4.2367, Y


Para la primera sucesión, la latitud, vemos que cada nueva coordenada corresponde con
la suma de las dos anteriores (Fibonacci), es decir:

64.9812 + (-29.8486) = 35.1326
-29.8486 + 35.1326 = 5.2840

35.1326 + 5.2840 = 40.4166

5.2840 + 40.4166 = X = 45.7006

La sucesión para la longitud ya no es lo mismo… Al principio intenté con la relación anterior y viendo que eso no me llevaba a ningún sitio empecé a probar otras cosas….
Utilizando las coordenadas en valores absolutos y en pareja podemos observar que hay una diferencia de 25,5 puntos, desarrollándolo sería:

158.1500 – 132.65 = 25.5
48.6224 – 23.1224 = 25.5
(He cambiado el orden para evitar el negativo)
4.2367 – Y = 25.5


Despejo Y de la ecuación anterior de la siguiente manera:

- Y = 25.5 – 4.2367
Y = -25.5 + 4.2367 = -21,2633

Ahora podemos ver donde está la nave perdida, las coordenadas son 45.7006,-21.2633.
Podemos buscarla para ver que encontramos



Y con el zoom al máximo….


Mmmm esto no cuadra mucho… Nuevamente, Vicente, me aclara la situación. La longitud no es negativa. Las coordenadas por tanto serían: 45.7006,21.2633 que buscándolas corresponden con la captura


La explicación sería…

Dado que la última pareja de coordenadas debe tener una diferencia de (+ = positiva) 25,5 puntos, tenemos que:

Y – 4.2367 = 25,5

por lo que

Y = 25,5 – 4,2367 = 21,2633

Siendo ésta la coordenada correcta…

El reto me ha resultado muy interesante y educativo dado que no conocía esta API ni los
usos que se pueden sacar de ella… Gracias a la ayuda y a las pistas recibidas porque
sino nunca habría podido resolverlo debido a que no pensé que la coordenada estaría
fuera del mapa y/o página Web...

Nos vemos en la próxima… Un saludo, Brixton Cat ;-)


Referencias:

[1]http://code.google.com/intl/es-ES/apis/maps/index.html
[2]http://code.google.com/intl/esES/apis/maps/documentation/javascript/v2/reference.html#GP
olyline.fromEncoded

[3]http://sabia.tic.udc.es/gc/Contenidos%20adicionales/trabajos/3D/Internet%20GIS/cod_come
ntado.html

[4]http://code.google.com/intl/es-ES/apis/maps/documentation/utilities/polylineutility.html
[5]http://unitstep.net/blog/2008/05/11/playing-with-google-maps-and-encoded-polylines/
[6]http://code.google.com/intl/es-ES/apis/maps/documentation/utilities/polylinealgorithm.html
[7]http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/
[8]http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/decode.html


Comentarios