¿Por qué no lo hemos visto hasta ahora? Primer mapa de zonificación escolar en Bilbao

Ahora que todavía está el plazo abierto de elección de centro escolar en Euskadi, es bueno momento para rescatar estas visualizaciones que hicimos en verano. Un ejemplo más de la necesidad de abrir datos abiertos.

Por increíble que parezca no existe un mapa de cómo se dibujan los contornos que sirven para asignar puntos para acceder a cada centro escolar en Euskadi. Hay una descripción en pdf de qué secciones censales y distritos corresponten a cada centro, hay una aplicación para calcular los puntos en base a una dirección, pero no existe el mapa.

Hemos analizado el sistema de zonas que tiene asignado cada centro para otorgar los puntos por cercanía a la hora de adjudicar las plazas escolares. Hemos dibujado dos zonas por cada centro: una que asigna 5 puntos (naranja fuerte) y otra que asigna 2 puntos (naranja claro). En blanco las zonas que no dan puntos. .

Puedes ver la documentación en la wiki de Bilbao Data Lab o en este repositorio para documentar y guardar el códgo en R y los datos transformados.

Leyenda de los gráficos

Zonas escolares de asignación de puntos por centro escolar:

¿Cómo lo hemos hecho?

Partiendo del PDF que lista los centros escolares y la zonas a las que pertenecen para asignar los puntos vamos a generar dos archivos de datos (ver carpeta /data):

  • Un archivo de contornos con el dibujo de las zonas. Descarga geojson (archivo en proyección EPSG3042).
  • Una tabla con tres columnas: zona, centro escolar y puntos asignados. Descarga csv.

Luego con un script de R (ver script) se importan los contornos de las zonas, el listado que relaciona las zonas con los centros escolares y se dibuja un mapa por cada centro escolar (ver /images).

1. Crear contornos de zonas

Para poder representar las zoans primero necesitamos dibujarlas. Cada zona está definida en el PDF por los distritos, secciones censales o calles que la componen. La cosa se complica porque a veces se definen por negación. por ejemplo, la zona 430601-ABANDO está compuesta por el distrito 6 de Bilbao (Bilbao-D06) pero no por la sección censal 15 de ese distrito “(Salbu/Excepto)Bilbao-D06-S015”.

Hemos realizado este proceso con Qgis uniendo y restando distritos, secciones censales. Para añadir y restar las calles que se indican en algunas zonas, se han creado polígonos aproximados que recogen las calles indicadas. En la defición de los polígonos asociados a calles se podría afinar más de lo que lo hemos hecho, lo dejamos como tarea pendiente.

2. Crear relación de centros y zonas escolares

Creamos una tabla basada en los datos de la zonifiación del PDF. Cada línea corresponde con un arelación entre las zonas creadas del paso anterior con un centro escolar.

zona centro escolar puntos (o baremo)
430101-SAN INAZIO – IBARREKOLANDA 014509 – CEIP Intxixu Ikastola HLHI max
430101-SAN INAZIO – IBARREKOLANDA 014924 – CEIP San Inazio-San Ignacio HLHI max
430102-SAN PEDRO – DEUSTUIBARRA 014509 – CEIP Intxixu Ikastola HLHI min
430102-SAN PEDRO – DEUSTUIBARRA 014924 – CEIP San Inazio-San Ignacio HLHI min

3. Script de R para dibujar zonas

En el script se puede ver al completo cómo se producen los PNG con un mapa de la zonificación para cada. Mostramos aquí a modo de resumen cómo se dibuja un mapa:

# Instala y carga librerías
library(tidyverse)
library(ggmap)
library(rgdal)
library(gsubfn)

# Carga contornos de zonas escolares
zonas <- readOGR("data/zonificacion-escolar-bilbao.geojson")
# Carga relación de centros escolares y zonas
centros_zonas <- read.delim("data/centros-zonas.csv",sep = ",")

# Se selecciona un centro escolar
centro_select <- "015360 - CEIP Miribilla HLHI"
# Se elimina el código numérico del nombre
centro_select_name <- toupper((strapplyc( centro_select, "[0-9]* - (.*)", simplify = TRUE)))

# Se dibuja el mapa
ggplot() +
  # rellena regiones con valor max
  geom_polygon(data = zonas[zonas@data$SEC_PROV_D %in% centros_zonas[centros_zonas$centro == centro_select & centros_zonas$puntos == "max","zona"], ], aes(x=long, y=lat,group=group), fill="orange",alpha=0.8,size = 0.1) +
  # rellena regiones con valor min
  geom_polygon(data = zonas[zonas@data$SEC_PROV_D %in% centros_zonas[centros_zonas$centro == centro_select & centros_zonas$puntos == "min","zona"], ], aes(x=long, y=lat,group=group), fill="orange", alpha=0.3,size = 0.1) +
  # dibuja contornos de todas las zonas
  geom_path(data=zonas,aes(x=long, y=lat,group=group), colour="black",size = 0.1)

El resultado, añadiendo los contornos de los distritos, la ría y los puntos para cada centro, quedaría así:

El script utiliza un “loop” con un “for” para generar automazidamente todos los mapas.

Existe la opción de añadir de fondo una base cartográfica, que se hace con la librería OpenStreetMap de R usando map ← openmap(c(lat = 43.26596 + 0.027, lon = -2.93141 - 0.09), c(lat = 43.26596 - 0.065, lon = -2.93141 + 0.055), type = “osm”) donde osm indica la base cartográfica elegida.

Una vez generadas todas las imágenes podemos hacer un “small multiple” con todos los mapas.

Usaremos el comanto »montage» de imagemagick para hacer el mosaico: montage 0* -geometry 450×450+0+0 montage_geom.png (imágenes reducidas a 450px con separación de 0 píxeles.

Otra forma es verlo en un gif animado:

Cartografía