Wie können wir sicherstellen, dass bei der mobilen Datenerfassung Informationen direkt fehlerlos aufgenommen werden? In ArcGIS Online bieten Field Maps Forms auf Basis von Arcade smarte Möglichkeiten, Informationsprüfungen durchzuführen und so die Zuverlässigkeit unserer Daten zu gewährleisten. In Teil 2 beleuchten wir die Look-Up-Tabelle.
Beitrag von Ilka Pleiser und Florian Artelt
Mobile GIS-Workflows lassen sich mit Apps von Esri, zum Beispiel ArcGIS Survey123 oder ArcGIS Field Maps, wunderbar planen und verwirklichen. Gerade wenn es sich um viele Kolleginnen und Kollegen im Außendienst handelt und die Aufnahmerate hoch ist, empfiehlt es sich, bereits während der Aufnahme Qualitäts- und Datenmanagement zu betreiben.
Vor einigen Monaten haben wir bereits gelernt, wie wir bei der mobilen Datenerfassung sicherstellen können, dass Informationen direkt fehlerlos aufgenommen werden. Konkretes Ziel war es, zu überprüfen, ob der Field Maps-Nutzende dazu berechtigt ist, Daten im ausgewählten Gebiet aufzunehmen.
Wenn er oder sie für das entsprechende Gebiet berechtigt ist, kann die Datenaufnahme und -übermittlung problemlos erfolgen. Wenn für das Gebiet keine Berechtigung vorliegt, wird eine Fehlermeldung geworfen und die Datenaufnahme und -übermittlung verhindert.
In dem voran gegangenen Blogartikel wurde dieses Szenario mit Hilfe eines Hilfsfeldes in der Polygon-Featureklasse umgesetzt.
In diesem Blogartikel wollen wir uns denselben Anwendungsfall, jedoch einen anderen Lösungsansatz ansehen – den der Look-Up-Tabelle.
Das Beispiel
Zur Erinnerung hier noch einmal der Anwendungsfall:
Jägerinnen und Jäger melden über ArcGIS Field Maps die Erlegung eines Tiers. Neben Informationen zum Tier selbst (Wildart, Alter und Gewicht) wird auch der Standort angegeben, an dem das Tier geschossen wurde. Da nicht jeder Jäger oder jede Jägerin in jedem Jagdgebiet arbeiten darf, wollen wir über den ArcGIS Field Maps Web Designer eine Einschränkung formulieren, die das Absenden eines Punktes verbietet, falls er in einem Bereich aufgenommen wurde, für den keine Berechtigung vorliegt.
Umsetzung mit der Look-Up-Tabelle
Wir arbeiten auch hier mit zwei Layern: Einem Polygon-Layer, der die Jagdgebiete darstellt, und einem Punkt-Layer, in den bei der Aufnahme durch Field Maps die Abschüsse geschrieben werden. Ersterer enthält ein Feld „Lfd_Nr“, das jeder Fläche eine ID zuweist.
Zusätzlich brauchen wir eine Tabelle, die als gehostete Tabelle ebenfalls in unseren Inhalten liegt. In dieser gibt es lediglich die Spalte Name, für den Namen der Jägerin oder des Jägers, und die Spalte „Lfd_Nr“, die jeder Person die Gebiete zuordnet, für die sie berechtigt ist.

Automatische Feldberechnung
Der Punkt-Layer enthält, neben Attributen, die von den Jagenden aufgenommen werden, auch Felder, die beim Setzen eines Punktes automatisch berechnet werden (z. B. das Datum und die Uhrzeit). Diese Möglichkeit der automatischen Feldberechnung nutzen wir für unsere Limitierung:
Unser Ziel ist, dass das Feld „Name“ automatisch mit dem Namen des angemeldeten Nutzers befüllt wird, sofern dieser für das Gebiet, in dem der Punkt aufgenommen wurde, berechtigt ist. Nur wenn dies der Fall und das Feld mit dem Namen des Jagenden befüllt ist, sollen die erforderlichen Aufnahmefelder sichtbar werden, die sich auf das Tier beziehen.
Dazu werden beide Layer in eine Karte geladen, welche dann im Field Maps Designer ausgewählt wird. Unter dem Punkt-Layer werden alle Attribute in das Formular eingeladen. Die Attribute, die für die Berechnung vorgesehen sind, werden auf Read-only gesetzt. Wählt man das Feld Name aus, kann in dem Fenster auf der rechten Seite ein berechneter Ausdruck hinzugefügt werden.
Die Tabelle selbst muss nicht in der Karte enthalten sein, da sie für den Endnutzer uninteressant ist, und wir auch auf anderem Wege auf ihren Inhalt zugreifen können.

Der Arcade-Ausdrucks-Editor öffnet sich. Es empfiehlt sich, jeder Berechnung einen Namen zu geben, da alle Berechnungen mehrfach in einem Formular verwendet werden können und so leichter Überblick verschafft werden kann.
Überprüfung in 3 Schritten
Unsere Überprüfung besteht nun aus drei groben Schritten:
- Schritt 1: Prüfen, welcher Nutzende gerade einen Punkt in Field Maps aufnehmen möchte.
- Schritt 2: Herausfinden, in welcher Fläche der Punkt aufgenommen werden soll.
- Schritt 3: In unserer Look-Up-Tabelle nach einer Zeile suchen, die die Kombination aus Nutzendem und Flächen-ID liefert.
In Arcade umgesetzt könnten die drei Schritte dann wie folgt aussehen:
var p = 'https://arcgis.com'
// Zugriff auf gehostete Tabelle
var hostedTable = '50ebc76423004715ad28a37288c49e8d'
// Username des Bearbeiters
var username = GetUser(Portal(p)).fullName
// Point in Polygon: LFD_Nr des unterliegenden Polygons ziehen
// Zugriff auf den Polygonlayer der Jagdgebiete, Feld LFD_NR
var jagdgebiete = FeatureSetByName($map, 'Jagdgebiete', ['Lfd_Nr'])
// Intersect: Der aktuelle Standort mit den Jagdgebieten; man erhält das erste Gebiet
var schnitt = Intersects($feature, jagdgebiete)
var schnitt_count = Count(Intersects($feature, jagdgebiete))
var fehlermeldung = "Aufnahme nicht möglich"
// Wenn kein Polygon geschnitten wurde, gib null zurück
if (schnitt_count < 1){
return fehlermeldung
}
// Wenn eins oder mehrere Polygone geschnitten wurden,...
else{
// gehe jedes Polygon durch, ...
for (var poly in schnitt){
// ziehe die laufende Nummer des Polygons, ...
var lfd_nr = poly['Lfd_Nr']
// SQL für den Filter
var sql = 'LfdNR = @lfd_nr'
//Zugriff auf Tabelle
var lut = FeatureSetByPortalItem(portal(p), hostedTable,0, ['*'], false)
// filtere die Look-Up-Tabelle nach der aktuellen laufenden Nummer
var filt_lut = Filter(lut, sql)
// Username mit gehosteter Tabelle abgleichen
// Gibt es eine Zeile mit entsprechendem Gebiet und Username?
// Falls die Tabelle look_up_table genau einen Eintrag hat, überprüfe diesen einen Eintrag
if(count(filt_lut) > 0){
// Falls die Tabelle look_up_table mehr als einen Eintrag hat, gehe durch die For-Schleife und überprüfe die Einträge auf Matches
for (var index in filt_lut){
if (index.Name == username){
// Falls ja, befülle das Feld Erleger:in mit dem Username des Bearbeiters
return username
}
else{
return fehlermeldung
}
}
}
// Falls die Tabelle look_up_table keine Einträge hat, gib null zurück
else{
return fehlermeldung
}
}
}
GetUser()
Durch GetUser() wird der volle Name der Person, die über Field Maps angemeldet ist, gezogen. Über eine Intersects-Funktion wird geprüft, ob der gesetzte Punkt des Users in einem Jagdgebiet befindet. Tut er dies nicht (schnitt_count < 1), wird die zuvor definierte Fehlermeldung in das Feld Name in der Field Maps-App angezeigt. Befindet sich der User jedoch in einem Jagdgebiet (else{…), wird die gehostete Tabelle nach der ID des Jagdgebietes gefiltert.
- Wenn Zeilen mit der entsprechenden laufenden Nummer gefunden wurden, wird überprüft ob, eine der Zeilen den Namen der angemeldeten Person mitführt.
- Wird eine Zeile gefunden, in der sowohl laufende Nummer als auch angemeldete Person enthalten sind, wird der Name der angemeldeten Person in das Namensfeld in Field Maps geschrieben.
- Kann keine Zeile gefunden werden, wird wiederum die Fehlermeldung in das Namensfeld in Field Maps geschrieben.
Sichtbarkeitslogik
Den Feldern Tier, Alter und Gewicht wird eine Sichtbarkeitslogik hinterlegt, sodass diese in der App ausschließlich dann erscheinen, wenn das Feld Name den Namen des angemeldeten Nutzers enthält. Zusätzlich sind diese Felder als erforderlich konfiguriert. Das bedeutet, dass sie zum Absenden des Formulars zwingend ausgefüllt sein müssen. Werden die erforderlichen Felder nicht angezeigt, können diese nicht aufgenommen und das Formular kann nicht abgesendet werden.

Screenshot des Formulars in der Field Maps App. Das Feld Name ist mit dem Wert “Aufnahme nicht möglich” gefüllt. Die drei Felder das Tier betreffend sind dementsprechend nicht sichtbar.
Screenshot des Formulars in der Field Maps App. Das Feld Name ist mit dem Namen des Nutzers gefüllt. Die drei Felder das Tier betreffend sind dementsprechend sichtbar.

Zusammenfassung
Ein Vorteil, die Berechtigungen über eine Look-Up-Tabelle zu prüfen, sind sicherlich die einfachen Möglichkeiten, den Tabelleninhalt über ArcGIS Online oder ein Tabellenprogramm anzupassen. Diese Aufgaben können auch Personen übernehmen, die keinen editierenden Zugriff auf den Feature Layer haben dürfen.
Natürlich können Limitierungen von Datenaufnahmen über die verschiedensten Wege erreicht werden. Eine Alternative ist im oben erwähnten Blogartikel beschrieben. Welche Möglichkeiten es zu Limitierungen von Bearbeitungen in ArcGIS Enterprise gibt, erfahren wir im Tipps & Tricks-Beitrag meines Kollegen Florian Artelt.
Viel Spaß und gutes Gelingen beim Ausprobieren von Arcade-Ausdrücken zur Einschränkung von Datenaufnahmen.
Weitere Beiträge unserer Tipps & Tricks-Reihe:
Tipps & Tricks #18: Living Atlas-Abonnenteninhalte in öffentlichen Apps
Tipps & Tricks #19: Attributregeln und Arcade
Tipps & Tricks #20: Smart Forms und Arcade
Alle Beiträge rund um Tipps & Tricks finden Sie hier.