Por Jaime Nieves y Juanjo Pérez
El mayor castigo para las personas que no se interesan por la política
es ser gobernados por personas que sí se interesan.
Arnold J. Toynbee
Si has pasado los últimos meses encerrado en una cabaña, huyendo de la democracia, es posible que no te hayas dado cuenta de que España ha pasado por unos cuantos procesos electorales últimamente. Hace algunas semanas tuvimos elecciones generales (al Congreso y al Senado), junto con algunas autonómicas. Y hace sólo unos días vivimos unas elecciones municipales y aún más autonómicas, que además coincidieron con las elecciones al Parlamento Europeo.
En Esri pensamos que era buen momento para publicar algunos datos electorales en nuestro Living Atlas, que como sabréis es el catálogo de contenido geográfico que mantenemos para ayudar a nuestros usuarios a encontrar rápidamente el dato necesario para ofrecer contexto o complementar un análisis. Publicamos todas las elecciones al Congreso (desde 1.977) y todas las Municipales (desde 1.987). También publicamos algunas de las últimas Autonómicas. Todos estos datos han quedado publicados como capas en el Living Atlas, y podréis acceder a ellos desde ArcGIS Online y cualquiera de las apps de ArcGIS, como ArcGIS Pro, Business Analyst o Insights.
Puedes encontrar todos los datos electorales en el Living Atlas de ArcGIS.
Nuestro objetivo en Esri no es hacer política, no obstante. Ni siquiera hablar de ella. Pero sucede que los datos electorales son un ejemplo interesante para hablar de mapas y de tecnología, y esto es lo que vamos a hacer en este artículo. Por cierto, si quieres saber algo más sobre la forma en que estos datos pueden usarse en ArcGIS, no olvides echar un ojo a este Webinar.
Cuando empezamos a trabajar con los datos electorales con la idea de publicarlos como feature services en ArcGIS, tomamos algunas decisiones importantes. Acertadas o no, fueron las siguientes:
Así quedó la tabla para las elecciones municipales de 2.015 (he ocultado algunas columnas por claridad).
Por lo demás, preferimos dejar los datos tan en bruto como fuera posible. Como decíamos, nuestro trabajo en Esri no es interesarnos por la política, sino ayudar a otros profesionales a que pudieran encontrar fácilmente estos datos en ArcGIS para emplearlos en sus propios análisis. Las decisiones que tomamos planteaban algún desafío a la hora de representar mapas, no obstante.
En el caso más común, en el que cada partido tiene su columna donde figuran los votos para cada municipio, ¿cómo podríamos representar un mapa con el color del partido más votado (sin tener que calcular campos nuevos)? Y en el caso de las últimas elecciones municipales, donde represento los partidos votados en columnas ordenadas de mayor a menor representación, ¿cómo dibujar un mapa que muestre los resultados para un partido concreto?
La respuesta estas dos preguntas es Arcade. Arcade es un lenguaje de expresiones diseñado específicamente para permitir un control muy avanzado de las opciones de simbolización y etiquetado de mapas. Si quieres profundizar en este lenguaje, puedes hacerlo desde la web de ArcGIS para Developers, e incluso tienes lecciones guiadas. También puedes echar un ojo a este post de nuestro compañero Fede López.
En este post vamos a asumir que conoces lo básico, de modo que podamos describir cómo conseguimos los estilos y pop-ups que aparecen por defecto al cargar nuestros mapas electorales.
La magia de Arcade en funcionamiento
Vamos a centrarnos en el caso más común, donde tenemos un partido por columna, con sus votos para cada municipio en toda España. Para representar los partidos más votados, necesitamos explorar los resultados de cada municipio para ordenar los partidos por número de votos. Esto lo podemos hacer definiendo una función como esta:
Vamos a centrarnos en el caso más común, donde tenemos un partido por columna, con sus votos para cada municipio en toda España. Para representar los partidos más votados, necesitamos explorar los resultados de cada municipio para ordenar los partidos por número de votos. Esto lo podemos hacer definiendo una función como esta:
Function getPredominantCategory(fieldsArray){ var maxValue = -Infinity; var maxCategory = ""; for(var k in fieldsArray){ if(fieldsArray[k].value > maxValue){ maxValue = fieldsArray[k].value; maxCategory = fieldsArray[k].alias; } else if (fieldsArray[k].value == maxValue){ maxCategory = maxCategory + "/" + fieldsArray[k].alias; } } return IIF(maxValue <= 0, null, maxCategory); } getPredominantCategory(groups);
Lo que estamos haciendo es recorrer una lista o array de partidos y comprobar sus votos para encontrar el más votado. Después sólo tenemos que crear el array que vamos a utilizar como argumento para esta función; básicamente será una lista de objetos con dos parámetros: el campo de la tabla del feature service y el alias del partido correspondiente, que podríamos redactar como quisiéramos:
var groups = [ {value: $feature.PSOE, alias:"PARTIDO SOCIALISTA OBRERO ESPAÑOL"}, {value: $feature.PP, alias:"PARTIDO POPULAR"}, {value: $feature.IU, alias:"IZQUIERDA UNIDA"}, {value: $feature.CDS, alias:"CENTRO DEMOCRATICO Y SOCIAL"}, {…} ]
Esto puede parecer un poco tedioso, pero sólo tenemos que hacerlo una vez, y nos da la libertad de escribir los nombres de los partidos de modo que sean fáciles de interpretar luego en los mapas y pop-ups.
Con estos dos trozos de código Arcade nos devolverá el partido más votado en forma de cadena de texto ya limpia y legible. Si usamos el resultado de esta expresión como atributo para la simbología, sólo tendremos que asignar los colores adecuados a cada valor posible para obtener el mapa del partido más votado.
En cierto modo, estamos calculando un atributo dinámicamente, sin almacenarlo en la tabla.
En las opciones de simbología de ArcGIS Online podemos usar una expresión de Arcade. El resultado de esta expresión se procesará como si fuera un atributo corriente en la tabla.
Ya tenemos el partido más votado, pero ¿qué pasaría si quisiéramos saber cómo de clara ha sido la victoria del ganador en cada municipio? Esta expresión calcula el porcentaje de votos de cada partido.
var groups = [ $feature.PSOE, $feature.PP, $feature.IU, $feature.CDS, […] ]; var winner = Max(groups); var total = $feature["Total_censo_electoral"]; return (winner/total) * 100;
Usando esta expresión para controlar la transparencia de las entidades logramos un mapa donde no sólo vemos el color del partido más votado, sino también un polígono más opaco cuanto más clara haya sido la victoria de dicho partido.
La transparencia dinámica también puede emplear expresiones de Arcade.
Tenemos ya un mapa que podemos interpretar rápidamente para leer el partido más votado y su dominio en cada municipio. Cuando nuestros usuarios quieran saber más, pulsarán en el municipio que les interese para acceder a la ventana emergente. Por defecto, la ventana emergente de nuestros mapas mostrará todos los campos de la tabla, y en casi todos los casos será conveniente configurarla para mostrar sólo los campos relevantes con el formato adecuado.
Esto es un pop-up, pero para ver esto mejor no mostrar nada.
Pero ¿sabías que es posible usar Arcade también en las ventanas pop-up? En nuestro caso, mostrar sólo una lista de partidos con el número de votos sería poco práctico debido a la gran cantidad de campos en el servicio, y porque además aparecerían ordenados tal y como figuran en la tabla, de modo que seguramente encontraríamos municipios donde los partidos poco votados aparecieran antes que otros partidos más relevantes.
Lo que queremos hacer es mostrar en la ventana emergente sólo los partidos más votados (decidimos limitarlo a cinco), y que aparecieran en un formato fácilmente legible.
Como antes, empezamos creando un array con los campos de cada partido y su alias (mira el array “groups” un poco más arriba). Luego creamos funciones para obtener el número de votos para cada alias:
function getValuesArray(a){ var valuesArray = [] for(var i in a){ valuesArray[i] = a[i].value; } return valuesArray; } function findAliases(top5a,fulla){ var aliases = []; var found = ""; for(var i in top5a){ for(var k in fulla){ if(top5a[i] == fulla[k].value && top5a[i] > 0 && Find(fulla[k].alias, found) == -1){ found += fulla[k].alias; aliases[Count(aliases)] = { alias: fulla[k].alias, value: top5a[i] }; } } } return aliases; }
Luego necesitamos otra función para ordenar por el número de votos y definir cuántos partidos queremos mostrar en la ventana emergente:
function getTopGroups(groupsArray){ var values = getValuesArray(groupsArray); var top5Values = IIF(Max(values) > 0, Top(Reverse(Sort(values)),5), “Sin información"); var top5Aliases = findAliases(top5Values,groupsArray); if(TypeOf(top5Values) == "String"){ return top5Values; } else { var content = ""; for(var i in top5Aliases){ content += (i+1) + ". " + top5Aliases[i].alias + " - " + Text(top5Aliases[i].value, "#,###"); content += IIF(i < Count(top5Aliases)-1, TextFormatting.NewLine, ""); } } return content; }
Esta función ya está formateando los datos de forma adecuada: “Nombre del partido – número de votos”. Sólo necesitamos llamar a esta función con nuestra lista de partidos como argumento, y nos devolverá el texto del pop-up ya configurado:
getTopGroups(groups);
A la hora de configurar el pop-up podemos elegir una expresión de Arcade. También podemos usar Arcade para crear campos “virtuales” que sólo se usen para mostrarlos en la lista de atributos en la ventana emergente.
Usando Arcade podemos conseguir que la ventana emergente muestre una lista ordenada con los 5 partidos más votados, en lugar de un chorro de atributos desordenados.
Preparar mapas que narren un mensaje claro y que presenten la información de manera accionable es esencial para que sean útiles. Arcade ofrece una alternativa extremadamente potente para calcular valores dinámicos en el lado del cliente sin la necesidad de alterar el modelo de datos o precalcular campos.
Si quieres explorar las expresiones de Arcade que creamos para los datos electorales y jugar con ellas, sigue estos pasos:
Te propongo algunas ideas para practicar:
Te animo a que comiences a usar Arcade en tus proyectos. Si ya conoces Python o Javascript, te resultará muy familiar y te será fácil crear expresiones como estas. Y si estás haciendo tus primeros pinitos con código, Arcade es un lenguaje sencillo que te permitirá adquirir algunos conocimientos útiles que luego podrás aplicar a otros entornos. En muchos casos, usar Arcade no es más difícil que crear fórmulas en Excel, y conseguirás multiplicar el valor de vuestros mapas.
Y, como siempre, esperamos que compartas con nosotros tus progresos y nos hagas llegar tus comentarios.