Das Problem
Ich werde hier ein neues Akronym ausprobieren - B2G - Business To GIS - was die Lieferung von extern verwalteten Daten in ArcGIS bedeutet. Es ist sehr üblich, dass externe ("business") Systeme eine REST API anbieten, die Sie aufrufen können, um Daten im gängigen Format wie JSON zu erhalten, aber es ist auch sehr häufig, dass der Server einen Datensatz in mehreren Teilen (d.h. "Seiten") liefert und dass das JSON nicht in einem gut definierten Dialekt wie GeoJSON vorliegt - Sie müssen es in Spalten parsen, möglicherweise aus Struktur- oder Array-Objekten.
Dieser Beitrag handelt davon, die beiden Herausforderungen der Seitennummerierung und des Parsings ohne Programmierung mit ArcGIS Data Interoperability zu meistern.
Meine Fachthemen-Daten sind Federal Communications Commission Kundebeschwerden-Daten über unerwünschte Anrufe, gefiltert für 2024. Wenn Sie sehen möchten, wie es als eingehendes JSON aussieht, klicken Sie hier für 1000 zufällige Datensätze, aber hier ist das Endergebnis als Feature-Service:
FCC Customer Complaints - unwanted calls
Einige Recherchen zeigen, dass es mehrere gängige Ansätze zur Seitennummerierung gibt:
- Offset- und Limit-Parameter definieren die Startzeilenposition und Zeilenzahl und lesen geordnete Daten.
- Dieser Ansatz kann einen weiteren Parameter enthalten, welcher Eigenschaft die Sortierreihenfolge festlegt
- Seitenzahl und (optional) Seitengröße Parameter.
- Abfragebasierte Seitennummerierung, bei der eine Startzeile durch eine logische Abfrage definiert wird, was jede nächste Abfrage impliziert.
- Zeitbasierte Abfrage, ein Spezialfall der abfragebasierten Seitennummerierung.
- Cursor-basierte Seitennummerierung, bei der die API Seitennamen bereitstellt, einschließlich jeder nächsten Seite im Ergebnis.
- Kombinationen der oben genannten.
Die ersten beiden Ansätze sind die einfachsten (und einzigen, die ich verwendet habe), der Server führt die Seitenberechnungen durch und der Client muss nur einen einfachen Zähler führen und Anfragen senden, bis die Daten erschöpft sind.
Hier ist ein Beispiel für eine Offset- und Limit-basierte API und hier ist ein Beispiel für eine seitenbasierte API.
Für ein Beispiel von #6, Kombination von #3 & #4, können Sie sich über Abfragen von gehosteten Feature-Layern informieren. ArcGIS kümmert sich darum, Layer-Abfragen für Sie zu erstellen.
Wie wäre es mit Parsing auch einfach gemacht? Wir müssen Datensätze wie diesen in typisierte Spalten und Geometrie umwandeln!
{
"issue_type" : "Telefon",
"caller_id_number" : "830-210-2001",
"state" : "IL",
"method" : "Kabelgebunden",
"advertiser_business_phone_number" : "Keine",
"issue_time" : "8:41 Uhr",
"issue" : "Unerwünschte Anrufe",
"zip" : "60629",
"type_of_call_or_messge" : "Live-Stimme",
"issue_date" : "2024-01-04T00:00:00.000",
"id" : "3739134",
"location_1" : {
"latitude" : "41.781382",
"human_address" : "{\"address\": \"\", \"city\": \"IL\", \"state\": \"\", \"zip\": \"60629-5219\"}",
"needs_recoding" : false,
"longitude" : "-87.732853"
}
}
Kein Problem! Fangen wir an.
Seitennummerierung
Wir rufen hier eine REST API auf, die eine paginierte Antwort bietet. In ArcGIS Data Interoperability bedeutet das den HTTPCaller-Transformer in einer Schleife aufzurufen, in diesem Fall mit den Parametern offset, limit und order, wobei der Offset-Wert bei jedem Aufruf erhöht wird, bis alle Daten empfangen wurden und die Antwort ein leeres Array ist. Vielleicht wussten Sie nicht, dass Sie in einer visuellen Programmierumgebung schleifen können, aber das können Sie, und es ist einfach. Der mintgrüne benutzerdefinierte Transformer „UnwantedCallsLooper“ oben links in meinem Arbeitsbereich erledigt diese Aufgabe. Es ist ein schleifender benutzerdefinierter Transformer.
Übergeordnete ETL-Arbeitsfläche
Der benutzerdefinierte Transformer ist eingebettet (eingeschlossen) in der Hauptarbeitsfläche und lebt in einem eigenen gleichnamigen Tab. Benutzerdefinierte Transformer erstellen Sie, indem Sie einen oder mehrere gewöhnliche Transformer in der Hauptarbeitsfläche auswählen und dann über ein Kontextmenü per Rechtsklick eine Option zur Erstellung eines benutzerdefinierten Transformers wählen. In meinem Fall habe ich nur einen einzelnen HTTPCaller Transformer ausgewählt.
Nach der Erstellung des benutzerdefinierten Transformers gab es weitere Bearbeitungsschritte zur Einrichtung der Schleife:
- Fügen Sie eine Rückschleifen-Verbindung über eine Kontextmenüauswahl im Canvas hinzu
- Fügen Sie vor der Rückschleife einen Abschluss-Test hinzu
- Erhöhen Sie den Offset-Parameter
Unten sehen Sie, wie mein benutzerdefinierter Transformer aussieht. Zur Laufzeit hat jedes Feature aus dem Hauptcanvas ein Offset-Attribut, das vom HTTPCaller Transformer verwendet wird. Die Parameter limit und order ändern sich nicht und sind daher im HTTPCaller „hart codiert“. Der untere Strom ist die Bedingung für das Schleifen-bis - wenn die Antwort kein leeres Array ist, sind die Daten nicht erschöpft, also erhöhen wir den Offset und schleifen!
Schleifender benutzerdefinierter Transformer
Parsing
Jede API-Antwort ist ein Array von JSON-Strukturen und befindet sich in einem Attribut namens „_response_body“. Das Array wird mit einem JSONFragmenter in separate Features aufgespalten. Der JSON Query Parameter bedeutet nur, dass wir das oberste Array fragmentieren und die anderen Einstellungen sorgen dafür, dass Fragmente geliefert werden, die wie der obige Codeblock aussehen.
JSONFragmenter
Jetzt parsen wir jedes Fragmentfeature mit einem JSONExtractor.
JSONExtractor
Das Raster Extract Queries definiert die Namen der Ausgabeattribute und woher die Daten im Fragment stammen. Der JSON-Abfragen folgen einer einfachen Syntax die Sie eingeben können, aber es gibt einen einfachen Trick, um einen Picker zu erhalten, der Ihnen erlaubt, in der JSON-Struktur zu navigieren und die Abfrageerstellung zu automatisieren. Vor dem JSONExtractor, vorübergehend eine Probe eines einzelnen Features zu nehmen und es in eine Datei zu schreiben, dann setzen Sie vorübergehend Ihre JSONExtractor-Eingabequelle auf diese Datei und Sie erhalten einen praktischen Picker für Ihre Abfragen! Wenn Sie Ihre Extraktionsabfragen ausgefüllt haben, entfernen Sie den Sampler und setzen Sie Ihre JSONFragmenter-Eingabequelle zurück auf das Dokument in _response_body.<\/P>
So sind Pagination und Parsing entmystifiziert!<\/STRONG> Im Blog-Download gibt es zwei Workspace-Quell-fmw-Dateien. CreateFC erstellt eine File-Geodatabase-Ausgabe und ist der Ort, an dem ich die Datenverarbeitung herausgefunden habe, wie das Beheben von Datenfehlern, die die Erstellung eines Datetime-Feldes verhinderten. Ich wollte sowieso eine anfängliche Feature-Class, um sie als meinen Ziel-hosted feature service zu symbolisieren und zu teilen. UpdateFS übernimmt die Datenverarbeitungsschritte aus CreateFC, enthält aber den Looping-Custom-Transformer und einige Logiken, um Datenänderungen zu erkennen und anzuwenden, wann immer das ETL-Tool ausgeführt wird, was Sie wahrscheinlich in der Produktion benötigen werden.<\/P>
Bitte kommentieren Sie in diesem Beitrag mit Fragen und Beobachtungen. Blättern Sie weiter!<\/P>
<\/P>