El callejero del INE se puede obtener de la web  de este organismo http://www.ine.es/, en forma de un conjunto de ficheros comprimidos en formato zip (uno por provincia). Por ejemplo, el fichero call_p01_708.zip es el callejero correspondiente a Alava (código de provincia 01), con fecha Julio de 2008.

Una vez descomprimidos, vemos que cada uno de los ficheros zip contiene cuatro ficheros, que corresponden a la relación de unidades poblacionales, vias, pseudo-vias y tramos de la provincia. En el caso de Alava:

UPG080714P01 .- Relación de unidades poblacionales
VIASG080714P01 .- Relación de vias
PSEUG080714P01 .- Relación de pseudo vias
TRAMG080714P01 .- Relación de tramos.

El formato de los ficheros está descrito en el documento disenocallejero.doc que también se encuentra disponible en el servidor web del INE.

Para procesar estos documentos, empezamos por cargarlos en una base de datos. A continuación, con Power*Architect creamos el modelo de datos mediante ingeniería inversa, y obtenemos lo siguiente:

 

Lo primero que vemos es que todas las tablas tienen el campo CPRO (código de provincia) y CMUM (código de municipio), pero no hay una tabla de provincias ni una tabla de municipios, por lo que vamos a añadirlas, y a establecer las relaciones entre las tablas.

En los ficheros no aparecen los nombres de las provincias, por lo que tenemos que realizar a mano la carga de la tabla de provincias.

Por el contrario, el nombre del municipio aparece en tres campos: nmun, dmun50 y dmun25. Una rápida consulta a la base de datos nos permite ver que dmun50 es el único campo que siempre posee un valor, por lo que es el que vamos a utilizar para cargar la tabla de municipios. Los otros dos campos, así como el resto de columnas sin información, las eliminamos también. Una vez actualizado el modelo de datos, queda como sigue:

 

Como se ve, se ha incluido la tabla de municipios y se han definido los campos que constituyen la clave primaria de cada tabla. En el caso de la tabla ine_tramos, hay un cierto número de registros que tienen el valor cero tanto en el código de vía como en el código de pseudovía, por lo que los eliminamos.

Como se ve, no hay una jerarquía provincia->municipio->población->via->tramo, porque en ocasiones una misma vía puede atravesar varias poblaciones. Para evitar que el uso de la base de datos sea engorroso, vamos a incorporar el código de unidad poblacional (cun) a las tablas de vias y pseudovias, duplicando los registros existentes en dichas tablas, en los casos en los que una misma vía pertenezca a más de una población. De este modo,podemos añadir una relación entre la tabla ine_poblaciones y las tablas ine_vias e ine_pseudovias, utilizando la clave primaria (cpro,cmum,cun) de la tabla ine_poblaciones.

Una vez finalizada la preparación de la base de datos, se desarrollan algunas páginas JSP para poder navegar por el contenido de las tablas.

El resultado final se puede observar accediendo a la página de inicio: http://www.openalfa.com/callejero_ine/home.pl.

Las páginas desarrolladas son las siguientes:

/localizacion/home.jsp .- Presenta un listado de provincias. Cada provincia es un enlace al listado de municipios de dicha provincia
/localizacion/provincia.jsp.- Presenta un listado de municipios de la provincia. Cada nomre de municipio es un enlace al listado de poblaciones
/localizacion/municipio.jsp.- Presenta un listado de poblaciones del municipio. Cada nombre de poblacion es un enlace al listado de calles.
/localizacion/poblacion.jsp.- Presenta un listado de calles de la poblacion