El INE pone a disposición de quien quiera una relación de municipios y códigos por provincia, que se puede descargar en varios formatos. Uno muy interesante es un fichero excel que contiene todos los municipios de España con sus códigos. Es interesante porque importando este fichero podremos trabajar con municipios a nivel de código INE, cosa que está muy bien si queremos después integrarlo con cualquier otra aplicación que tire de temas de administración pública.

¿Y cómo podemos leer este excel de una manera fácil? La solución que he encontrado yo es la de usar Groovy con la librería jExcelAPI.

En el ejemplo que vamos a ver, hacemos uso de la librería jExcelAPI y de Groovy para convertir el fichero de municipios del INE al formato JSON. ¿Por qué a JSON? ¿Y por qué no? Así vemos jExcelAPI y JsonBuilder a la vez, y matamos dos pájaros de un tiro.

La verdad es que para leer excel es una librería bastante fácil de trabajar que sólo me ha dado un par problemas con el encoding. Espero pronto poner algún ejemplo de escritura de ficheros con esta librería, a ver si es igual de cómoda.

En el siguiente código, vamos a ver:

  • Cómo abrir el fichero excel directamente de internet
  • Cómo obtener el número de filas e iterar sobre ellas
  • Para cada fila, extraer el contenido de las celdas para crear una entrada de nuestro objeto json con los datos que nos interesan (código de provincia, código de municipio y nombre)
@Grapes(
    @Grab(group='net.sourceforge.jexcelapi', module='jxl', version='2.6.12')
)

import jxl.*
import groovy.json.*

def wbSettings = new WorkbookSettings();
wbSettings.setEncoding("ISO-8859-1");

def codmun = Workbook.getWorkbook("http://www.ine.es/daco/daco42/codmun/codmun11/11codmun.xls".toURL().openStream(), wbSettings)
def sheet = codmun.getSheet 0
def json = new JsonBuilder()

json.municipios{
       for(i in 2..           def fila = sheet.getRow i

           "${fila[0].contents}${fila[1].contents}" { //Con esta combinación le damos a la entrada un nombre único de 5 caracteres
               provincia fila[0].contents
               municipio fila[1].contents
               nombre fila[3].contents
          }
       }
}

def prettyJson = JsonOutput.prettyPrint(json.toString())
println prettyJson

Así, ahora nos sería muy fácil realizar una búsqueda de todos los municipios de la provincia de Alicante (cuyo código INE es 03)

import groovy.json.*

def json2 = new JsonSlurper().parseText(json.toString())

def alicantinos = json2.municipios.findAll{
    it.value.provincia == '03'
}

println alicantinos

Referencias:

Anuncios