Select to view content in your preferred language

Contar entididades duplicadas en una tabla de atributos con arcade

3021
23
Jump to solution
12-05-2019 09:05 AM
usuarioredes
New Contributor III

Estimados, junto con saludar, me gustaría que me ayudaran a crear un script en arcade que me cuente la cantidad de números duplicados que hay en x columna.

1 Solution

Accepted Solutions
XanderBakker
Esri Esteemed Contributor

Hola usuario redes , 

Te voy a compartir un ejemplo muy sencillo para explicar el concepto.

Primero se pueden definir 2 expresiones de Arcade muy similares:

Texto Cantidad:

var cantidad = Count(Filter($layer, "ID_activo = " + $feature["ID_activo"]));

var resultado = "";
If (cantidad == 1) {
    resultado = "No critico (1)";
} else if (cantidad == 2) {
    resultado = "Semicritico (2)";
} else if (cantidad == 3) {
    resultado = "Critico (3)";
} else if (cantidad > 3) {
    resultado = "Grave (" + cantidad + ")";
} else {
    resultado = "Sin encuestas";
}

return resultado;‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

y Color:

var cantidad = Count(Filter($layer, "ID_activo = " + $feature["ID_activo"]));

var resultado = "#FFFFFF";
If (cantidad == 1) {
    resultado = "#948B54";
} else if (cantidad == 2) {
    resultado = "#568CD6";
} else if (cantidad == 3) {
    resultado = "#94CF4F";
} else if (cantidad > 3) {
    resultado = "#F60400";
} else {
    resultado = "#FFFFFF";
}

return resultado;‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

Luego se debe entrar a la configuración de la ventana emergente, cambiando la visualización a "Una Visualización de atributo personalizado" y oprimir "CONFIGURAR":

En la ventana de configuración cambiar a HTML:

Luego pegar el siguiente código HTML (expr1 hace referencia a la expresión del color y expr0 al texto😞

<table>
  <tbody>
    <tr>
      <td bgcolor="#F7F7F7" width="60px">Estado</td>
      <td align="center" bgcolor="{expression/expr1}" width="120px">{expression/expr0}</td>
    </tr>
  </tbody>
</table>

El resultado se va ver así:

View solution in original post

23 Replies
XanderBakker
Esri Esteemed Contributor

Hola usuario redes ,

Eso es posible. Para ayudarle, sería bueno compartir más detalles del esquema de datos y como se llamen las capas en el mapa, así para saber si está usando ArcGIS Pro, ArcGIS Online, ArcGIS Enteprise (versión?) y si la expresión debe ser usado en un cálculo de campo, la ventana emergente o en otra parte.

0 Kudos
usuarioredes
New Contributor III

Hola Xander, te cuento como es el flujo:

1. El esquema de datos inicia con una encuesta creada en survey 123 donde se enlazo el esquema URL de Survey  dentro de un mapa web de ArcGIS Online, para luego ser compartida en Collector for ArcGIS y los operadores de campo puedan realizar las mantenciones en los activos identificados con un ID único.

2. Una vez que los operadores envíen la encuesta, los datos se almacenaran en la capa surveypoint con la información recolectada y la ubicación del envió de la encuesta(la ubicación del envió de la encuesta la arroja como respuesta predeterminada a una pregunta de geopoint de survey, de esta manera utiliza las coordenadas del activo para tener mas precisión) . Esta capa se llama  _12_de_formulario y la columna donde quiero realizar la expresión arcade se llama ID_activo. (el id del activo se almacena como cadena de caracteres)

3. Ahora la lógica del script que necesito es que cuando el operador de campo realice mantenciones y envié el formulario, la capa  _12_de_formulario pueda tener un contador en el cual me indique las veces que se ha mantenido a ese activo y le asigne un estado y un color al punto donde se envió la encuesta.

La configuración seria esta:  

4. Tengo dudas si el script seria mejor realizarlo en un calculo de campo o en la ventana emergente (foto de abajo)

Atento a comentarios Xander.

 

 

0 Kudos
XanderBakker
Esri Esteemed Contributor

Hola usuario redes ,

Muchas gracias por compartir la explicación detallada del proceso. Con Arcade se puede acceder a otra tabla y/o capa y hacer un recuento de las hecho para un activo. En la lógica de la expressión se puede hacer uso de las funciones FeatureSetBy*, pero estas no están disponibles en el perfil de visualización por razones de rendimiento. Me parece una ventaja poder usar una simbología basada en la cantidad de encuestas  realizadas para el activo, pero para lograrlo es necesario usar un cálculo de campo y visualizar la capa sobre este campo calculado. La desventaja es el hecho que el campo será estático y encuestas realizadas después de calcular el campo ne se van a ver reflejadas en el campo calculado. Solamente cuando se vuelve a calcular el campo se van a ver los cambios. 

La ventana emergente si permite el uso de las funciones de FeatureSetBy* de una manera dinámica y a todo tiempo puede mostrar la cantidad de encuestas realizadas. Sin embargo, para acceder a la información es al hacer clic en el feature. 

Cual de las opciones le parece más conveniente?

0 Kudos
usuarioredes
New Contributor III

Hola Xander, gracias por responder.

La solución que mas me acomoda es la ventana emergente ya que necesito que el conteo y la asignación de simbología basada en cantidad de encuestas realizada para el activo sea en tiempo real.

De esta manera los ID de activos que ingresen a la tabla de atributos geopoint de survey 123 deberían cambiar de estado y de color al momento de sobrepasar la cantidad establecida (Nomenclatura foto

Nomenclatura foto

Ejemplo: Si en la tabla de atributo geopoint de survey 123 el activo con ID 300 registra 2 mantenciones se le debería asignar el estado semicritico y una simbología color azul (Nomenclatura foto), pero al momento de que reciba otra mantención debería pasar automáticamente a un estado critico y cambiar de color verde.

Se podría realizar esta lógica Xander?

El objetivo de este proyecto es que en el dashboard que tengo hecho me pueda diferenciar la cantidad de mantenciones  hechas en un mismo activo, donde debe ser en tiempo real.

Actualmente tengo todo ya creado y vinculado pero solo me faltaría crear este script para realizar esta lógica.

La capa geopoint de survey 123 son los puntos naranjos visualizados en el mapa.

0 Kudos
XanderBakker
Esri Esteemed Contributor

Hola usuario redes , 

El feature te va a dar el ID y eso podemos usar en un Filter sobre la tabla (FeatureSetByName) y luego hacer un Count para obtener la cantidad de registros para después asignar el estado. Observe el ejemplo abajo:

var id = $feature["Nombre del campo con el ID"];
var tabla = FeatureSetByName($map, "Nombre de la table en el mapa web");
var sql = "Nombre del campo con el ID = '" + id + "'";
var encuestas = Filter(tabla, sql);
var cantidad = Count(encuestas);

var resultado = "";
If (cantidad == 1) {
    resultado = "No critico";
} else if (cantidad == 2) {
    resultado = "Semicritico";
} else if (cantidad == 3) {
    resultado = "Critico";
} else if (cantidad > 3) {
    resultado = "Grave";
} else {
    resultado = "Sin encuestas";
}
return resulado;

Para incrementar el rendimiento se puede colocar los primeros 5 lineas en una sola petición:

var cantidad = Count(Filter(FeatureSetByName($map, "Nombre de la table en el mapa web"), "Nombre del campo con el ID = '" + $feature["Nombre del campo con el ID"] + "'"));

var resultado = "";
If (cantidad == 1) {
    resultado = "No critico";
} else if (cantidad == 2) {
    resultado = "Semicritico";
} else if (cantidad == 3) {
    resultado = "Critico";
} else if (cantidad > 3) {
    resultado = "Grave";
} else {
    resultado = "Sin encuestas";
}
return resulado;
0 Kudos
usuarioredes
New Contributor III

Hola Xander, junto con saludar, te doy las gracias por responder y también me gustaría hacerte una consulta sobre el nombre de la tabla en el mapa web, nose si lo estaré haciendo bien o me falta algo. 

En el mapa web solo tengo una capa que es la del formulario survey 123. La tabla de atributos de esta capa se llama  _12_de_formulario y la columna donde se almacena el id del activo se llama ID_activo. Luego copie el script en la ventana emergente de la capa pero al momento de aceptar no me aparecen resultados. 

var cantidad = Count(Filter(FeatureSetByName($map, "_12_de_formulario"), "ID_activo = '" + $feature["ID_activo"] + "'"));

var resultado = "";
If (cantidad == 1) {
    resultado = "No critico";
} else if (cantidad == 2) {
    resultado = "Semicritico";
} else if (cantidad == 3) {
    resultado = "Critico";
} else if (cantidad > 3) {
    resultado = "Grave";
} else {
    resultado = "Sin encuestas";
}
return resulado;



0 Kudos
XanderBakker
Esri Esteemed Contributor

Hola usuario redes ,

Lo que estoy viendo es que se pegó la expressión de Arcade en la ventana emergente. Lo que se debe hacer es entrar al editor de las expressiones y pegar el código allá. Es decir, entrar a configurar la ventana emergente y luego en la parte inferior se va encontrar la sección de "Expressiones de atributos":

Con el botón de AGREGAR se puede definir la expressión. Allá también se van a encontrar la forma de acceder a las capas:

Si solamente la capa de las encuestas está en el mapa, y la idea es hacer el conteo de las encuestas con el mismo ID_activo, se puede cambiar el código a:

var cantidad = Count(Filter($layer, "ID_activo = '" + $feature["ID_activo"] + "'"));

var resultado = "";
If (cantidad == 1) {
    resultado = "No critico";
} else if (cantidad == 2) {
    resultado = "Semicritico";
} else if (cantidad == 3) {
    resultado = "Critico";
} else if (cantidad > 3) {
    resultado = "Grave";
} else {
    resultado = "Sin encuestas";
}
return resulado;

El query está asumiendo que el ID_activo sea un texto. En caso de ser numérico es necesario cambiar la expressión a:

var cantidad = Count(Filter($layer, "ID_activo = " + $feature["ID_activo"]));

var resultado = "";
If (cantidad == 1) {
    resultado = "No critico";
} else if (cantidad == 2) {
    resultado = "Semicritico";
} else if (cantidad == 3) {
    resultado = "Critico";
} else if (cantidad > 3) {
    resultado = "Grave";
} else {
    resultado = "Sin encuestas";
}
return resulado;
0 Kudos
usuarioredes
New Contributor III

Hola Xander, me arroja este mensaje al copiar el primer script que me dejaste en el correo anterior.

0 Kudos
usuarioredes
New Contributor III

Hola Xander, adjunto el link para acceder al mapa web con la capa del formulario.

 

http://aguasnuevas.maps.arcgis.com/home/webmap/viewer.html?webmap=691c8192748343f49cb59f07c283d410

0 Kudos