Select to view content in your preferred language

Usar campos de tipo DateOnly en ArcGIS Dashboards

132
0
2 weeks ago
Labels (2)
XanderBakker
Esri Esteemed Contributor
1 0 132

Usar Campos de tipo "DateOnly" en ArcGIS Dashboards

En este blog compartiremos una manera de usar campos de fecha solamente (DateOnly) en un tablero de control (ArcGIS Dashboards).

 

Nuevos tipos de campos 

Desde finales del año pasado contamos con nuevos tipos de campos en ArcGIS Online, pero el soporte para estos tipos de campos todavía no está en ArcGIS Dashboards. Más información sobre los nuevos campos:

https://www.esri.com/arcgis-blog/products/arcgis-online/mapping/time-is-on-your-side-with-new-field-...

Al publicar un servicio desde ArcGIS Pro con estos nuevos tipos de campos en el esquema, genere un aviso indicando que el uso puede ser limitado y efectivamente eso es el caso para los tableros que configures en ArcGIS Dashboards.

 

¿Dónde están mis campo?

Al publicar un conjunto de datos con campos de tipo fecha solamente ("DateOnly"), estos aparecen correctamente al explorar el servicio en ArcGIS Online:

XanderBakker_0-1719603786676.png

Pero en el momento de configurar alguna visualización como un gráfico de serie en ArcGIS Dashboards, se puede notar que estos campos no aparecen:

XanderBakker_1-1719604176046.png

 

Arcade al rescate

Afortunadamente, es posible usar las expresiones de datos basadas en Arcade para crear en memoria un conjunto de datos con el esquema adaptado tal que ArcGIS Dashboard puede usar la fecha para crear la visualización deseada. 

Para conocer más acera de la creación de expresiones de datos con Arcade, puede consultar este página web: https://doc.arcgis.com/es/dashboards/latest/get-started/create-data-expressions.htm

El concepto consiste en leer el featureset, modifcar el esquema, convertir la fecha, y convertir estos datos a un featureset en memoria. 

La gestión de fechas es algo que requiere un poco más de atención cuando se va a trabajar con expresiones de datos. No es posible escribir una fecha directamente a un campo de fecha, y es necesaria traducir la fecha a un epoch. Epoch o "Unix Time" se define como la cantidad de segundos transcurridos desde la medianoche UTC del 1 de enero de 1970, sin contar segundos intercalares. 

@DavidNyenhuis1 contestó a una pregunta en la comunidad compartiendo una manera para tomar un featureset y crear un "copia" en memoria con la posibilidad de modificar los datos en el proceso según la necesidad: https://community.esri.com/t5/arcgis-online-ideas/arcade-allow-date-values-in-date-fields/idc-p/1265...
 
Tomando esto como base se puede crear la solución que buscamos. Lo que es necesario es ajustar la expresión para modificar el esquema en el proceso.
 
Abajo la expresión de datos con Arcade. La expresión es genérico aunque es necesario cambiar la referencia al featureset en la linea 40, conectando a su portal, especificando el ID del servicio y el índice de la capa a usar.

 

// basado en:
// source: https://community.esri.com/t5/arcgis-online-ideas/arcade-allow-date-values-in-date-fields/idi-p/1204894
// de: David Nyenhuis

// Since a esriTypeDate can't take an Arcade Date, need to cast to EPOCH
// Pass in a feature
function CastDatesToEpoch(feat) {
    var modifiedAttributes = {};
    for (var att in feat) {
        if(TypeOf(feat[att]) == 'Date') {
            modifiedAttributes[att] = Number(feat[att])
            Console('${feat[att]} is now ${Number(feat[att])}')
        } else if(TypeOf(feat[att]) == 'DateOnly') {
            modifiedAttributes[att] = Number(feat[att])
            Console('${feat[att]} is now ${Number(feat[att])}')
        }
        else {
            modifiedAttributes[att] = feat[att]
        }
    }
    return modifiedAttributes
}

function ModifySchema(sch) {
  var txt = Text(sch);
  var sch2 = Dictionary(txt);
  var lst_flds = sch2["fields"];
  for (var i in lst_flds) {
    var dct_fld = lst_flds[i];
    if (dct_fld["type"] == "esriFieldTypeDateOnly") {
      dct_fld["type"] = "esriFieldTypeDate";
    }
    lst_flds[i] = dct_fld;
  }
  sch2["fields"] = lst_flds
  return sch2;
}

// get the layer
var fs = FeatureSetByPortalItem(Portal('https://utility-esri-co.maps.arcgis.com'), 'bf4a31341a5d49be90de6ce471a0b647', 0);
// Define a new dictionary feature set
var sch = Schema(fs);
var sch2 = ModifySchema(sch);

var dict = {
  'fields': sch2.fields,
  'geometryType': sch2.geometryType, // Can be esriGeometryNull, esriGeometryPoint, esriGeometryPolyline, esriGeometryPolygon;
  'features': []
};

// Do something to each feature, like add a field, then add it to the dictionary
var index = 0;
for (var f in fs) {
    // Add each feature to new dictionary and cast dates to EPOCH
    dict.features[index] = {
        'geometry': Geometry(f),
        'attributes': CastDatesToEpoch(f)
    }
    index++;
}

// Convert dictionary to feature set.
return FeatureSet(Text(dict));

 

Al usar la expresión de datos como fuenta para crear por ejemplo un gráfico de serie ahora si aparecen los campos de las fechas:

XanderBakker_3-1719605947179.png

 

Resultado y aspectos para tener en cuenta

Abajo se puede ver un ejemplo generado a partir de la expresión de datos que brinda acceso a a los campos de fecha:

XanderBakker_2-1719604320430.png

En caso de usar expresiones de datos es importante tener algunos aspectos en cuenta:

  • Lo más importante es la experiencia del usuario final y para logar una buena experiencia del usuario el rendimiento del tablero debe ser bien. La expresión de datos que presentamos en este blog lea todo el featureset y lo replique en memoria. Esto funcione bien con una conjunto de datos de en este caso unos 1500 registros, pero si la capa es muy grande el usuario va a notar una reducción del rendimiento. Si la visualización no requiere todos los datos, aplique un filtro a los datos en el momento de leer la capa.
  • Seguramente el soporte para estos nuevos campos va a aparecer en tiempo en las aplicaciones de ArcGIS. Si el objetivo es crear visualizaciones con base en fechas es mejor evitar el uso de estos campos en los conjuntos de datos hasta que se cuenta con soporte completa de estos campos.
  • La expresión en este ejemplo solamente toma encuenta el caso de modificar un campo de solo fecha. No gestione campos de solo tiempo ni combine campos de solo fecha y solo tiempo en un campo de fecha.

 

 

About the Author
Solution Engineer for the Utilities Sector @ Esri Colombia - Ecuador - Panamá sr GIS Advisor / Python - Arcpy developer / GIS analyst / technical project leader / lecturer and GeoNet moderator, focusing on innovations in the field of GIS. Specialties: ArcGIS, Python, ArcGIS Enterprise, ArcGIS Online, Arcade, Configurable Apps, WAB, Mobile Apps, Insights, Spatial Analysis, LiDAR / 3D Laser Scanning / Point Clouds. UNME http://nl.linkedin.com/in/xanderbakker/ http://www.slideshare.net/XanderBakker http://www.scribd.com/xbakker http://twitter.com/#!/XanderBakker