En este blog compartiremos una manera de usar campos de fecha solamente (DateOnly) en un tablero de control (ArcGIS Dashboards).
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:
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.
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:
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.
// 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:
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:
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.