Die Aktualisierung räumlicher Daten ist eine häufige Herausforderung bei der Arbeit im großen Maßstab, insbesondere wenn Analyseergebnisse kontinuierlich zurück an operative Systeme veröffentlicht werden müssen. Mit ArcGIS GeoAnalytics for Fabric können Sie Analyseergebnisse direkt in Feature-Services schreiben. Beim Aktualisieren von Feature-Services möchten Sie möglicherweise nicht alles bei jeder Aktualisierung neu schreiben. Mit der upsert-Option können Sie vorhandene Features aktualisieren und neue in einer einzigen, effizienten Operation hinzufügen. In diesem Beitrag zeigen wir, wie upsert inkrementelle Updates von Feature-Services vereinfacht, sodass Sie autoritative Layer aktuell halten können, während stabile Feature-IDs erhalten bleiben und nachgelagerte Apps und Dashboards unterstützt werden.
In diesem Blogbeitrag führen wir Sie durch den Prozess, um zu zeigen, wie es funktioniert. Zur Demonstration erstellen wir einen neuen Feature-Service, lesen die Daten aus diesem Feature-Service, führen ein Update an einigen Zeilen durch und verwenden dann upsert , um nur diese Zeilen in unserem gespeicherten Feature-Service mit den aktualisierten Daten zu ändern.
Erstellen eines Feature-Services
Um zu demonstrieren, wie upsert funktioniert, beginnen wir mit der Erstellung eines Feature-Services. Um es einfach zu halten, lesen wir einfach eine Datenebene aus Esris Living Atlas of the World und schreiben diese in unser Konto bei ArcGIS Online. Dies wird unser „neuer“ Feature-Service sein, den wir aktualisieren werden.
Zuerst importieren wir die GeoAnalytics for Fabric-Bibliothek und die Pyspark SQL-Funktionen
# Importe
import geoanalytics_fabric
import pyspark.sql.functions as F
Als Nächstes lesen wir einen Datensatz von US Major Cities als Beispieldaten ein. In diesem Fall verwenden wir nur einige Attribute aus dem ursprünglichen Living Atlas Feature-Service. Für dieses Beispiel entfernen wir das automatisch generierte OBJECTID-Feld in einem Feature-Service und ersetzen es durch ein Feld namens „My_ID“. Dies dient nur dazu, die Erstellung einer eindeutigen indizierten OBJECTID zu zeigen, wenn wir unseren neuen Feature-Service schreiben (ansonsten hätten wir beim nächsten Schritt unserer Demonstration ein zweites OBJECTID-Feld).
# Datensatz zum Beispiel für upsert einlesen
# US Major Cities Datensatz aus ArcGIS Living Atlas of the World
myFS="https://services.arcgis.com/P3ePLMYs2RVChkJx/arcgis/rest/services/USA_Major_Cities_/FeatureServer/0"
myFSDataFrame = spark.read.format('feature-service').load(myFS)\
.select("OBJECTID", "NAME", "STATE_ABBR", "PLACE_FIPS", "SHAPE")\
.withColumn("My_ID", F.col("OBJECTID"))\
.drop("OBJECTID") # Originales OBJECTID-Feld entfernen, da wir My_ID als upsert-Matching-Feld verwenden
display(myFSDataFrame)
Wir verwenden das resultierende DataFrame als Beispieldatensatz und schreiben es in unser ArcGIS Online-Konto, damit wir einen neuen Feature-Service haben, den wir bearbeiten können.
Dazu verbinden wir uns mit unserem ArcGIS Online-Konto:
# Registrierung eines GIS, in das wir die Daten schreiben - Verwendung von AGOL-Anmeldedaten
geoanalytics_fabric.register_gis("myGIS", "https://arcgis.com", username="my_username", password="my_password")Dann schreiben wir das DataFrame in unser ArcGIS Online-Konto. Beachten Sie, dass wir beim ersten Schreiben ein upsertMatchingField festlegen. Dieses gibt das Layer-Feld an, das beim Abgleichen von Features mit upsert verwendet wird. Wir können jedes Feld mit einem eindeutigen Index verwenden – in diesem Fall ist es „My_ID“, ein eindeutiger Bezeichner.
Wenn wir unseren neuen Layer erstellen und das upsertMatchingField angeben, wird auf unserem angegebenen Feld (My_ID) ein eindeutiger Index erstellt.
# Schreiben in mein GIS
# Angabe des Felds "My_ID" als upsert-Feld (erstellt eindeutigen Index)
myFSDataFrame.write.format('feature-service')\
.option("gis", "myGIS")\
.option("serviceName", "us_cities_upsert_example_with_unique_index")\
.option("layerName", "layer")\
.option("upsertMatchingField", "My_ID")\
.save()Aktualisieren einiger unserer Daten
Wir können die Daten aus diesem Layer wieder herunterladen, um den Inhalt zu überprüfen und einige Zeilen zu identifizieren, die wir mit upsert aktualisieren wollen. Beachten Sie, dass wir die Option angeben, um uns mit unserem ArcGIS Online-Konto zu verbinden. Es ist wichtig sicherzustellen, dass Sie das ArcGIS Online-Konto registriert haben, in dem Ihre Daten gespeichert sind, damit Sie auf die Daten zum Lesen und Schreiben zugreifen können!
# Lesen unserer Daten aus dem neuen Feature-Service - dieses DataFrame verwenden wir zur Demonstration der upsert-Funktionalität
myNewFS = "https://your_service_URL"
myNewFSDataFrame = spark.read.format('feature-service')\
.option("gis", "myGIS")\
.load(myNewFS)
display(myNewFSDataFrame)

Unser neuer Feature-Service enthält alle ursprünglichen Felder sowie ein neues OBJECTID-Feld, das beim Schreiben des Feature-Services automatisch erstellt wurde.
Sehen wir uns nun an, was passiert, wenn wir einen Teil unserer Daten aktualisieren wollen. Um es einfach zu halten, aktualisieren wir nur die Datensätze mit den ersten beiden IDs – mit anderen Worten ersetzen wir „Alabaster“ durch „New City 1“ und „Albertville“ durch „New City 2“:
# Zwei Zeilen zum Aktualisieren bearbeiten
updated_row = myFSDataFrame.filter("My_ID in (1, 2)")\
.withColumn("NAME", F.when(F.col("My_ID") == 1, "New City Name 1").otherwise("New City Name 2"))
display(updated_row)
Wenn wir unseren Feature-Service auf ArcGIS Online mit diesen neuen Datensätzen aktualisieren wollen – aber nur diese zwei Zeilen aktualisieren möchten – können wir dafür upsert verwenden. Schreiben wir dieses DataFrame mit nur den zwei aktualisierten Zeilen zurück in unseren Feature-Service. Beim Zurückschreiben setzen wir den Modus auf „append“ und geben unser upsertMatchingField als „My_ID“ an. Dadurch werden die eindeutigen IDs dieser Datensätze abgeglichen und nur deren Attribute ersetzt.
# Die aktualisierten Zeilen mit upsert zurück in den Feature-Service schreiben
service_url = "https://your_service_URL"
updated_row.write.mode("append").format('feature-service')\
.option("gis", "myGIS")\
.option("serviceURL", service_url)\
.option("upsertMatchingField", "My_ID")\
.option("layerName", "layer")\
.save()Nun können wir überprüfen, ob die Änderungen übernommen wurden, indem wir unseren Feature-Service erneut lesen und uns die Daten ansehen:
myfs_upsert_url = "https://your_service_URL"
myFSDataFrame_after_upsert = spark.read.format('feature-service')\
.option("gis", "myGIS")\
.load(myfs_upsert_url)
display(myFSDataFrame_after_upsert)

Und es mussten nur zwei Zeilen aktualisiert werden! Das ist typischerweise effizienter als das Überschreiben der gesamten Tabelle.
Fazit
Ich hoffe, dies war eine hilfreiche Demonstration dafür, wie Sie Feature-Services effizient selektiv mit GeoAnalytics for Fabric aktualisieren können!