CRU2020 - Track Servicios Públicos - Arcade y Reglas de Atributos

Document created by xander_bakker on Mar 17, 2020Last modified by xander_bakker on Mar 19, 2020
Version 3Show Document
  • View in full screen mode

 

Introducción

El la conferencia regional de usuarios que se efectuó los días 3 (Medellín), 5 (Barranquilla), 10 (Pereira) y 12 (Cali) de marzo 2020, tuvimos un espacio en la tarde para compartir las novedades en ArcGIS relacionadas a nuestro sector de servicios públicos. Algo muy importante es la gestión avanzada de redes de servicios públicos y hicimos demos de la nueva solución con que contamos para esta gestión avanzada: el Utility Network (ver: Vision and overview of the utility network ). Antes de entrar a explicar como funcione el Utility Network, es necesario explicar las expresiones Arcade y su uso en las reglas de atributos. 

 

Arcade

Arcade es un lenguaje de expresiones que podemos usar para calcular campos, modificar etiquetes, adicionar contenido a las ventanas emergentes, crear simbología dinámica y definir reglas de atributos. En el documento Usando las Nuevas Funciones de FeatureSetBy en Arcade para Acceder a otras Capas y Tablas se comparte una explicación de las expresiones Arcade sobre un ejemplo de hidrantes y su historia de mantenimiento.

 

Reglas de atributos

Las reglas de atributos principalmente tiene dos funciones:

  • Incrementar la eficiencia en la captura de los datos
  • Incrementar la consistencia de los datos

 

Un ejemplo para explicar su uso. Si tenemos una red de tubería con algún producto a presión, en el momento de cambiar el estado de ciclo de vida, debemos asegurar que la consistencia en los datos permanece. Si el estado de ciclo de vida se cambie a abandonada, la linea no debe tener presión. Las reglas de atributos nos ayuden a lograr este consistencia sin requerir que el usuario cambie el valor de presión logrando mayor eficiencia en la edición y con un menor esfuerzo:

 

Inicialmente las reglas de atributos fueron introducidas para los datos almacenados en bases de datos corporativas, pero en la versión actual también se puede usar con datos almacenados en los File Geodatabase. El ejemplo a continuación está usando datos en un File Geodatabase, pero lo mismo (y más) puede ser logrado usando datos en una base de datos corporativa.

 

Lo que se quiere lograr

Contamos con 3 zonas (Laureles, Poblado y Belén) y para cada zona se configuró un usuario quién tiene permiso de editar los datos puntuales dentro del la zona cuando el estado es "Abierto".  No se permite crear contenido fuera de las zonas, en una zona de otra persona y tampoco en una zona con un estado "Cerrado". Los puntos que se capturen tienen una identificación la cual consiste en el nombre de la zona y un número secuencial para cada zona:  

 

En el momento de tratar de editar el mapa creando un punto fuera de las zonas, o en una zona no asignada a mi usuario o en una zona con estado "Cerrado" me genere un  mensaje explicando el error:

 

Cuando se genere un punto en la zona donde el usuario sí puede editar, se puede observar que si se generó el punto e incluso el punto tiene la identificación "Laureles-004" creada automáticamente:

 

 

La configuración de las reglas de atributos usadas en este ejemplo

Para entrar a la configuración de las reglas de atributos, se activa la capa en la tabla de contenido, y luego del menú sensitivo al contexto "Feature Layer", se activa la pestaña "Data" y se hace clic sobre el botón "Attribute Rules":

 

Existen 3 tipos de reglas de atributos:

  • Cálculo (se ejecute directamente o en lote)
  • Restricción (se ejecute durante la edición de datos)
  • Validación (se ejecute al validar la consistencia de datos)

 

Empecemos con la creación automática de la identificación de los puntos. Esto se hace con una regla de atributos de cálculo:

 

 

Si revisamos el contenido de la expresión, se puede observar que en la primera linea, se accede a la capa con las zonas de trabajo y su campo "Nombre" y se hace una intersección con el punto que se está capturando:

var zona = Intersects(FeatureSetByName($datastore, "ZonasTrabajo", ["Nombre"], false), $feature);

if (Count(zona) == 0) {
    return "Desconocido-" + Text(NextSequenceValue('seqFuera'), "000");
}

var nombre = First(zona).Nombre;
return nombre + "-" + Text(NextSequenceValue('seq'+nombre), "000");

Las lineas 3 a 5 sobren, porque vamos a tener una reglas de atributos que restringe la creación de puntos fuera de las zonas.

 

En la linea 7 se extrae el nombre de la primera zona encontrada (solamente se va encontrar una zona).

En la linea 8 se devuelve la identificación de la siguiente manera:

  • usando el nombre de la zona
  • agregando "-" al nombre
  • usar la función "NextSequenceValue" de la secuencia creado para cada zona y formateando este número de usar ceros adicionales cuando el número ocupe menos a 3 caracteres.     

 

Es necesario contar con una secuencia para cada zona. Una secuencia se configure a nivel de base de datos indicando el número en la cual empezar y el valor con lo cual se debe incrementar (normalmente 1), y cada vez que se está usando, se incremente el valor. Se pueden generar las secuencias usando la herramienta "Create Database Sequence":

   

 

Lo que se puede notar es que en el nombre de la secuencia se está usando el nombre de la zona, con el fin de poder simplificar la expresión de Arcade para usar la secuencia correcta con cada zona. 

 

La segunda regla de atributos es para restringir la edición. Esto se logra con una reglas de atributos de tipo "Constraint" (restricción):

 

Esta expresión es un poco más compleja y se ejecute en el momento de insertar un nuevo punto pero también al editar un punto existente:

if (!IsEmpty(Geometry($originalfeature))) {
    var zona = Intersects(FeatureSetByName($datastore, "ZonasTrabajo", ["Usuario"], false), $originalfeature);
    if (Count(zona) > 0) {
        // punto original en poligono, revisar si usuario puede editarlo
        var usuario_actual = $feature.last_edited_user;
        var usuario_permitido = First(zona).Usuario;
        if (usuario_actual != usuario_permitido) {
            // usuario no permitido
            return {"errorMessage": "Solamente el usuario " + usuario_permitido + " puede editar esta punto"}
        }
        // validar estado
        var estado = First(zona).Estado;
        if (estado != "Abierto") {
            // Estado no está abierto
            return {"errorMessage": "Este elemento no puede ser editado puesto que el estado de la zona está cerrado!"}
        }
    }
}

var zona = Intersects(FeatureSetByName($datastore, "ZonasTrabajo", ["Usuario", "Estado"], false), $feature);
if (Count(zona) == 0) {
    // no hay zona, no permitir la edición
    return {"errorMessage": "Solamente se pueden crear elementos dentro de una zona!"}
}

// validar usuario
var usuario_actual = $feature.last_edited_user;
var usuario_permitido = First(zona).Usuario;
if (usuario_actual != usuario_permitido) {
    // usuario no permitido
    return {"errorMessage": "Solamente el usuario " + usuario_permitido + " puede editar esta zona"}
}

// validar estado
var estado = First(zona).Estado;
if (estado != "Abierto") {
    // Estado no está abierto
    return {"errorMessage": "Solamente esta zona pude ser editado cuando el estado está abierto"}
}

// todo bien, permitir edición
return true;

 

Explicación de la expresión:

  • La primera linea revise si tenemos un estado del feature antes de la edición. Si esto es el caso debemos gestionar una edición de un feature existente:
    • se hace la validación si el punto pertenece a una zona donde el editor tiene permiso para hacer la edición
  • A partir de la linea 20 se empiece a validar la creación de puntos nuevos
    • punto dentro de alguna zona?
    • usuario permitido?
    • estado abierto?
  • Al final se devuelve el valor true (verdadero) que la edición se puede hacer. Esto solamente ocurre en caso que no se detectó algún error antes

 

Un ejemplo de editar un punto existente. En este caso para la zona de Poblado está habilitado también y se agregó un punto "Poblado-025". Que pasaría en el caso que movemos el punto a la zona de Laureles?

 

 

En este caso se permite la edición (porque cumple con las condiciones configuradas) y se deja mover el punto a Laureles. Pero también se ajuste la identificación para que sea correcta: "Laureles-005":

 

Espero que este ejemplo les ayuda a entender algunos principios de las reglas de atributos. El alcance de las reglas de atributos va mucho más allá y permite la edición de otras capas con base en ediciones en una capa. Las reglas de atributos son uno de los métodos para lograr una alta consistencia en los datos y permitir la gestión avanzada de redes de servicios públicos con el Utility Network.  

 

Recursos relacionados

 

Blogs relacionados

Attachments

    Outcomes