Cómo crear una vista que indique predominación con Arcade

Cómo crear una vista que indique predominación con Arcade


De Kristian Ekenes


En la Cumbre de Desarrolladores de Esri de marzo de 2017, Dave Bayer y yo dimos una presentación sobre cómo usar expresiones Arcade en aplicaciones web construidas en la plataforma ArcGIS. En esa presentación he demostrado una forma sucinta de crear una visualización que predomine usando Arcade.

Visualizar el predominio implica colorear las características de una capa sobre la base de qué atributo entre un conjunto de atributos numéricos competidores gana o supera a los otros en el recuento total. Las aplicaciones comunes de esto incluyen la visualización de resultados electorales, resultados de encuestas y mayorías demográficas.

Arcade es una buena solución para visualizaciones de predominancia, ya que le permite evitar la creación de nuevos campos en un servicio para almacenar la categoría predominante y el margen de victoria. Con Arcade, escriba la expresión y devolverá los valores en tiempo de ejecución, lo que le permitirá manejar el color de la visualización en función de la categoría predominante.

En nuestra presentación de Dev Summit compartí este webmap, que representa el logro educativo predominante alcanzado por la gente en México a nivel municipal.


La expresión utilizada para crear la visualización se ve así:
// Calculate values based on attribute fields
var primary = $feature.EDUC04_CY + $feature.EDUC07_CY;
var secondary = $feature.EDUC06_CY + $feature.EDUC08_CY;
var highSchool = $feature.EDUC09_CY + $feature.EDUC11_CY;
var college = $feature.EDUC10_CY + $feature.EDUC12_CY
              + $feature.EDUC13_CY+$feature.EDUC14_CY
              + $feature.EDUC15_CY;

// pass all values to an array
var fields = [ $feature.EDUC01_CY, $feature.EDUC02_CY,
               $feature.EDUC03_CY, $feature.EDUC05_CY,
                primary, secondary,highSchool,college ];

// get the max or winner
var winner = Max(fields);

// return the string describing the winning value
return Decode(winner,
  $feature.EDUC01_CY, "Didn't attend any school",
  $feature.EDUC02_CY, "Preschool",
  $feature.EDUC03_CY, "Incomplete elementary school",
  primary, "Elementary school",
  $feature.EDUC05_CY, "Incomplete middle school",
  secondary, "Middle school",
  highSchool, "High school",
  college, "College", "Other");

Una vez que entienda la sintaxis de Arcade y lo que está haciendo la función Decode(), la expresión es bastante sencilla de leer. Decodificar es una función de Arcade que coincide con un valor (atributo de característica generalmente) con otro valor entre un conjunto de coincidencias potenciales. Cada una de las coincidencias potenciales se empareja con otros valores (generalmente una cadena) que lo describen. En esencia, coincide con un valor con una descripción significativa. En este caso, el valor de entrada a coincidir es el valor máximo de esos valores / expresiones de campo en la matriz proporcionada. Todos los valores de la matriz se pasan a la función Decodificar junto con cadenas coincidentes que describen lo que representa el valor. Por lo tanto, la cadena que coincida con el máximo siempre se devolverá. Es liso, compacto y simple de usar con cualquier conjunto de datos.

Un enfoque alternativo


Sin embargo, un usuario en nuestra presentación hizo una gran pregunta: "¿Qué pasa si hay un empate para la categoría superior?" La respuesta que dimos es que Decode devolverá el primer partido en el caso de los ganadores duplicados. Aunque los lazos son relativamente comunes en los conjuntos de datos que he visto, muy pocos de ellos involucraban el valor máximo. Sin embargo, el enfoque de Decode es defectuoso y no aborda la verdadera pregunta: "¿Cómo visualizamos los lazos para la categoría superior?"

La solución que eventualmente surgió aprovecha la capacidad de Arcade para escribir funciones personalizadas. Después de probar la expresión revisada con varios conjuntos de datos, encontré que era más fácil trabajar con y la solución para tratar con valores máximos vinculados satisfactorios:


var primary = $feature.EDUC04_CY + $feature.EDUC07_CY;
var secondary = $feature.EDUC06_CY + $feature.EDUC08_CY;
var highSchool = $feature.EDUC09_CY + $feature.EDUC11_CY;
var college = $feature.EDUC10_CY + $feature.EDUC12_CY
              + $feature.EDUC13_CY+$feature.EDUC14_CY
              + $feature.EDUC15_CY;

// The fields from which to calculate predominance
// The expression will return the alias of the predominant field

var fields = [
  { value: $feature.EDUC01_CY, alias: "Didn't attend any school" },
  { value: $feature.EDUC02_CY, alias: "Preschool" },
  { value: $feature.EDUC03_CY, alias: "Incomplete elementary school" },
  { value: primary, alias: "Elementary school" },
  { value: $feature.EDUC05_CY, alias: "Incomplete middle school" },
  { value: secondary, alias: "Middle school" },
  { value: highSchool, alias: "High school" },
  { value: college, alias: "College" }
];

// Returns the predominant category as the alias
// defined in the fields array. If there is a tie,
// then both names are concatenated and used to
// indicate the tie

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(fields);
La función getPredominantCategory () devuelve el alias de la categoría max como se define en el fieldsArray. Observe que si se encuentra un valor de empate para el valor máximo, los alias de todos los campos involucrados con el empate se concatenan y devuelven.

Los resultados


Echemos un vistazo a lo bien que este enfoque funciona utilizando Arcade playground. Entré en el campo ficticio valores que representaban el número de votos emitidos por tres partidos políticos en una característica ficticia y corría la expresión. Devolvió correctamente el valor máximo.


Si se ataron los dos valores inferiores, se devolvió correctamente el mismo resultado, ya que no implican el valor máximo.

Si se ataron dos valores para el primer lugar, ambos alias se devolvieron como una cadena concatenada.

En el caso poco probable de un empate de tres vías, la expresión incluso funciona en ese escenario.

¿Y qué si todos los campos tienen el valor de cero? No parece correcto visualizar un empate ya que no se emitieron votos dentro de la característica dada. Así que la expresión devuelve null, lo que indicará al renderizador de la capa que no se molestará en visualizar la característica.
 
Pero, ¿cómo cambia este enfoque la visualización del conjunto de datos de logros educativos en México? En conjunto, la visualización no cambió mucho. Si abrimos las opciones de "cambio de estilo" en el visor de mapas de ArcGIS Online, podemos comparar las categorías y sus cuentas totales entre cada método utilizado.
Se encontraron dos situaciones únicas de empate entre seis municipios donde existieron lazos por el valor máximo de los campos. Observe que el visor de mapas le permite agrupar valores. Así que si tienes un montón de escenarios de empate únicos, puedes agruparlos en la categoría "Otros" y renombrarlo a "empate" para que se visualicen con el mismo símbolo.
 
Si la construcción de la visualización en una aplicación personalizada con la API de ArcGIS para JavaScript, se utiliza un UniqueValueRenderer y acaba de establecer el defaultSymbol y defaultLabel a este valor genérico. Entonces no necesitará especificar cada escenario de enlace en el uniqueValueInfos del renderizador.

Curiosamente, tres de los seis lazos ocurrieron en la misma región. Nos acercaremos al noroeste de Oaxaca para ver mejor cómo comparar las diferentes visualizaciones de cada método. Las etiquetas de cada característica indican el % de separación o margen entre los dos campos de la competencia. He marcado en círculos las características en negro donde la diferencia es 0% (o donde existe un empate).

Metodología de decodificación - sin vínculos indicados

Observe que las características con vínculos indican incorrectamente un ganador claro.


Metodología de la función personalizada - vínculos únicos indicados

Los lazos únicos se visualizan con colores diferentes.


Metodología de la función personalizada - todos los vínculos indicados genéricamente

Todos los lazos se visualizan con el mismo color después de agruparlos.


Métodos para indicar la fuerza de predominio


He utilizado dos métodos diferentes para visualizar la fuerza del valor predominante, o el dominio general del ganador. Se explican con mayor profundidad en el video de la sesión, así que no entraré en demasiada profundidad describiendo la lógica de la sintaxis de Arcade utilizada.

El concepto es que vamos a cambiar el valor de opacidad de cada característica sobre la base de cómo convincente la victoria fue entre los valores de la competencia. Esto cuenta otro lado de la historia, especialmente en el caso de las elecciones y los resultados de la encuesta.

La opacidad puede ser manejada por valores de campo o expresiones de Arcade haciendo clic en el enlace "Valores de atributo" en las opciones "Cambiar estilo" de ArcGIS Online.


Fuerza

El primer método que yo llamo simplemente "fuerza de predominio". Compara el valor del ganador con todos los demás valores y devuelve su fuerza como un porcentaje:

var primary = $feature.EDUC04_CY + $feature.EDUC07_CY;
var secondary = $feature.EDUC06_CY + $feature.EDUC08_CY;
var highSchool = $feature.EDUC09_CY + $feature.EDUC11_CY;
var college = $feature.EDUC10_CY + $feature.EDUC12_CY+$feature.EDUC13_CY
              +$feature.EDUC14_CY+$feature.EDUC15_CY;

var fields = [ $feature.EDUC01_CY, $feature.EDUC02_CY,
               $feature.EDUC03_CY, $feature.EDUC05_CY,
                primary, secondary, highSchool, college ];
var winner = Max(fields);
var total = Sum(fields);
return (winner/total)*100;

El porcentaje se utiliza entonces para controlar la opacidad de cada característica. La API de mapeo inteligente proporcionará buenos puntos de interrupción predeterminados para los valores de opacidad.
Observe que las características donde existen lazos pueden tener diferentes niveles de fuerza. En la imagen de arriba, la característica en el círculo más al norte tiene dos atributos con valores altos que están atados. Los valores de los campos competidores podrían ser algo así: [40, 40, 10, 4, 2, 1, 1, 0]. La expresión de fuerza retornaría 40%. El máximo de esta característica es probablemente mayor que el máximo en la mayoría de las otras características; Por lo que la característica es más opaco, aunque existe un vínculo.

La característica más circundada en el sur puede tener los siguientes valores para sus categorías competidoras: [20, 20, 19, 19, 10, 8, 3, 1]. La expresión de fuerza retornaría 20%. El máximo es relativamente bajo comparado con el valor máximo de otras características, dando por resultado el color transparente variable.

Brecha

La metodología "Gap" sólo compara el valor máximo con el segundo valor más alto. El valor resultante indica cuánto ganó la función ganadora, también conocido como el "margen de victoria".


var primary = $feature.EDUC04_CY + $feature.EDUC07_CY;
var secondary = $feature.EDUC06_CY + $feature.EDUC08_CY;
var highSchool = $feature.EDUC09_CY + $feature.EDUC11_CY;
var college = $feature.EDUC10_CY+$feature.EDUC12_CY
             + $feature.EDUC13_CY + $feature.EDUC14_CY 
             + $feature.EDUC15_CY;

var fields = [ $feature.EDUC01_CY, $feature.EDUC02_CY,
              $feature.EDUC03_CY, $feature.EDUC05_CY,
              primary, secondary,highSchool,college ];

var order = Reverse(Sort(fields));
var winner = order[0];
var secondPlace = order[1];
var total = Sum(fields);
return Round(((winner - secondPlace) / total) * 100, 2);
En este escenario, las características vinculadas siempre tendrán un relleno transparente.
Resumen

Arcade puede ser un poderoso vehículo para explorar visualizaciones de predominio entre atributos competidores. He mencionado un par de expresiones que puede utilizar al crear visualizaciones de predominio. Sólo recuerde las limitaciones de cada uno:
El acercamiento de la decodificación es fino si ningunos lazos están presentes o si usted planea en conducir la opacidad con una expresión de la abertura porque la brecha lavará el color de todos modos.La función personalizada funciona bien en el caso de los lazos. Sin embargo, si existen muchos tipos únicos de vínculos, es posible que desee visualizarlos agrupados en una categoría genérica de "empate" para evitar confusiones.

También tenga en cuenta que puede aprovechar las herramientas Smart Mapping para este flujo de trabajo. Simplemente seleccionando dos o más campos en el visor de mapas, puede seleccionar la opción de estilo "Categoría predominante" para permitir que el visor del mapa realice todo el trabajo para usted.


Asegúrese de revisar este Story Map explicando cómo visualizar el predominio en ArcGIS Online. Sin embargo, no puede utilizar expresiones de Arcade para cada valor en este flujo de trabajo. En los ejemplos anteriores, algunos valores como "grado universitario" eran la suma de varios campos (por ejemplo, licenciatura + maestría y doctorado). Las expresiones de Arcade compartidas anteriormente en esta publicación le permiten realizar cálculos adicionales antes de generar la visualización de predominio.

Lea el artículo original | Si necesita más información sobre Arcade consulte a uno de nuestros ejecutivos | Visítenos en sigsa.info

Entradas más populares de este blog

ArcGIS 10.5: Una nueva versión del SIG Empresarial

¡Nuevo Curso Gratuito de GeoPlanner!

Drone2Map para ArcGIS - Ponga su Drone a Trabajar