Dear all,
I am trying to do a dashboard in AGOL. Using the example 2 of this link:
However, to work I have to do something that I really don't know.
I need to to clean the "name" from unnecessary code, using this:
Trim(Split(DomainName($feature, 'name'), '_')[-1])
However, it does not accept global variables... therefore $feature - does not work. so after some changes
I end up with this:
var fs = FeatureSetByPortalItem(Portal('https://xxxxx.maps.arcgis.com'), 'a73a2a04e8b24aa7a5a514193a3057a0', 0, [Trim(Split( 'name', '_')[-1]),'DELIV_DATE','sqKm'], false);
But I have no idea how this can work for the remaining code of that link.
Can someone suggest me some fixing.
cheers
PS
Solved! Go to Solution.
You're not putting it into it, you're wrapping the filter around the existing expression.
var fs = Filter(
FeatureSetByPortalItem(
Portal('https://xxxxx.maps.arcgis.com'),
'a73a2a04e8b24aa7a5a514193a3057a0',
0,
['name','DELIV_DATE','sqKm'],
false
),
"local_type = 'some value'"
);
The FeatureSetByPortalItem only takes a list of field names as defined in the underlying table. So while you can submit your Trim(...) function, unless there happens to be a column in the table with the resulting string, it won't return anything. You'll have to simply request the name column and work with it further.
var fs = FeatureSetByPortalItem(
Portal('https://xxxxx.maps.arcgis.com'),
'a73a2a04e8b24aa7a5a514193a3057a0',
0,
['name','DELIV_DATE','sqKm'],
false
);
Once you have your FeatureSet, you can use other functions that output FeatureSets, like Filter, GroupBy, and Distinct. If these functions cannot accomplish what you need, then you have to iterate over your FeatureSet using a for loop, in which you do whatever you need to each feature individually, and then build a new FeatureSet "from scratch".
The former, using functions that output FeatureSets, are much faster, and should be used if you can. Generally, these will make use of SQL expressions that are submitted to the feature service.
If I'm reading this right, you have a domain name with underscores, and you'd like the text that follows the last underscore? It would be helpful to have some idea of the contents of this field. If there's consistent formatting (which, with a domain, may be the case), then you ought to be able to get something like Distinct to give you your results.
Hi Josh,
in fact there is no domains. it is just text: v321_Paris; v258_Madrid; a5741_Berlin; g9865_Paris; etc.
I understood is that after the:
var fs = FeatureSetByPortalItem(
Portal('https://xxxxx.maps.arcgis.com'),
'a73a2a04e8b24aa7a5a514193a3057a0',
0,
['name','DELIV_DATE','sqKm'],
false
);
I have to add something like this:
return GroupBy(fs, [Trim(Split( 'name', '_')[-1])], [
{name: 'total_cites', expression: Trim(Split( 'name', '_')[-1]), statistic: 'COUNT' }
]);
Or not really.
cheers
PS
You're on the right track, but the expression part of GroupBy needs to be SQL, not Arcade. Will there ever be more than 1 underscore in the name field?
Hi there, just to add up... Wouldn't it be easier to add a new field, calculate (aka clean it up) with the Trim/Split functions and then just apply GroupBy function in Dashboard's new expression Arcade console?
Regards,
Note that to use GroupBy, Distinct, Filter, etc., you are using SQL, just sort of "inside" of Arcade.
I'll assume that there's only a single underscore in the field. Try this:
var fs = FeatureSetByPortalItem(
Portal('https://xxxxx.maps.arcgis.com'),
'a73a2a04e8b24aa7a5a514193a3057a0',
0,
['name','DELIV_DATE','sqKm'],
false
);
var name_sql = `SUBSTRING(
name,
POSITION('_', name) + 1,
CHAR_LENGTH(name) - POSITION('_', name)
)`
return Distinct(
fs,
[
{name: 'DELIV_DATE', expression: 'DELIV_DATE'},
{name: 'sqKm', expression: 'sqKm'},
{name: 'name_cleaned', expression: name_sql}
]
)
If you went the Arcade-only route, it would look like this:
var fs = FeatureSetByPortalItem(
Portal('https://xxxxx.maps.arcgis.com'),
'a73a2a04e8b24aa7a5a514193a3057a0',
0,
['name','DELIV_DATE','sqKm'],
false
);
var out_dict = {
fields: [
{name: 'DELIV_DATE', type: 'esriFieldTypeDate'},
{name: 'sqKm', type: 'esriFieldTypeInteger'},
{name: 'name', type: 'esriFieldTypeString'}
],
geometryType: '',
features: []
}
for (var f in fs) {
var clean_name = Trim(Split(f['name'], '_')[-1])
Push(
out_dict['features'],
{
attributes: {
name: clean_name,
sqKm: f['sqKm'],
DELIV_DATE: f['DELIV_DATE']
}
}
)
}
return FeatureSet(Text(out_dict))
But keep in mind that this option will be slower, especially if there are a large number of features in the layer.
Hi,
Just tried both parts. Not a good result.
"Feature layer must be created with either a url or a source"
Sadly today this is the max I can do it... Something urgent come in. Tomorrow I will try to understand the error.
thx for the support
cheers
Pedro
Hi it works, more or less.
indeed it retrieves the fields, but for some reason the DELIV_DATE is empty (in the original table is filled and it is a date field).
I also had to add an extra field named local_type with this domains: City, Town, Village, Hamlet. Because I just want to show the Cities and filter the others out. And I was hoping to use the "filter" tool in the "list" configurator for it, but this field also appears empty. I have add the next line but maybe should be something else because it is a domain field?:
{name: 'local_type', type: 'esriFieldTypeString'}
cheers
PS
Ah, right. In Data Expressions, dates are handled funny. Try
DELIV_DATE: Number(f['DELIV_DATE'])
instead. That should bring the correct date values into the output.
For the other field, it really depends on what the domain is, whether the codes are truly strings, etc. But if you just want to filter the data on the way in, you can wrap the initial FeatureSet function in a Filter:
var fs = Filter(
FeatureSetByPortalItem(...),
"local_type = 'some value'"
)
Just replace 'some value' with the appropriate code for that field.