Een vereiste in kaarten is vaak dat features van een laag met verschillende symbolen moeten worden weergegeven om ze visueel van elkaar te kunnen onderscheiden. Bijvoorbeeld in een laag met boomfeatures. Als er niets anders wordt geconfigureerd, hebben de bomen op de kaart altijd hetzelfde symbool. Met de Unique Value Symbology kan de laag echter zo worden aangepast dat bijvoorbeeld voor elk boomtype een eigen symbool wordt weergegeven, zie de volgende afbeelding:
Unique Value Symbology
Dit is de aanbevolen oplossing als er niet al te veel onderscheidingen (permutaties) zijn. Maar wat als het aantal in de honderden/duizenden loopt en mogelijk ook complexe symbolen nodig zijn?
Vanaf dat punt moet worden nagedacht over het gebruik van Dictionary Symbology. Het meest prominente voorbeeld hiervan zijn zeker de Military Symbology Styles met duizenden verschillende en ook deels zeer complexe symbolen die in het militaire domein voor tactische kaarten nodig zijn.
Dictionary Symbology – Military Symbology Styles
Om het meteen duidelijk te maken, lagen met Dictionary Symbology kunnen niet in de legenda van de kaart worden weergegeven, zoals bijvoorbeeld in de screenshot van Unique Value Symbology hierboven. Een legenda met honderden symbolen zou ook weinig zinvol zijn.
De Dictionary Symbology Style
Met Dictionary Symbology Styles worden symbolen op basis van invoerwaarden dynamisch tijdens runtime gegenereerd. Er zijn verschillende style-types, in deze blog wordt alles hierna gerelateerd aan Mobile Styles en Web Styles. In een style kunnen symbolen voor verschillende geometrieën (punt, lijn, polygoon) zitten. De invoerwaarden zijn typisch attribuutinformatie van de features die het overeenkomstige symbool op de kaart moeten krijgen. Dit betekent dat een style vooraf moet worden gemaakt met alle benodigde componenten, toepassingslogica en configuratiemogelijkheden. Hoe dit kan worden gerealiseerd, wordt mooi beschreven in deze ArcGIS Blog.
Het resultaat is een Mobile Style, dat is een SQLite-database met de bestandsnaamextensie .stylx. Deze kan zoals hij is direct offline gebruikt worden in ArcGIS Pro en in de ArcGIS Maps SDKs for native (ook wel ArcGIS Runtime genoemd), maar ook als Web Style Service gepubliceerd en daarmee zowel in desktop-apps als in webapplicaties gebruikt worden.
Dat was de theorie. Om een beter begrip van Dictionary Symbology te krijgen is het zoals bij alles zinvol om het eens praktisch door te spelen. Hiervoor heb ik de Mobile Style voor restaurants van de auteur van de eerder genoemde ArcGIS Blog iets aangepast en beschikbaar gesteld:
Onze Restaurant Mobile Style genereert attribuutgebaseerde complexe symbolen waarmee in één oogopslag de naam, het restauranttype (hier pizzeria), de beoordeling, de openingstijden en nog veel meer zichtbaar zijn zonder daarvoor extra een popup te hoeven openen.
Componenten van een restaurant-symbool
Een Mobile Style maken of aanpassen
Mobile Styles worden nieuw aangemaakt in ArcGIS Pro. Bestaande kunnen ook als template voor nieuwe styles worden gebruikt omdat ze qua structuur identiek zijn. Mobile Styles kunnen natuurlijk ook aangepast worden. Hiervoor is ArcGIS Pro nodig voor het maken/aanpassen van grafische en tekstcomponenten van symbolen, evenals een SQLite DB-editor (bijvoorbeeld de DB Browser for SQLite) voor toepassingslogica en configuraties van de style.
In ArcGIS Pro hoeft de Restaurant Mobile Style alleen per drag & drop naar de catalogus te worden gesleept, dan wordt hij onder Styles meegeteld. Met rechtsklikken daarop verschijnt de optie om styles te beheren. Na dubbelklikken op de Restaurant Style in het beheer venster kunnen bestaande componenten aangepast en nieuwe gemaakt worden.
Na openen van de style in een SQLite DB-editor bevinden zich aanpassingsmogelijkheden in de tabel meta. Daaronder bij dictionary_configuration staan configuraties, in onze style alleen de optie om het tonen/verbergen van de naam van het restaurant in het symbool aan of uit te zetten. En onder dictionary_script staat toepassingslogica als een ArcGIS Arcade-script, in ons geval onder andere de berekening van stercomponenten op basis van rating-invoerwaarden.
Een Web Style Service publiceren
Mobile Styles kunnen met ArcGIS Pro gepubliceerd worden naar ArcGIS Online en ArcGIS Enterprise. Klik hiervoor gewoon met rechts op de gewenste style in ArcGIS Pro catalogus en kies Share as Web Style. Ik heb dit al voorbereid, maar iedereen kan vanuit de Restaurant Mobile Style zijn eigen Web Style Service publiceren. Bij publicatie wordt een structuur gemaakt uit meerdere JSON-bestanden die alle info over de style bevatten en via URL toegankelijk zijn. Een Web Style gebruikt dus niet op enige manier achterliggend de Mobile Style.
Hier nog een kleine tip: Web Styles kunnen ook op een eigen webserver gehost worden. Download hiervoor eenvoudig met de AGOL Assistant alle JSON-bestanden met Download All (klik op de drie puntjes bij het style-item en kies View Item Resources) en publiceer vervolgens deze uitgepakte structuur zoals hij is. Waarschijnlijk zijn er nog enkele webserver-zijde instellingen nodig voor toegang.
Gebruik van Dictionary Symbology in ArcGIS Pro
In ArcGIS Pro kunnen lagen zowel Mobile Styles als Web Styles gebruiken voor symbologie. Voor onze restaurants zouden dat onderstaande stappen zijn:
- Eén map toevoegen
- De Restaurant-FeatureService in het Ribbon-item Gegevens toevoegen met Data from Path als laag toevoegen
- Rechtermuisknop op de laag en Symbology kiezen
- In het Symbology-menu onder Primary Symbology Dictionary kiezen
- In het dropdownmenu More de optie Add dictionary aanklikken
- Hier kan ofwel de Restaurant Mobile Style van het bestandssysteem of de Web Style (onder Portal/ArcGIS Online zoeken naar de Web Style-naam of ID) geselecteerd worden
- Onder Symbology Fields en Text Fields kunnen de juiste veldnamen van de feature-attributen worden opgegeven, als deze anders zijn dan de gedefinieerde style-invoervelden. In ons geval kan alles blijven zoals het is.
- Indien gewenst de configuratie aanpassen (tekst aan/uit)
- Klaar
Dictionary Symbology in ArcGIS Pro
Gebruik van Dictionary Symbology in ArcGIS Maps SDKs for native
In alle ArcGIS Maps SDKs for native kunnen, net als in ArcGIS Pro, voor lagen zowel Mobile Styles als Web Styles voor de symbologie worden gebruikt. Voor onze restaurants zijn er passende voorbeelden in de documentatie, hier bijvoorbeeld voor .NET. De code kan volledig worden overgenomen, alleen de paden/ID's naar onze eigen styles moeten mogelijk worden aangepast. In de voorbeeldviewers van de respectievelijke SDK's kunnen jullie het ook live uitproberen. Deze viewer is beschikbaar in de betreffende app stores (Microsoft, Apple, Google, zoek daar naar ArcGIS Samples) en voor Java en Qt om te downloaden. Ons voorbeeld heet overal Custom dictionary style.
Dictionary Symbology in ArcGIS Maps SDKs for native
De methoden om de feature-attribuutveldnaam te overschrijven als deze niet passen, of om de configuratie (tekst aan/uit) in te stellen, worden elk beschreven in de documentatie van het betreffende SDK, hier bijvoorbeeld ook weer voor .NET.
Interessant is ook de mogelijkheid om symbolen uit de style direct zonder kaart op te vragen. Dat zou de oplossing zijn voor bijvoorbeeld symbolen voor "enkele graphics" in GraphicsOverlays zonder renderer, eigen symbol pickers om te bewerken of om symbol images buiten het kaartcontrol te gebruiken in tabellen of op knoppen. Hoe dat werkt wordt ook beschreven in de documentatie, hier voor .NET. De images voor gebruik buiten het kaartcontrol kunnen vervolgens met de methoden Symbol.CreateSwatchAsync() en RuntimeImageExtensions.ToImageSourceAsync() worden gegenereerd.
Gebruik van Dictionary Symbology in ArcGIS Maps SDKs for JavaScript
Voor Dictionary Symbology in webapplicaties kunnen alleen Web Styles worden gebruikt. Met het ArcGIS Maps SDKs for JavaScript kan in principe hetzelfde gedaan worden als in de native SDK's. Ik heb voor het gemak de JS-code voor ons restaurantvoorbeeld gepubliceerd op CodePen.
Dictionary Symbology in ArcGIS Maps SDKs for JavaScript
Ook met het ArcGIS Maps SDKs for JavaScript kunnen symbolen van de style voor "enkel gebruik" in GraphicsLayer of voor gebruik als images buiten de kaart in andere controls worden opgevraagd. Hiervoor heb ik ook een klein voorbeeld op CodePen beschikbaar gesteld. De truc is hier om aan de DictionaryRenderer met de methode GetSymbolAsync() een Graphic te geven die alleen een attributentabel heeft. Deze geeft het overeenkomstige symbool terug, dat ofwel als symbool van een nieuwe Graphic in GraphicsLayer kan worden gebruikt of ook als image buiten de kaart met behulp van methoden van het symbolUtils-object.
Als jullie vragen of suggesties over dit onderwerp hebben, gebruik dan gewoon de commentaarfunctie. Anders wensen wij veel plezier en succes met uitproberen!