¿Donde está humitos?

This page is a translation from the Spanish one and maybe it’s outdated. Please, read the Spanish version to be up to date.

Este mapa es útil para saber en qué lugar estoy aproximadamente en este momento y cual es la ruta aproximada planificada a futuro, con el fin de contactar con gente de la zona para así poder coordinar algo relacionado al proyecto (u otra cosa de interés mutuo) y organizar para encontrarnos en las cercanías.

  • ruta ruta planeada para los meses Enero, Febrero y Marzo de 2016
  • destinos destinos que tenemos pensado visitar en esos meses
  • visitados lugares visitados desde el inicio del proyecto

¿Cómo funciona este mapa?

En pocas palabras, cuando me conecto a internet se envía una señal a mi blog para que actualice la posición en la que me encuentro, utilizando la información de la conexión a internet para saber dónde estoy.

Como el proceso es automático, permite que tenga una actualización mucho más precisa a la que yo le podría dar concientemente cada vez que cambio de posición.


¿Cómo funciona exactamente… ?

En profundidad, lo que hago es, mediante javascript, descargo el archivo my-position.json que es dónde están las coordenadas de mi posición actual y lo muestro en el mapa:

donde-esta-humitos/geolocation.js (Código fuente)

        $.getJSON("/assets/data/my-position.json", function(point){
            var icon = L.icon({
                iconUrl: '/assets/img/marker-car.png',
                shadowUrl: '/assets/img/marker-car-shadow.png',

                iconSize:     [64, 36], // size of the icon
                shadowSize:   [82, 49], // size of the shadow
                iconAnchor:   [32, 0],   // point of the icon which will correspond to marker's location
                shadowAnchor: [28, 10],   // the same for the shadow
                popupAnchor:  [0, -10] // point from which the popup should open relative to the iconAnchor
            });

            // center the map in my position
            map.setView(point, 11);

            var marker = L.marker(point, {icon: icon}).addTo(map);
            marker.bindPopup("<b><em>humitos</em></b> está <em>por</em> aquí!").openPopup();
        });
  1. Descarga el archivo my-position.json
  2. Crea el ícono del autito
  3. Agrega el punto que está en my-position.json al mapa
  4. Centra el mapa en esa posición

Ese my-position.json lo genero con un script Python.

donde-esta-humitos/geolocation.py (Código fuente)

def calc_my_position_ip(output=MY_POSITION_FILENAME):
    setup_output(output)

    # print(config.get('activated'))

    # if not config.get('activated', False):
    #     logger.info('Exiting: not activated')
    #     return

    logger.info('Waiting %s seconds...', WAIT_BEFORE_QUERY)
    time.sleep(WAIT_BEFORE_QUERY)
    logger.info('Querying the server about my ip...')
    response = geocoder.ip('me')
    logger.info('LatLng: %s', response.latlng)
    logger.info('Place: %s', response.address)
  1. Utiliza la librería geocoder para obtener las coordenadas de mi dirección de IP
  2. Loguea todo el proceso para, en caso de haber un error, saber qué ocurrió
  3. Guarda en el archivo my-position.json la longitud y latitud
  4. Sube el nuevo my-position.json (con las nuevas coordenadas) al servidor utilizando scp

Nota

Utilizo un time.sleep(WAIT_BEFORE_QUERY) así le doy un tiempo a NM para tener acceso a internet.

Ese script Python lo ejecuto con NetworkManager cuando este se conecta a una red.

donde-esta-humitos/geoblog (Código fuente)

#!/bin/bash
# /etc/NetworkManager/dispatcher.d/geoblog

IF=$1
STATUS=$2

cd /home/humitos/Source/blog/nikola

case "$2" in
    up)
    logger -s "NM Script 'geoblog' triggered"
    /home/humitos/.virtualenvs/blog/bin/python \
        geolocation.py --me &
    exit 0
    ;;
    *)
    ;;
esac

Nota

Este script va copiado en la carpeta /etc/NetworkManager/dispatch.d/geoblog y root tiene que ser el owner del archivo para que NM lo ejecute correctamente.

Básicamente lo que hace es ejecutar el script Python geolocation.py si la interfaz es levantada (up).

Nota

Es necesario usar & al final de cada comando así se ejecuta en background ya que NetworkManager tiene un bug que mata los scripts si demoran más de 3 segundos. Como yo necesito acceso a internet para comprobar mi posición, me lo estaba matando.

¡Eso es todo!