Para el que no la conozca geonames es una de las bases de datos geográficas (con topónimos principalmente) libres más grandes. ¿Qué quiere decir esto? Que puedes descargarte los datos y hacer con ellos lo que te dé la gana. A parte de eso, hacen negocio ofreciendo un API para consultar la base de datos.

Para la mayoría de los casos el API de Geonames es más que suficiente, pero si queremos hacer consultas a ‘cascoporro’ quizás conviene descargarnos el dump de geonames y saber cómo importarlo en PostGIS. El workflow es bastante sencillo

Lo primero es descargar el dump de geonames. Yo voy a usar el dump de ciudades que tienen.
 

Workflow para importar un dump de ciudades de geonames en PostGIS

 
La carga en PostGIS se puede hacer muy fácil desde un terminal utilizando el comando psql. Lo primero es conectar con la base de datos:
 
psql -U postgres -h localhost -p 5432
 
A continuación, crear una nueva base de datos PostGIS
 
psql -U postgres -h localhost -p 5432 -c “CREATE DATABASE geonames WITH TEMPLATE = template_postgis ENCODING = ‘UTF8’;”

 
Conectamos con la nueva base de datos
 
psql -U postgres -h localhost -p 5432 geonames
 
Importamos el dump de ciudades, con el comando copy de PostgreSQL
 
copy cities (id,nombre1,nombre2,nombre3,lat,lon,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13) from ‘/tmp/cities1000.txt’ null as ”;

 
Creamos la columna the_geom a partir de los campos latitud y longitud
 
SELECT AddGeometryColumn (‘public’,’cities’,’the_geom’,4326,’POINT’,2);
UPDATE cities SET the_geom = ST_PointFromText(‘POINT(‘ || longitude || ‘ ‘ || latitude || ‘)’, 4326);

 
Y por último, creamos el índice espacial y un cluster.
 
CREATE INDEX idx_cities ON cities USING gist(the_geom);
CLUSTER idx_cities ON cities;

 
Ahora ya tenemos una tabla con el dump de ciudades de geonames. El proceso es exactamente igual para el resto de categorías que ofrece geonames. Fácil 🙂