¿Donde está humitos?

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.

  • destinos destinos que tenemos pensado visitar en los próximos 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)
    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)

    return calc_my_position_address(response.address, output)


def calc_my_position_address(address, output, upload=True):
    logger.info('Querying the server about "%s"...', address)
    response = geocoder.osm(address)
    logger.info('LatLng: %s', response.latlng)
  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/argentinaenpython.com.ar/web

case "$2" in
    up)
    logger -s "NM Script 'geoblog' triggered"
    /usr/bin/fades --python /usr/bin/python3 /home/humitos/Source/argentinaenpython.com.ar/web/geolocation.py --me & \
    exit 0
    logger -s "NM Script 'geoblog' finished"
    ;;
    *)
    ;;
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!