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:

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:

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.
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:

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:

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.