Mit den kürzlich eingeführten „Berechnete Ausdrücke“ kann die Datenerfassung in ArcGIS Field Maps um einiges vereinfacht und beschleunigt werden. Der Blogbeitrag gibt Ihnen eine kurze Einführung.
Berechnete Ausdrücke in ArcGIS Field Maps (verfügbar seit dem Release im März 2022) vereinfachen alle Arten von Datenerfassungs-Workflows: von der Speicherung des Standorts auch als Attribut bis zum Abrufen von Attributen aus Relationen oder aus anderen Layern in der Karte.
In diesem Blogbeitrag sehen wir uns einige der häufigsten Anwendungsfälle an und stellen Beispielcode zur Verfügung, damit Sie mit berechneten Ausdrücken in Ihren eigenen Formularen loslegen können.
Berechnete Ausdrücke nutzen die Skriptsprache Arcade. Wenn Sie diese produktübergreifende Skriptsprache in ArcGIS noch nicht kennen, können Sie die wichtigsten Infos in dieser Dokumentation nachlesen oder im Playground mit Beispielen erste Erfahrungen sammeln.
Wie das mit den Berechneten Ausdrücken Schritt-für-Schritt in ArcGIS Field Maps funktioniert, ist im Kaptitel ‚Hinzufügen von berechneten Ausdrücken‘ der Hilfe beschrieben.
Ein Attribut aus einem darunterliegenden Polygon holen
Manchmal kann es nützlich sein, das geografische Gebiet zu speichern, in dem ein anderes Feature erfasst wird. Bisher konnte dies manuell durch Auswahl der Region aus einer Liste von Werten oder durch Nachbearbeitung der Daten erfolgen.
Jetzt kann dies direkt und automatisch vor Ort erfasst werden, indem eine Formularberechnung verwendet wird, die eine räumliche Überschneidung des aktuellen Standorts (bzw. des neu erfassten Features) und einem Polygon-Layer durchführt.
Beispiel: Ich erfasse Vogelbeobachtungen und möchte automatisch die Region speichern, in der ich mich befinde.
// Create a feature set using the 'Regions' layer in the map
var regions = FeatureSetByName($map, 'Regions', ['name'])
// Intersect the current location with the regions and
// get the first region
var region = First(Intersects($feature, regions))
// If the current location does intersect a feature,
// return the name of the region. Otherwise, return null
if (!IsEmpty(region)) {
return region['name']
} else {
return null
}
Abrufen eines Attributes aus einem Datensatz mit Relation
Bei der Durchführung von Inspektionen ist es oft notwendig, Informationen über das übergeordnete Feature zu speichern, wie z. B. die Adresse oder die Art des Assets. Diese Attribute können aus dem übergeordneten Layer abgerufen werden, indem die Relation abgefragt und auf die erforderlichen Attribute zugegriffen wird.
Beispiel: Ich inspiziere Hydranten und muss bei jeder Inspektion die Anlagen-ID aufzeichnen.
// Get the feature set for the hydrants
var hydrants = FeatureSetByRelationshipName($feature, 'wHydrant', ['facilityid'], true)
// Get the first hydrant (should only be one)
var hydrant = First(hydrants)
// If there was a hydrant, return the facilityid of it,
// Otherwise, return null
if (!IsEmpty(hydrant)) {
return hydrant['facilityid']
} else {
return null
}
Hinweis: In Version 22.2 von Field Maps funktioniert dies nicht mit Flächen, die Offline genommen wurden.
Name des Benutzers, Mail Adresse oder Username speichern
Bei der Durchführung von Inspektionen oder der Erfassung neuer Daten eignet sich das Editor-Tracking hervorragend, um den Benutzernamen der Person zu speichern, die das Feature erstellt oder bearbeitet hat, aber es speichert nicht den vollständigen Namen oder die E-Mail-Adresse des Benutzers. Mit diesen zusätzlichen Attributen lassen sich die Daten bei der Anzeige in Berichten, Karten und Dashboards viel leichter verstehen. Dies kann erreicht werden, indem man die Daten des angemeldeten Benutzers über Arcade abruft.
Das Editor-Tracking ist eine Eigenschaft des Layers und wird vom Service Eigentümer ein- oder ausgeschaltet.
Beispiel: Ich fülle einen Bericht aus und muss meinen Namen angeben.
GetUser(FeatureSetByName($map, 'Hydrant Maintenance Inspection')).fullName
Hinweis: In Version 22.2 von Field Maps funktioniert dies nicht mit Flächen, die Offline genommen wurden.
Aktuelles Datum und Uhrzeit berechnen
Bei der Durchführung von Inspektionen ist es oft nützlich, das Inspektionsdatum auf das aktuelle Datum und Uhrzeit zu setzen. Während der Nutzer dies in der mobilen App mit ein paar Klicks tun kann, ist es eventuell effizienter, diese Informationen mithilfe eines Arcade-Ausdrucks automatisch auszufüllen.
Beispiel: Ich fülle einen Bericht aus und muss das Inspektionsdatum festlegen.
Die Geometrie als ein Attribut speichern
Bei der Integration mit anderen Systemen kann es sinnvoll sein, die x-, y-, z- oder m-Werte als separate Attribute zu speichern. Dies kann durch den Zugriff auf die Geometrie des Features über Arcade erfolgen.
Beispiel: Ich muss die x- und y-Positionen als separate Attribute speichern, damit ich sie in ein anderes System importieren kann, ohne sie nachbearbeiten zu müssen.
/ Get the X value
var geom = Geometry($feature)
if (IsEmpty(geom)) {
return null
} else {
return geom.X
}
Manchmal sind die rohen x- und y-Werte nicht das, was Sie brauchen. Sie benötigen vielleicht den Breiten- und Längengrad. Wenn Ihre Karte und Ihre Daten die Web-Mercator-Projektion verwenden, können Sie einen Code schreiben, um den Breiten- und Längengrad zu berechnen.
Beispiel: Ich muss die Werte für Breiten- und Längengrad speichern, um die Spezifikation einer Drittanwendung zu erfüllen, die auf die Tabellen im Backend zugreift.
// Create a function to convert meters to lat, long
// Source: http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/
function MetersToLatLon(geometry) {
if (IsEmpty(geometry)) {
return [null, null]
}
var originShift = 2.0 * PI * 6378137.0 / 2.0
var lon = (geometry.x / originShift) * 180.0
var lat = (geometry.y / originShift) * 180.0
lat = 180.0 / PI * (2.0 * Atan( Exp( lat * PI / 180.0)) - PI / 2.0)
return [Round(lat, 6), Round(lon, 6)]
}
// Call the function and return the latitude or longitude value
MetersToLatLon(Geometry($feature))[0]
Den Wert eines Feldes aus anderen Feldern berechnen
Oft kann es sinnvoll sein, einen Wert auf der Grundlage eines oder mehrerer Felder zu berechnen.
Beispiel: Ich muss die Punktzahl berechnen, wenn ich einen Bericht zur Schadensbewertung erstelle. Bestimmte Dinge z. B. das Dach, das Fundament und die Bewohnbarkeit werden auf der Grundlage ihrer Schadenshöhe bewertet. Ich muss all diese unabhängigen Bewertungen zu einem einzigen Wert summieren, der für die Filterung und Visualisierung verwendet werden kann.
$feature["foundation_condition"] + $feature["roof_condition"] + $feature["habitability"]
Informationen können über einen QR-Code in ein Feld eingelesen werden. Oft ist es sinnvoller, diese Informationen aufzutrennen und in separate Felder zu speichern.
Beispiel: Ich möchte die Informationen aus einem Barcode-Scan in passende Felder auftrennen und speichern:
//Liest den Inhalt des Feldes [Code] ein und splittet anhand des Trennzeichens |
//die Inhalte in einen Array auf. Die Variable [Code] enthält den gesamten Inhalt
//des QR-Codes
var QRcode=$feature.Code;
var content = Split(QRCode, ‚|‘, -1,false)
//Rückgabe des Wertes im ersten Feld des Array
return content[0]
Das gesamte Beispiel für den QR-Code gibt es in diesem Blogbeitrag: ArcGIS Field Maps: QR-Codes und Arcade
Zusammenfassung
Wir haben hier einige Beispiele gezeigt, aber es gibt noch so viel mehr, was Siemit Arcade und Formularberechnungen machen können.
Die Berechneten Ausdrücke sind in Kombination mit den Smartforms von ArcGIS Field Maps der beste Weg, die Erfassung von Informationen leicht und schnell zu gestalten und an die Anforderungen des eigenen Datenmodells und Workflows anzupassen.
Der Artikel basiert auf dem englischsprachigen Blog-Artikel: Common calculated expressions for ArcGIS Field Maps