Catálogo de países, estados y ciudades.

  • Por solio
  • Archivado en: Desarrollo
  • | jun 21,2014

Hace unas semanas me pidieron en el trabajo “unos combo box para que el usuario elija el país, estado y ciudad de su dirección particular cuando se registra en el sistema”. Mi primera idea fue buscar un catalogo con esos datos para colocarlo en la base de datos, y después de un rato, estando a punto de darme por vencido pues parece que esa información no la consigues gratis, encontré el sitio web GeoNames y su catalogo Free Postal Code Data, que contiene precisamente toda la información que buscaba y además tiene licencia Creative Commons así que la podemos usar sin problemas siempre y cuando le demos a GeoNames el crédito por publicar esos datos (Gracias).

La información se presenta de la siguiente manera:

Hay un archivo zip para cada país en el mundo (o al menos para la mayoría). El zip contiene un archivo readme y un archivo con los datos referentes a las distintas localidades de dicho país; justo lo que estamos buscando. El archivo está en formato utf-8 y delimitado por tabuladores con los siguientes campos:

  • Código ISO del país
  • Código Postal
  • Nombre del sitio
  • Nombre del estado
  • Nombre del estado (con una longitud menor)
  • Nombre de la provincia
  • Nombre de la provincia (con una longitud menor)
  • Nombre de la comunidad
  • Nombre de la comunidad (con una longitud menor)
  • Longitud
  • Latitud
  • Precisión

Ahora necesitamos transformar un poco esa presentación para poder usarla en una base de datos. Primero debemos diseñar nuestras tablas. Yo elegí el siguiente diseño. db-ciudades Es muy importante que sepan que todas las llaves primarias de las tablas son auto-incrementables. Para este ejemplo sólo usaré el archivo que corresponde a México. En primer logar debemos insertar los datos del país en la base de datos. Lo hacemos de la siguiente manera:

INSERT INTO PAISES (ISO_CODE, NOMBRE_PAIS) VALUES (‘MX’, ‘MEXICO’);

Para insertar los datos de los estados y ciudades hacemos uso de las herramientas incorporadas con linux para manipular archivos. Específicamente para los estados hice el siguiente script:

cat MX.txt | cut -f1,4 | sort | uniq | sed “s/\([A-Z]\{2\}\)\t\(.*\)/INSERT INTO ESTADOS (NOMBRE_ESTADO, ID_PAIS) SELECT ‘\2′, ID_PAIS FROM PAISES WHERE ISO_CODE = ‘\1′;/g” > CAT_ESTADOS.SQL

MX.txt es el archivo contenido en el zip con los datos de México, el script se debe usar cuando estemos en la carpeta en la que descomprimimos ese archivo, la salida es como la siguiente:

INSERT INTO ESTADOS (NOMBRE_ESTADO) SELECT ‘Aguascalientes’FROM PAISES WHERE ISO_CODE = ‘MX'; INSERT INTO ESTADOS (NOMBRE_ESTADO) SELECT ‘Baja California’FROM PAISES WHERE ISO_CODE = ‘MX'; INSERT INTO ESTADOS (NOMBRE_ESTADO) SELECT ‘Baja California Sur’FROM PAISES WHERE ISO_CODE = ‘MX';

Para insertar los datos de las ciudades hice el siguiente script:

cat MX.txt | cut -f1,3,4 | sort | uniq | sed “s/\([A-Z]\{2\}\)\t\([^\t]*\)\t\(.*\)/INSERT INTO CIUDADES (NOMBRE_CIUDAD, ID_PAIS, ID_ESTADO) SELECT ‘\2′, P.ID_PAIS, E.ID_ESTADO FROM ESTADO E JOIN PAIS P ON P.ID_PAIS = E.ID_PAIS WHERE E.NOMBRE_ESTADO=’\3′ AND P.ISO_CODE = ‘\1′;/g” > CAT_CIUDADES.SQL

la salida del script es como la siguiente:

INSERT INTO CIUDADES (NOMBRE_CIUDAD, ID_PAIS, ID_ESTADO) SELECT ‘Zurcua’, P.ID_PAIS, E.ID_ESTADO FROM ESTADO E JOIN PAIS P ON P.ID_PAIS = E.ID_PAIS WHERE E.NOMBRE_ESTADO=’Guerrero’ AND P.ISO_CODE = ‘MX'; INSERT INTO CIUDADES (NOMBRE_CIUDAD, ID_PAIS, ID_ESTADO) SELECT ‘Zuri’, P.ID_PAIS, E.ID_ESTADO FROM ESTADO E JOIN PAIS P ON P.ID_PAIS = E.ID_PAIS WHERE E.NOMBRE_ESTADO=’Chihuahua’ AND P.ISO_CODE = ‘MX'; INSERT INTO CIUDADES (NOMBRE_CIUDAD, ID_PAIS, ID_ESTADO) SELECT ‘Zurita’, P.ID_PAIS, E.ID_ESTADO FROM ESTADO E JOIN PAIS P ON P.ID_PAIS = E.ID_PAIS WHERE E.NOMBRE_ESTADO=’Veracruz Llave’ AND P.ISO_CODE = ‘MX'; INSERT INTO CIUDADES (NOMBRE_CIUDAD, ID_PAIS, ID_ESTADO) SELECT ‘Zurumbeneo’, P.ID_PAIS, E.ID_ESTADO FROM ESTADO E JOIN PAIS P ON P.ID_PAIS = E.ID_PAIS WHERE E.NOMBRE_ESTADO=’Michoacan De Ocampo’ AND P.ISO_CODE = ‘MX';

Listo, con los archivos CAT_ESTADOS.SQL Y CAT_CIUDADES.SQL podemos poblar nuestra base de datos que contendrá todos los municipios y estados de México. El mismo proceso se puede repetir para todos los países que se requiera o incluso hay un archivo que contiene la información de todos los países, les dejo a ustedes la aplicación de estas ideas para generar sus catálogos. Espero que este post les ayude. Saludos!