Experimentos geoip

Buscando información entorno a geolocalización me he encontrado este sitio web http://dev.maxmind.com/geoip/ donde puedes descargarte bases de datos con geolocalización ip. El sitio ofrece ese tipo de servicios y más cosas.

Se me ocurrió ver que pasaba si trasladaba esas coordenadas a un mapa, para ello he creado un pequeño script y dos imágenes, una imagen es un gif transparente y la otra está echa a mano con The Gimp, en base a los resultados que obtuve tras ejecutar el script, que como es lógico marca un gran número de localizaciones costeras. Para que funcione el script hay que tener instaladas las librerias python-tk (Tkinter) y python-unicodecsv además es necesario descargarse la base de datos en formato csv de esta url, en la misma carpeta donde tengamos el script, junto con las imágenes o al menos una de ellas. http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

Las imágenes, la primera es un gif transparente:

worldmapblank

worldmap

Podeis cambiar el script en esta línea (32) y verlo directamente sobre el mapa: worldmap = PhotoImage(file=”worldmapblank.gif”) worldmap = PhotoImage(file=”worldmap.gif”)

El script:

#tk geoip demo for https://elbinario.net
#programer foobar
#This scripts generates a world map based on geoipdatabases.
#You change the image to a 'worlmap.gif' image

from Tkinter import *
import csv
import math


#512*2=1024 & 960*2=1920
def devolvercoords(coord1, coord2):
    coord1 = float(coord1)
    coord2 = float(coord2)
    a, b, c, d = 512, 960, 1.5 * math.pi, 1.5 * math.pi
    if coord1 > 0 and coord2 > 0:
        latitude = a - (coord1 * d)
        longitude = b + (coord2 * c)
    elif coord1 > 0 and coord2 < 0:
        latitude = a - (coord1 * d)
        longitude = b - (coord2 * -d)
    elif coord1 < 0 and coord2 < 0:
        latitude = a + (coord1 * -d)
        longitude = b - (coord2 * -c)
    elif coord1  0:
        latitude = a + (coord1 * -d)
        longitude = b + (coord2 * c)
    return int(longitude), int(latitude)

self = Tk()
canvas = Canvas(self, width=1920, height=1024)
worldmap = PhotoImage(file="worldmapblank.gif")
image = canvas.create_image(0, 0, anchor=NW, image=worldmap)
canvas.pack()
canvas.update()
while True:
    with open('GeoLite2-City-Blocks.csv', 'rb') as csvfile:
            spamreader = csv.reader(csvfile, delimiter=',', quotechar='"')
            for row in spamreader:
                try:
                    latitude = row[6]
                    longitude = row[7]
                    latitude, longitude = devolvercoords(latitude, longitude)
                    newcoords = 1, 1, 3, 3
                    newsite = canvas.create_oval(newcoords, fill="green")
                    canvas.move(newsite, latitude, longitude)
                    canvas.update()
                except:
                    continue


Una pequeña demo:

https://i.imgur.com/pfg8ueX.png pfg8ueX

En este caso ha generado mi propio csv a través de los servicios de freegeoip.net con y los logs del firewall, claro que abriendo una DMZ, cosa no muy recomendable.

Compartir

6 Comentarios

  1. No me he mirado todo el código, pero espero que hayaís tenido en cuenta la geometría riemanniana sobre la superficie de una esfera. En el caso de la definición de paralelos y meridianos, aunque los meridianos son geodésicas propiamente dichas, los paralelos tienen una caracteristica imposible, y es que estos nunca se cruzan. De todas formas, me leeré el código y veré si hay alguna buena forma de localizarlo en el mapa teniendo en cuenta que el quinto postulado es falso en esta geometría.

    Saludos !

  2. Por cierto, y espero que no te lo tomes a mal y te sirva para mejorar tu código, a pesar de que en python es dificil hacer código no limpio, creo que lo estás consiguiendo. Los nombres de las variables deben de ser más descriptivos, y nombres de una sola letra como a, b, c y d quedan reservados para esos fans de C como yo que hacen bucles for expresados en una sola línea. Para el resto de variables, han de ser nombres entendibles.

    Además, es una mala práctica usar números mágicos. Ese 512 de donde viene ? Para qué sirve ?. Deberías poner una definicio de ese valor con un nombre que lo describa.

    Y para terminar, y esto es algo que se dice desde los años 70 con el querido lenguaje C y su co-creador kernighan, “No comente código incorrecto. ! Reescríbalo !”. Tu pones comentarios como 512 * 2 = 1024, cuando el código debería de ser expresivo en si mismo.

    Repito, tomatelo como una crítica constructiva, yo por ejemplo he sido humilde y ultimamente he estado mirando documentación sobre buenas prácticas de programación, que por muy bueno que seas siempre puedes mejorar un poco.

    Y como crítica positiva, comentar que me parece bien que uses las librerías tkinter. Yo nunca he hecho programación gráfica con python, pero parece que tkinter se está volviendo una alternativa simple y elegante a gtk y a qt.

    Saludos !

  3. Por cierto, me voy a instalar python-tk, me voy a bajar un manual de tkinter y voy a intertar hacerle algunas mejoras al código, después te las mandaré.

    Por cierto, si quieres unifica y resume los 3 comentarios que llevo hechos en 1 sólo

    Saludos !

  4. Gracias desikoder, te respondo por partes:
    1 – Sobre Rieman, bueno he usado pi (import math) :D
    2 – Sobre 512, intente pasar como variables el withd y el height de la imagen al constructor de canvas y la cosa se torció. Si puedes fixerarlo genial y estoy de acuerdo contigo sobre los nombres de la variables, pero es un código demo, no pretende ser la api de google.
    3 – Eres un poco impulsivo, pues en tu último comentario afirmas que ni siquiera corriste el programa. Dale pruébalo, conéctalo a otro script, etc, estaré encantado de verlo :D
    Por último recomendarte pygame, que está basado en tktinker.
    Un saludo fierecilla.

Deja una respuesta

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax