lunes, 12 de marzo de 2012

Provincias, municipios y códigos postales

Quería empezar este blog oficial de iFraktal Internet Marketing, S.L. con un caso práctico.

Estábamos diseñando la página web para un cliente consistente en una mini-tienda on-line, desde la cual se aceptan pedidos de un producto y pensamos que sería buena idea añadir una validación de códigos postales, municipios y provincias. Al tratarse de un nuevo negocio no había datos previos que importar, con lo partíamos de una base de datos en blanco y de esta forma podíamos evitar que la misma se llenase de información duplicada e inútil que nos hemos encontrado otras veces con nombres de municipio mal escritos. Un caso típico sería encontrarse municipios como "HOSPITALET", "L'HOSPITALET", "HOSPITALET DE LLOBREGAT", "L'HOSPITALET DE LLOBREGAT",... cuando la denominación oficial según el INE es "HOSPITALET DE LLOBREGAT, L'".

Así que nos pusimos a buscar en Internet una lista actualizada de poblaciones y códigos postales españoles. Debería ser fácil, ¿no? PUES NO.

Lo primero que encontramos fue una relación de provincias con sus códigos y la lista oficial de municipios actualizada a 1 de enero de 2012, ambos proporcionados por el INE (Instituto Nacional de Estadística). Hasta aquí fue fácil, pero había un problema: la lista de municipios incluía el código de la provincia, el código de municipio y hasta un dígito de control, pero no incluía el código postal del mismo.

Así que nos pusimos a buscar una relación de códigos postales y municipios. Siguiendo con el INE hay una sección de descargas del callejero, que prometía. Sin embargo una vez descargada la información consistía de 4 archivos de texto en formato ASCII con campos de ancho fijo conteniendo vías, pseudovías, tramos de vías y unidades poblacionales. Existe un archivo en formato Word que explica como se relaciona cada archivo. Tras revisar la documentación y echar un vistazo a los archivos decidimos seguir buscando. Procesar esos archivos iba a requerir demasiado esfuerzo.

Seguimos buscando y lo siguiente que encontramos es que no somos los primeros que nos ha ocurrido esto. En el blog de Carme Pla la autora explica que se encontró con la misma problemática que nosotros. Allí nos enteramos que Correos proporciona unas bases de datos de códigos postales a un precio totalmente desorbitado. El mismo blog nos dirige a una página llamada "Códigos Postales de España: Base de datos", que contiene datos de provincias, municipios poblaciones y calles con sus correspondientes códigos postales en hasta 3 formatos diferentes (CSV, XML y MySQL). Descargamos y probamos.

Los fichero tienen algún fallo y probablemente no estén complemente actualizados pero algo es algo. Tras cargar el archivo CSV en una tabla MySQL y procesar el contenido, hemos conseguido una tabla conteniendo la lista de municipios poblaciones y códigos postales, que era lo que queríamos. La información de las calles se ha eliminado pues en nuestro caso no tenía utilidad.

Y para que este trabajo pueda servir a otros, hemos decidido ofrecer de forma libre y gratuita un archivo de texto conteniendo las sentencias MySQL para crear la base de datos de provincias, municipios poblaciones y códigos postales. Se permite explícitamente usar y alterar los datos contenidos en ese archivo para cualesquier fin. No garantizamos que los datos sean correctos o estén actualizados.

Descargar codigos-postales-v1.0.zip (391 KB).


ACTUALIZACIÓN:

Se ha actualizado el archivo de códigos postales a la versión 1.1 debido a algunos pequeños fallos: Descargar codigos-postales-v1.1.zip.

También puede interesarte:

18 comentarios:

  1. Es tarde para nombrarte PAPA?
    Las dos tablas ya está relacionadas? o eso ya es cosa nuestra?

    ResponderEliminar
  2. Las tablas están relacionadas por el campo "cod_prov"... pero no tienen creadas reglas de integridad ni claves foráneas. Eso ya depende de vuestra implementación. Según el motor de base de datos que uséis podéis definir las clave foránea de la tabla "poblaciones".

    PD: ¿Quien quiere ser Papa? Yo es que llevo muy mal lo del celibato...

    ResponderEliminar
  3. muchas gracias, me has salvado el culo. Ya llevaba el mismo camino que vosotros, los mismos archivos, tooodo.

    Una cosa, ¿Lo tenéis sin mayúsculas en las poblaciones? Es que es un coñazo dar formato.

    ResponderEliminar
  4. Ante todo muchas gracias por compartir,

    Sin embargo, después de echarle un vistazo a las tablas que hay un problema de definición. Esto es un listado de localidades con sus códigos postales, pero no de los municipios, puesto que estos engloban a las localidades. Un municipio está compuesto por una o más localidades.

    Faltaría una tabla intermedia que relacione las localidades con los municipios y estos con las provincias.

    ResponderEliminar
  5. Correcto. Supongo que no me expresé bien cuando escribí el artículo. En España la unidad mínima de territorio es la localidad (o población, que es lo mismo). Las localidades se agrupan en municipios (términos municipales) y los municipios en provincias. Esta base de datos relaciona códigos postales con localidades y provincias. Los municipios no aparecen. Gracias por tu aportación.

    ResponderEliminar
  6. Muchas gracias, me será de mucha utilidad.

    ResponderEliminar
  7. Buenas, el código postal de Ponferrada creo que es incorrecto, tenéis el "24400" y debería ser "24403".

    Por lo demás genial vuestras tablas, muy útiles.

    Un saludo!

    ResponderEliminar
  8. Hola, muchas gracias por vuestro trabajo y más aún por compartirlo. Tengo un pequeño problema al importar el fichero .sql y es que con phpMyAdmin lo importa en codificacion "swedish" y no en utf, por lo que todos los caracteres españoles no aparecen. ¿Se os ocurre algo?

    ResponderEliminar
    Respuestas
    1. Me respondo por si a alguien le vale. El problema viene en la importación que no en la propia tabla ya que se puede modificar cualquier campo para poner esos caracteres (ñ, á, etc). Haciendo este update puedes actualizar los campos --> UPDATE `poblaciones`
      SET poblacion = REPLACE(poblacion,'&Ntilde','Ñ') WHERE 1

      Eliminar
  9. Gracias por el aporte. Al importar el SQL hay claves duplicadas. Hay registros que son exactamente iguales. ¿Cómo lo solucionamos?

    ResponderEliminar
  10. En la página http://codigos-postales.albin.es ya no aparece nada con lo que el fichero zip adjunto a esta entrada de blog viene genial. Gracias!

    ResponderEliminar
  11. fijo que en el INE, en el Catastro o donde sea hay UN TIO que tiene >>La Lista<< en un pendrive y no la deja tocar a nadie pa que no le metan mierda. jeje.
    gracias por compartir.

    ResponderEliminar
  12. Gracias, me sirve como punto de partida, ahora tengo que crear una relación con los municipios, puesto que en esta lista están las localidades o zonas, y el INE es por municipios, y quiero cruzar los datos para crear la relación entre INE y CP

    ResponderEliminar