En este taller se describe el proceso de creación de diversos mapas electorales con CartoDB, enfocado sobre todo al tratamient o de los datos y las reglas de simbolización cartográfica.
http://bit.ly/cdb-elecciones-151203
Contacto:
- Miquel Nieto - [email protected]
- Jorge Sanz - [email protected]
Los datos que se van a utilizar son de dos tipos:
-
Datos geográficos obtenidos del centro de descargas del CNIG. Estos datos ya se encuentran disponibles en el Data Library de CartoDB en dos variantes: dataset original y dataset con las Islas Canarias desplazadas para su representación en mapas estadísticos.
-
Datos alfanuméricos de las elecciones al Congreso de 2008 y 2011 descargados del portal de información electoral del Ministerio de Interior. Estos datos se obtienen en formato Excel y se han simplificado a ficheros CSV con nombres de partido adecuados para servir como columnas del dataset de CartoDB. También se han tratado para asegurar que no se genera un CSV con valores de texto en las columnas de datos numéricos.
NOTA El centro de descargas del CNIG además de las líneas límite de municipios, provincias y comunidades autónomas proporciona algunos datasets más con licencia de uso abierta y otros con licencias que permiten uso no comercial. De igual manera, es posible cargar servicios WMS publicados en la IDEE como mapas base en CartoDB donde cabe destacar la otrofotografía del PNOA pero hay muchas otras capas interesantes.
- Cargar CSVs de resultados de elecciones 2008 y 2001
- Crear campo de identificación
UPDATE jsanz.mun_electoral_2011 SET code = mun + prov*1000;
UPDATE jsanz.mun_electoral_2008 SET code = mun + prov*1000;
- Importar del data library
ign_spanish_adm3_municipalities_displaced_canary
No es necesario en los datasets que hemos importado pero si tienes curiosidad o quieres tener las Canarias cerca de la Ponínsula en tus propios datasets debes ejecutar una instrucción como esta:
UPDATE tabla
SET the_geom = ST_Translate(the_geom,5.0,7.4)
WHERE
ST_Intersects(
the_geom,
ST_MakeEnvelope(-18.748169,27.571591,-13.342896,29.463514,4326)
)
NOTA: Atención porque esto desplaza las geometrías de forma definitiva, haz siempre una copia de tus datos para mantener el dataset original.
El primer paso es crear un mapa base sobre el que trabajar, la capa inferior solo se mostrará en el mapa proporcional de puntos pero es bueno tenerla a mano y reutilizarla cuando sea conveniente.
- Un mapa nuevo
- Desactivar el mapa base y utilizar un color plano
- Cargar capa de municipios y cambiar la SQL
SELECT
cartodb_id,
natcode::bigint % 100000 as code,
nameunit as name,
the_geom_webmercator
FROM ign_spanish_adm3_municipalities_displaced_canary
- Cargar la capa de provincias encima
- Utilizamos un CartoCSS que permita ver los municpios a partir de cierto nivel de zoom
En el taller vamos a ver capas en España, que se ve bien en la proyección cartográfica utilizada por defecto en CartoDB con el pequeño truco de desplazar las Canarias. Cuando visualizamos áreas más grandes y especialmente para mapas como los electorales donde el área ocupada por cada polígono interesa que sea lo más fiel posible. La proyección de Mercator no mantiene bien las áreas conforme nos alejamos al norte por lo que para mapas electorales de ámbito europeo es interesante cambiar a una proyección cartográfica diferente.
El proceso mínimo sería algo como esto:
- Importamos la capa
ne_adm0_europe
desde esta tabla en CartoDB - Creamos un mapa nuevo añadiendo dos veces la capa, una con todos los países y otra filtrando solo los que forman la Unión Europea
SELECT
cartodb_id,
admin,
adm0_a3,
the_geom_webmercator
FROM jsanz.ne_adm0_europe
WHERE eu_union
- Vamos a usar una proyección cartográfica que mantiene las áreas. La proyección Lambert Azimutal Equal Area es adecuada para información estadística que cubre el continente. Más información aquí.
- El truco consiste en aplicar la función
ST_Transform
para convertir el campothe_geom_webmercator
, quedando la consulta SQL así:
SELECT
cartodb_id,
admin,
adm0_a3,
ST_Transform(the_geom_webmercator,3035)
AS the_geom_webmercator
FROM jsanz.ne_adm0_europe
WHERE eu_union
Obviamente en los mapas en los que cambiamos la proyección cartográfica tenemos que desactivar el mapa base y utilizar un color plano.
- Una mejora de esto es crear una tabla completa nueva con las geometrías transformadas.
El primer mapa electoral va a ser el mapa de la proporción de voto de un único partido político.
- Hacemos copia de nuestro mapa base
- Volvemos a importar la capa de municipios y la dejamos entre las otras dos
- Ahora tenemos que traer los datos de las municipales de 2001, para ello usamos un
JOIN
- Para mostrar un porcentaje dividimos el número de votos por el total de votos válidos
La simbología la podemos procesar directamente con el wizard, vigilando el método de cuantificación que queremos aplicar y atenuando el borde para reducir su presencia visual.
El siguiente mapa muestra la diferencia de voto del PP frente al PSOE. La idea es generar un mapa de coropletas por municipio con una gradación en favor de uno u otro partido.
La consulta es una evolución de la anterior y además de los campos habituales se generan dos campos nuevos:
- Un campo de texto con una sentencia
CASE
en función del partido que más votos tiene. - Un campo que obtiene el valor absoluto del porcentaje de voto de un partido respecto a otro.
Para la simbología podemos aprovechar las funciones de color y los selecctores por atributo, discriminando en función del ganador y estableciendo como límites de la rampa de tres colores los límites del 20 y 30 por cien. Al utulizar variables de color podemos reusar el color para calcular automáticamente los colores de la gradación usando la función lighten
para aclarar el color en los cortes inferiores.
En lugar de pintar todo el territorio vamos a usar símbolos puntuales que tendrán un radio proporcional a la diferencia en votos. Para que sea proporcional usaremos una variación de esta fórmula a la que le sumaremos un tamaño mínimo.
La consulta es grande pero sencilla:
- Primero calculamos la máxima diferencia entre nuestros valores en porcentaje
- A continuación realizamos una consulta parecida a la del mapa anterior pero devolviendo solo el centroide
- Finalmente combinamos las dos anteriores aplicando la fórmula para obtener un campo
symbol_size
Una vez obtenidos los datos el CartoCSS es relativamente sencillo ya que aplicamos el tamaño calculado. Para evitar que el mapa salga muy cargado en zooms bajos dividimos este valor por diferentes factores
Para obtener el partido más votado duplicamos el primer mapa que hicimos del PP y cambiaremos la consulta SQL por la siguiente: De nuevo una consulta larga pero sencilla:
- La primera subconsulta obtiene la tabla
mun_electoral_2011
y además obtiene el mayor valor para los partidos principales. - La siguiente consulta utiliza una estructura
CASE
para crear un campo nuevo con el nombre del partido más votado - Finalmente la última consulta une esta última con la tabla con las geometrías para poder renderizarla
La simbología es un simple, una selección por atributo usando los colores representativos de cada partido. Igualmente se procesa la leyenda para presentar estos colores.
Siguiendo el mapa que acabamos de hacer podemos cargar también los datos de 2008 y compararlos.
En este caso la consulta es casi igual que la anterior solo que se duplican las subconsultas para obtener los ganadores y en la consulta final se hace un CASE
para compararlos y en caso de que no sean iguales indicar el ganador y así aplicar la misma leyenda que en el mapa anterior.
Estos mapas que hemos visto sirven como punto de partida para el diseño de los mapas que vamos a publicar. En general se hacen varias operaciones que involucran un tratamiento dinámico de los datos. Dado que los datos no van a cambiar, o lo van a hacer de forma controlada y periódica, es conveniente precalcular los datasets para que CartoDB pueda renderizar de forma eficiente toda la información.
Para mapa estáticos como los que se generan una vez los datos electorales han sido escrutados por completo, lo más directo es utilizar la opción del menú del editor Dataset from Query, ya que genera un juego de datos de forma immediata y listo para usar en CartoDB.
Para mapas dinámicos la actualización de estos juegos de datos involucraría la creación de vistas materializadas y el disparo del refresco de las mismas dentro del proceso de actualización de las tablas con los datos electorales. Consulta con nosotros si es este tu caso ya que queda fuera del ámbito de este taller.
Los datasets del CNIG son de muy alta precisión. En general para mapas electorales no vamos a necesitar este nivel de detalle y por tanto podemos hacer que los mapas sean más rápidos generando un dataset derivado que sea una simplificación de éstos.
Generar una adecuada simplificación de una capa de polígonos no es una tarea sencilla ni inmediata y conlleva un trabajo en off line adecuado para que las geometrías que se muestren en nuestros mapas sean continuas y representen lo mejor posible la realidad.
Por otro lado existe el problema de que el juego de datos tiene que tener una calidad alfanumérica adecuada especialmente en dos campos:
-
Un campo identificador adecuado basado en los códigos del INE para asegurar una correcta vinculación con los datos electorales.
-
Un campo con el nombre oficial para cada límite administrativo para asegurar su correcta identificación.
Una vez hemos generado nuestros mapas, depende de nuestro proyecto podemos incrustarlos directamente en nuestro sitio web o bien tenemos la posibilidad de hacer un pequeño desarrollo con CartoDB.js que integre diferentes mapas en una única página web.
En los siguientes enlaces os dejamos una plantilla que podéis reutilizar fácilmente para publicar vuestros mapas. El código JavaScript es muy sencillo y solo hay que cambiar las url de los viz.json en el fichero app.js
, así como las etiquetas en el index.html
para publicar vuestros.
Esta consulta muestra cómo usar la función de CartoDB CDB_Quantiles
para calcular los niveles de corte para una variable a utilizar en CartoCSS. Estas funciones normalmente las realiza el editor por nosotros. Más sobre las funciones estadísticas de CartoDB aquí.
WITH data AS (
SELECT
(10e6 * e.pob / ST_Area(m.the_geom::geography))::int AS densidad
FROM
ign_spanish_adm3_municipalities_displaced_canary m
JOIN
mun_electoral_2011 e
ON
m.natcode::bigint % 100000 = e.code
)
SELECT
CDB_QuantileBins(ARRAY_AGG(densidad), 3)
FROM
data
- Usando otras proyecciones en CartoDB, artículo en nuestro blog por Mamata Akella
- Calculando líneas de vuelo (geodésicas), artículo en nuestro blog por Paul Ramsey
- Formatear números y fechas en Postgres con to_char
- Pon los mapas más populares en CartoDB en tu navegador Chrome con la extensión TrendMap
http://bit.ly/cdb-elecciones-151203
Contacto:
- Miquel Nieto - [email protected]
- Jorge Sanz - [email protected]