ArcGIS Online
Uitbreiden van pop-ups met informatie uit andere feature layers met Arcade FeatureSets
Meestal wordt een pop-up in een web map gemaakt om de attribuut informatie van de desbetreffende feature in de feature layer weer te geven. Het is echter ook mogelijk om de waarde van die feature te vergelijken met waardes van andere features binnen diezelfde feature layer, of met informatie van andere feature layers zoals bijvoorbeeld het aantal bomen dat binnen een gemeente groeit of de top 5 van de grootste buurten binnen die gemeente.
Dit kan met de FeatureSets functie van Arcade. Met een FeatureSet wordt een verbinding gemaakt met features in feature layers binnen de web map of zelfs daarbuiten. Hierbij is het niet nodig om eerst een analyse uit te voeren zoals een overlay of een join.
De beste manier om de kracht van FeatureSets te beschrijven is aan de hand van een aantal voorbeelden. Hierbij wordt gebruik gemaakt van de volgende lagen:
- Gemeentegrenzen 2020
- Buurten 2020 – CBS Wijk- en Buurtkaart – Buurten
- BRT TOP10NL – inrichtingselement punt
Deze zijn openbaar en toegankelijk voor iedereen en te vinden op ArcGIS Online.
Bij het eerste voorbeeld wordt een FeatureSet aangemaakt om de waarde van een feature te kunnen vergelijken met de andere features binnen diezelfde feature layer. Het tweede voorbeeld gaat over een geografische overlap met de features uit een andere feature layer binnen de web map. Het derde voorbeeld maakt een overlay op basis van attribuutwaardes en maakt een selectie van de individuele features. Bij het vierde voorbeeld wordt gebruik gemaakt van informatie uit een feature layer van ArcGIS Online, die niet in de web map staat.
1. Een Arcade expressie maken die ook informatie weergeeft van andere features binnen dezelfde feature layer
Een voorbeeld hiervan is het berekenen van het percentage van de oppervlakte van een feature in vergelijking met het oppervlak van de hele feature layer.
Volg deze stappen:
Voeg de Gemeentegrenzen toe aan een Web Map > kies Pop-up configureren > kies bij Attribuutexpressies ‘TOEVOEGEN’.
Definieer eerst de FeatureSet: FeatureSetByName( map, title, fieldList?, includeGeometry? ).
Dit is eenvoudig als volgt toe te voegen: klik op de pijl achter ‘Webmap: ArcadeFeatureSets’ > kies de juiste kaart laag.


var oppervlak = FeatureSetByName($map,"Gemeentegrenzen 2020")
Bereken het totale oppervlak:
var totOppervlak = sum(oppervlak, "Shape__Area")
Bereken het percentage van het oppervlak van de huidige feature:
var percentage = $feature.Shape__Area / totOppervlak * 100
Maak hier een mooie tekst van door het percentage af te ronden op twee cijfers achter de komma en het % teken toe te voegen:
var percentageTekst = round(percentage, 2) + " %"
return percentageTekst
Tip: standaard heet de expressie ‘Aangepast’. Verander deze naam door op ‘Bewerken’ te klikken, zo is de expressie makkelijker terug te vinden.
Test de pop-up door op ‘Test’ te klikken:

Nu kan de expressie toegevoegd worden aan de pop-up. Ga naar ‘Content pop-up’ > kies bij weergave voor ‘Een aangepaste attribuutweergave’ > kies ‘CONFIGUREREN’.

Voeg nu tekst toe aan het pop-up venster. Door op de ‘+’ achter ‘Grootte’ te klikken kun je eenvoudig attributen toevoegen, waaronder de nieuwe expressie:

Let op: sla zowel de pop-up op als de web map. De pop-up wordt namelijk opgeslagen in de web map. Dit geldt ook voor de expressies die je maakt.

Het laden van deze pop-up duurt vrij lang. Door de functies te combineren zal de query sneller verlopen. De expressie wordt dan als volgt:

Tip: In bovenstaand voorbeeld wordt FeatureSetByName gebruikt. Verwacht je dat de naam van de FeatureSet verandert, maak dan gebruik van FeatureSetById.
2. Een Arcade expressie maken die gebruik maakt van andere feature layers binnen dezelfde web map
Een voorbeeld hiervan is het berekenen van het aantal bomen uit de BRT Top10NL laag die binnen een gemeente vallen.
Volg deze stappen:
Kies Pop-up configureren > kies ‘TOEVOEGEN’ bij Attribuutexpressies.
Definieer eerst de FeatureSet:
var punten = FeatureSetByName($map,"BRT TOP10NL - inrichtingselement punt")
Filter de FeatureSet zodat alleen de bomen geselecteerd worden:
var bomen = Filter(punten,"TYPEINRICHTINGSELEMENT = 'boom'")
Maak met behulp van Intersects() een selectie van de bomen die binnen een feature vallen en bereken hoeveel dat er zijn met Count():
var aantalBomen = Count(Intersects(bomen, $feature))
return aantalBomen

Ook hierbij geldt dat de query sneller gaat wanneer de functies gecombineerd worden:

Voeg vervolgens de expressie toe aan de pop-up:

Het resultaat op de kaart:

Zoals je ziet staan er standaard twee cijfers achter de komma. Dat is niet gewenst. Dit kan als volgt aangepast worden:
1. Kies ‘Pop-up configureren’
2. Kies bij Weergave voor ‘Een lijst van veldattributen’ en klik op ‘Attributen configureren’
3. Selecteer de expressie, zet bij ‘Opmaken’ het aantal decimalen op 0 en kies OK:

Nu staat het getal wel goed:

3. Een Arcade expressie maken die door de afzonderlijke features van een andere feature layer loopt
Een voorbeeld hiervan is een lijst van de vijf grootste buurten die binnen een gemeente liggen.
Volg deze stappen:
Kies ‘Pop-up configureren’ > kies ‘TOEVOEGEN’ bij Attribuutexpressies.
Definieer eerst de FeatureSet:
var buurten = FeatureSetByName($map,"Buurten 2020 - CBS Wijk- en Buurtkaart - Buurten")
Selecteer met Filter() de buurten die binnen een gemeente vallen, zet die op aflopende volgorde van het aantal inwoners en neem daar de bovenste vijf features van:
var gemeente = $feature.Gemeentenaam
var top5BuurtNamen = Top(OrderBy(Filter(buurten, 'gm_naam = @gemeente'), 'aant_inw DESC'),5)
Loop door die vijf features heen en voeg die namen toe aan een variabele:
var popupResult = ''
for (var f in top5BuurtNamen) {
popupResult += f.bu_naam + TextFormatting.NewLine
}
return Proper(popupResult)


Het resultaat in de kaart:

4. Een Arcade expressie maken die gegevens uit een feature layer haalt die niet in de web map staat
Het is niet nodig dat de laag die je wilt raadplegen in de web map staat. Er is namelijk nog een manier om een FeatureSet op te vragen:
FeatureSetByPortalItem( portal, itemId, layerId, fieldList?, includeGeometry? )
Een voorbeeld hiervan is het berekenen van het aantal inwoners van een gemeente aan de hand van de CBS Wijk- en Buurtkaart layer, zonder dat die service in de web map aanwezig is.
Hiervoor is het nodig om de layerId te achterhalen. Dit is het ID dat in de URL van de laag zit. De CBS Wijk- en Buurtkaart is te vinden op: https://www.arcgis.com/home/item.html?id=8fb37017cbc4499c8d17658c32893f2f, het itemId is dus 8fb37017cbc4499c8d17658c32893f2f.
Om de snelheid zo hoog mogelijk te houden, filteren we op de gemeentenaam en vragen we alleen het inwonertal (aant_inw) op:
var gemnaam = $feature.Gemeentenaam
var test = Filter(FeatureSetByPortalItem(Portal("https://www.arcgis.com"), "8fb37017cbc4499c8d17658c32893f2f", 0, ['aant_inw']), "gm_naam = @gemnaam")
Daarna wordt de som van het aantal inwoners berekend:
return sum(test, "aant_inw")

Tip: Gebruik ‘@’ om een variabele te gebruiken binnen de FeatureSet functie.
Deze waarde heeft in de pop-up weer automatisch twee decimalen, dus die moet op dezelfde wijze worden aangepast als bij het aantal bomen.

Het resultaat:

Interessante links
De formules die gebruikt zijn in de voorbeelden zijn hier terug te vinden: Arcade Function Reference, https://developers.arcgis.com/arcade/function-reference/.
Om meer te leren over het verbeteren van de snelheid van ingewikkelde expressies, zie: What’s new with Arcade: Taking a stroll through FeatureSets (Part 2), https://www.esri.com/arcgis-blog/products/arcgis-online/mapping/whats-new-with-arcade-taking-a-stroll-through-featuresets-part-2/