lunes, 22 de marzo de 2010

Jugando con MongoDB y Python

Bien, siguiendo el post anterior, vamos a cargar de GeoNames todos los datos sobre España en una base de datos MongoDB. Aqui no se va a explicar como instalar un servidor de Mongo. Se pueden encontrar todas las indicaciones en su pagina web oficial si no sabes que es Mongo, visita esta página. No es nada complicado. Bien, al lío.

Primero tenemos que ir a GeoNames ir a la parte de "descargas" y bajarnos algún país. En mi caso me he descargado ES.txt, documento que contiene todos los todos sobre España. Descomprimido, el fichero pesa unos 6.8MiB. Bien, ahora tenemos que "meterlo" en la base de datos. Lo podemos hacer así:


#! /usr/bin/env python
# -*- coding: utf-8 -*-
#Filename: buscar.py
#Filename: cargar_datos.py
from pymongo.connection import Connection
#Abrimos una conexión con la BBDD de mongo y creamos una colección llamada ES.
connection = Connection()
db = connection.ES
collection = db.ES
#Estos son los campos que contiene el fichero
fields = [
"geonameid",
"name",
"asciiname",
"alternatenames",
"latitude",
"longitude",
"feature_class",
"feature_code",
"country_code",
"cc2",
"admin1_code",
"admin2_code",
"admin3_code",
"admin4_code",
"population",
"elevation",
"gtopo30",
"timezone",
"modification_date"
]

#Abrimos el fichero de datos
file = open('ES.txt', 'r')
#Insertamos todos los datos en la BBDD. Simple y llanamente.
for data in file:
collection.insert(dict(zip(fields, data.split('\t'))))
print 'Done! =)'
#Cerramos el fichero y la conexión.
file.close()
connection.disconnect()

Bien, señores. Ahora solo queda ejecutar el comando con un simple "python cargar_datos.py". En mi ordenador, el proceso tarda unos 25 segundos, aproximadamente. Carga 58.317 registros ( llamados documentos, en la jerga de Mongo ).
Y ya tenemos todos los datos en la BBDD!!

Pero claro, ahora con todos estos datos que hacemos? Pues vamos a crear un pequeño codigo para hacer consultas:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import pymongo

import re
import sys
#Nos conectamos a la BBDD, a la colección ES
db = pymongo.Connection().ES
collection = db.ES

#Cogemos el primer argumentos que nos han pasado como parámetro
busca = sys.argv[1]
#Compilamos una expresión regular para la búsqueda
regex = re.compile(busca)
#Buscamos en la base de datos la expresión regular en el campo "alternatenames". Los resultados los guardamos en una lista.
resultados = [ n for n in collection.find({"alternatenames":regex})]
#Por cada elemento de la lista pintamos los siguientes datos.
for tupla in resultados:
print ">Nombre:",tupla["name"]
print "Nombres comunes:",tupla["alternatenames"]
print "Coordenadas [Longitud][Latitud]:", tupla["latitude"], tupla["longitude"]
print "Link:", "http://maps.google.com/?ie=UTF8&ll=" + str(tupla["latitude"]) + "," + str(tupla["longitude"]) + "&spn=0.047113,0.109863&t=h&z=12"
print "Resultados encontrados:", len(resultados)
print ""


Como funciona el programa? Muy simple:
$ python buscar.py Pollença
Y esto nos va a dar los resultados. Si usamos una terminal Bash, podemos hacer clic con Control pulsado sobre el link y automáticamente se abrirá en Google Maps el la posición exacta del lugar buscado. Espero que se haya entendido algo =). No dejen de postear sus dudas/mejoras. Gracias!

4 comentarios:

  1. Inedit00, esto tiene algún interfaz gráfico o solo es por terminal..

    ResponderEliminar
  2. Es un programa que solo se puede utilizar con una terminal, al mas puro estilo Linux ;)

    Esto tan solo es un ejemplo para que se vea como hacer consultas a la BBDD de Mongo (utilizando datos de GeoNames para hacer la práctica un poquito más interesante). Si tienes mas dudas, avisa!

    ResponderEliminar
  3. Es posible utilizar geocodificacion inversa ??? tienes alguna informacion de como poder hacer esto o donde visitar algun link, muchas gracias !!!!!!

    ResponderEliminar
  4. Me temo que no, @haroldjulian. No se que es "geocodificación inversa". Lo que igual pueda interesarte es la indexación geoespacial ( no se si te refieres a esto ): Check this out:
    http://www.mongodb.org/display/DOCS/Geospatial+Indexing

    Si encuentras información sobre esto de la "geocodificación", deja un comentario con un link, por favor. Y así me entero de que va el tema. Gracias!

    ResponderEliminar