Udržování prostorových dat aktuálních je běžnou výzvou při práci ve velkém měřítku, zejména když je potřeba průběžně publikovat výsledky analýz zpět do provozních systémů. S ArcGIS GeoAnalytics for Fabric můžete zapisovat výstupy analýz přímo do feature services. Při aktualizaci feature services možná nebudete chtít přepisovat všechno při každé aktualizaci. Pomocí upsert možnosti můžete v jedné efektivní operaci aktualizovat existující prvky a přidat nové. V tomto příspěvku se podíváme, jak upsert zjednodušuje inkrementální aktualizace feature services, pomáhá udržet autoritativní vrstvy aktuální, přičemž zachovává stabilní ID prvků a podporuje downstream aplikace a dashboardy.
V tomto blogovém příspěvku projdeme proces, abychom ukázali, jak to funguje. Pro demonstraci vytvoříme novou feature service, načteme data z této feature service, provedeme aktualizaci několika řádků a poté použijeme upsert k úpravě pouze těchto řádků v naší uložené feature service s aktualizovanými daty.
Vytvoření feature service
Pro demonstraci fungování upsert začneme vytvořením feature service. Abychom to zjednodušili, načteme datovou vrstvu z Esri Living Atlas of the World a zapíšeme ji do našeho účtu v ArcGIS Online. Toto bude naše „nová“ feature service, kterou budeme aktualizovat.
Nejprve importujeme knihovnu GeoAnalytics for Fabric a funkce Pyspark SQL.
# importy
import geoanalytics_fabric
import pyspark.sql.functions as F
Dále načteme dataset US major cities, který použijeme jako příkladová data. V tomto případě použijeme jen několik atributů z původní Living Atlas feature service. Pro tento příklad odstraníme pole OBJECTID, které je automaticky generováno ve Feature Service, a nahradíme ho polem nazvaným „My_ID“. To slouží pouze k ukázce vytvoření unikátního indexovaného OBJECTID při zápisu naší nové feature service (jinak bychom při dalším kroku demonstrace získali druhé pole OBJECTID).
# načtení datasetu pro příklad upsertu
# dataset US major cities z 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") # odstranění původního pole OBJECTID, protože budeme používat My_ID jako pole pro upsert matching
display(myFSDataFrame)
Použijeme výsledný DataFrame jako náš vzorový dataset a zapíšeme ho do našeho účtu ArcGIS Online, abychom měli novou feature service, kterou můžeme upravovat.
K tomu se připojíme k našemu účtu ArcGIS Online:
# registrace GIS, kam budeme zapisovat data - použití AGOL přihlašovacích údajů
geoanalytics_fabric.register_gis("myGIS", "https://arcgis.com", username="my_username", password="my_password")A poté zapíšeme DataFrame do našeho účtu ArcGIS Online. Při tomto počátečním zápisu nastavujeme upsertMatchingField. Toto určuje pole vrstvy, které bude použito pro párování prvků při upsertu. Můžeme použít jakékoli pole s unikátním indexem – v tomto případě je to „My_ID“, unikátní identifikátor.
Při vytvoření nové vrstvy a specifikaci upsertMatchingField se na našem specifikovaném poli (My_ID) vytvoří unikátní index.
# zápis do mého GIS
# specifikace pole "My_ID" jako upsert pole (vytvoří unikátní 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()Aktualizace části našich dat
Můžeme si stáhnout data zpět z této vrstvy, abychom potvrdili obsah podle očekávání, a pak vybrat několik řádků, které budeme aktualizovat pomocí upsert. Upozorňujeme, že specifikujeme možnost připojení k našemu účtu ArcGIS Online. Je důležité zajistit, že máte registrovaný účet ArcGIS Online, kde vaše data jsou uložena, abyste k nim mohli přistupovat pro čtení i zápis!
# načtení dat z nové feature service - tento DataFrame použijeme k demonstraci funkce upsert
myNewFS = "https://your_service_URL"
myNewFSDataFrame = spark.read.format('feature-service')\
.option("gis", "myGIS")\
.load(myNewFS)
display(myNewFSDataFrame)

Naše nová feature service obsahuje všechna původní pole plus nové pole OBJECTID, které bylo automaticky vytvořeno při zápisu feature service.
Nyní uvidíme, co se stane, když chceme aktualizovat podmnožinu našich dat. Abychom to zjednodušili, upravíme záznamy s prvními dvěma ID – jinými slovy nahradíme „Alabaster“ za „New City 1“ a „Albertville“ za „New City 2“:
# úprava dvou řádků k aktualizaci
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)
Pokud chceme aktualizovat naši feature service na ArcGIS Online těmito novými záznamy – ale pouze tyto dva řádky dat < /EM>0můžeme použít upsert. Zapišme tento DataFrame obsahující pouze dva aktualizované řádky zpět do naší feature service. Při zápisu nastavíme režim na „append“ a specifikujeme naše upsertMatchingField jako „My_ID“. To odpovídá unikátním ID těchto záznamů a vymění atributy pouze pro tyto řádky.
# zápis aktualizovaných řádků zpět do feature service pomocí upsert
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()Nyní můžeme ověřit změny načtením naší feature service zpět a prohlédnutím dat:
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)

A bylo potřeba aktualizovat pouze dva řádky! To bude obvykle efektivnější než přepisování celé tabulky.
Závěr
Doufám, že tato demonstrace byla užitečná pro to, jak efektivně selektivně aktualizovat feature services pomocí GeoAnalytics for Fabric!