in Blog, Desarrollo

Casi una Killer Feature

Hacía mucho tiempo que quería escribir sobre esto y todavía no había tenido tiempo hasta hoy. Os voy a explicar qué hay dentro de la última feature que añadí para las aplicaciones de BilBikes, DonostiBikes y MálagaBikes.

El 5 de febrero publiqué un post hablando de diferentes cambios internos que había hecho en las aplicaciones, y entre ellos estaba añadir lo que en mi opinión era (casi) una killer feature: el listado de estaciones por cercanía.

Está claro que listar las estaciones por cercanía no es inventar la rueda, pero hasta el día que decidí incluirlo nunca me había parado a pensar en qué tipo de cálculos se basa y cómo pasarlo a código. Y esta es la razón de este post, destriparla.

La Fórmula de Haversine es menos exacta pero más fancy

Leyendo un poco sobre cómo desarrollar esto, vi que había varias opciones. Una de ellas, era usar una de las APIs que posee Google para calcular las distancias entre puntos y así calcular el listado en base a esas distancias. No tenía mala pinta pero continué mirando y llegue a la Fórmula de Haversine, menos exacta que las APIs de Google pero más fancy.

Como dice Wikipedia, es una importante ecuación para la navegación astronómica, en cuanto al cálculo de la distancia de círculo máximo entre dos puntos de un globo sabiendo su longitud y su latitud. Es un caso especial de una fórmula más general de trigonometría esférica, la ley de los semiversenos , que relaciona los lados y ángulos de los “triángulos esféricos”.

Me pareció muy interesante, hay que decir que esta fórmula es inexacta para este uso ya que se tiene en cuenta que la tierra es una esfera perfecta y no lo es, pero aún así me decidí a usarla para crear mi listado. Otro punto negativo es que al hacer cálculos usando esta Fórmula se tiene en cuenta la distancia en línea recta entre puntos, así que si hay edificios, u otros obstáculos no se tienes en cuenta. Meh.

Solo se necesita saber la longitud y latitud de cada punto entre los que queremos conocer la distancia.

Creé una función dentro del código en la parte donde se montan los diferentes objetos ‘estación’ y añadí ahí el cálculo de la distancia. Los datos que necesitas para el cálculo son básicamente 4, la latitud y longitud de los puntos que quieres medir, en este caso, la ubicación de la estación y la del usuario obtenida desde el reloj. Una vez obtenidos los datos, solo queda aplicar la Fórmula.

Y así, conseguí tener el listado de estaciones ordenados por cercanía, sencillo ¿no?

¿Tenéis alguna duda? Escríbeme en los comentarios y responderé en cuanto pueda.

¡Saludos!