Betriebsschichten, die sich entwickeln und zeitlich aktiviert sind<\/LI><\/UL><\/LI><\/OL>Mein Ziel ist es zu zeigen, wie Daten in jedem der oben genannten Geschwindigkeits-Szenarien auf cloud-native Weise angeboten und in ArcGIS eingebracht werden können. Der gemeinsame Nenner ist, dass das cloud native Format, das wir verwenden werden, GeoParquet in einem öffentlichen S3-API-kompatiblen Objektspeicher wie AWS ist. In allen Fällen verwenden wir ArcPy und DuckDB in Notebooks oder Skriptwerkzeugen für den Datenverbrauch, mit dem Verständnis, dass ein Datenverwalter den Verbrauchern die Werkzeuge bereitstellt, die ArcGIS benötigt, um die Daten zu konsumieren. Die Kombination aus S3, GeoParquet und DuckDB bietet eine leistungsfähige und funktionale Implementierung in ArcGIS.<\/STRONG><\/P>Lassen Sie uns eintauchen.<\/P> <\/P> <\/P>Periodischer Bulk-Ersatz<\/H3> <\/P>Mein Fachthema sind Overture Maps Foundation Division Area-Features, ein globales Datensatzset, das monatlich veröffentlicht wird. Das Datenmodell umfasst Polygon-Geometrie mit einem primären Ortsnamen und einem struct-Objekt mit alternativen Namen in vielen Sprachen. Die Quelldaten zum Zeitpunkt des Schreibens sind zehn GeoParquet-Dateien in AWS S3, mit einem gemeinsamen Schema. Es gibt keine logische Partitionierung. Das Informationsprodukt, das ich möchte, ist eine Geodatabase-Feature-Class, eine zugehörige Tabelle mit alternativen Namen sowie ein Geocoding-Locator, der alle Namen versteht. <\/STRONG>So sehen die Feature-Daten über Europa aus:<\/P>
Division Areas<\/span><\/P>Um mein Informationsprodukt zu verwenden, zum Beispiel wenn ich Madrid in Spanien mit der Bihari-Sprache finden möchte (das Popup zeigt verfügbare Namen für Madrid), gebe ich 2e94892194d93093f921 als Adresse ein:<\/P>
92e94892194d93093f921 findet Madrid<\/span><\/P>Ein Notebook ist für das Informationsprodukt geeignet. Sie finden es im Blog-Download. Sein einziger Trick besteht darin, den passenden Glob-Pfad zu den GeoParquet-Daten zu verwenden. Siehe diese Zelle:<\/P>sql = f"""create or replace temp view division_area_view as select
id,
names.primary as primary_name,
class,
subtype,
region,
country,
version,
is_land,
is_territorial,
bbox.xmin as xmin,
bbox.ymin as ymin,
bbox.xmax as xmax,
bbox.ymax as ymax,
division_id,
geometry
from read_parquet('s3://overturemaps-us-west-2/release/{release}/theme=divisions/type=division_area/*.parquet',filename=false, hive_partitioning=1)
where {whereExp}
order by country, ST_Area(geometry) desc;"""
view = conn.sql(sql)<\/code><\/pre>DuckDB kann Glob-Pfade für lokale oder entfernte Daten verwenden und Remote-Abfragen mit der S3 API durchführen. Diese Abfragen werden parallel über alle Dateien im Glob-Pfad ausgeführt. Beachten Sie, dass der Pfad einen Release-Identifier enthält. Dieser wird zur Laufzeit aus einem STAC-Katalog entnommen. Dies ist das zentrale Thema dieses Beitrags – wann und wie GeoParquet und DuckDB mit sich ändernden Daten verwendet werden. In diesem Fall wissen wir nicht, welche Datensätze sich geändert haben, daher können wir sie nicht einfach abfragen und führen daher einen Bulk-Extrakt durch.<\/P>Was ist, wenn wir wissen, welche Datensätze sich geändert haben?<\/P> <\/P>Häufiges Anfügen und Upsert<\/H3> <\/P>Mein Beispiel für "geschäftige" Daten sind 311-Falldaten für San Francisco. Der Datensatz wird kontinuierlich mit Tausenden von Fällen pro Tag aktualisiert (geöffnet, bearbeitet oder geschlossen), aber nicht bereinigt und reicht bis ins Jahr 2008 zurück. Zum Zeitpunkt des Schreibens beträgt der Bulk-Download 8 Millionen Features. Hier bei Maßstab 1:10000 dargestellt:<\/P>
311 Fälle in San Francisco<\/span><\/P>Viele "Ereignis"-Datensätze wie dieser existieren. Wie könnte der Datensatz effizient auf cloud-native Weise bereitgestellt werden? Die Antwort beruht darauf, dass die Daten Zeitstempelfelder enthalten für das Öffnen, Aktualisieren und Schließen von Fällen. Das Feld updated_datetime wird bei jeder Statusänderung aktualisiert. Da die Open Data Site von San Francisco (und damit das dahinterstehende System of Record) eine API hat, die Abfragen unterstützt, kann dies für Änderungen basierend auf updated_datetime durchgeführt werden. Hier ist der Ansatz in den im Blog-Download geteilten Werkzeugen:<\/P>Machen Sie einen initialen Bulk-Download zu einer Baseline GeoParquet-Datei<\/LI>In regelmäßigen AbständenAbfrage der vorhandenen GeoParquet-Datei(en) nach dem maximalen Wert von updated_datetime<\/LI>Abfrage des 311-System of Record nach Datensätzen neuer als das MaximumDies ist eine schnelle Abfrage<\/LI><\/UL><\/LI>Schreiben des Abfrageergebnisses in eine neue zusätzliche GeoParquet-DateiAlle GeoParquet-Dateien müssen am selben Glob-Pfad liegen<\/LI><\/UL><\/LI><\/UL><\/LI>Anforderungsgesteuert Abfrage des Satzes von GeoParquet-Dateien zum Extrahieren interessanter DatenDabei wird eine Einfache aber leistungsstarke SQL-Klausel verwendet. Lesen Sie weiter...<\/LI><\/UL><\/LI><\/UL>Hier ist ein Beispiel für eine Abfrage, bei der ich alle 311 Fälle bis heute für 2026 innerhalb eines Polygons in eine Speicher-Feature-Class extrahiere – dazu wurden 4 Sekunden benötigt. Es gibt etwa 8500 Features.<\/P>
San Francisco Query<\/span><\/P>Das Abfragewerkzeug ist ein Skriptwerkzeug. Sein Geheimnis ist die QUALIFY-Klausel. Die aus täglichen Falldaten erstellten GeoParquet-Dateien enthalten Duplikate aufgrund des Falllebenszyklus (an einem Tag geöffnet, an einem anderen bearbeitet, an einem späteren Tag geschlossen). Dann wollen wir nur die aktuellste Zeile pro service_request_id-Wert über alle GeoParquet-Dateien hinweg – die QUALIFY-Klausel erledigt dies beim Abfragen der Parquet-Daten für uns.<\/P> conn.sql(f"""create or replace temp view sf311_view as select
service_request_id,requested_datetime,closed_date,updated_datetime,
status_description,status_notes,agency_responsible,service_name,
service_subtype,service_details,address,street,supervisor_district,
neighborhoods_sffind_boundaries,police_district,source,media_url,
bos_2012,data_as_of,data_loaded_at,ST_AsWKB(GEOM) as wkb
from read_parquet('{pqPath}',filename=false)
where {where}
and ST_Intersects(ST_GeomFromText('{wkt}'), GEOM)
qualify row_number() over (partition by service_request_id order by updated_datetime desc) = 1;""")<\/code><\/pre> <\/P>Also haben wir jetzt eine einfache Möglichkeit, sich schnell ändernde Daten auf cloud-native Weise mit schnellen Abfragen bereitzustellen.<\/P>Was ist, wenn wir ziemlich große Datenmengen haben, aber keine Möglichkeit, Änderungen abzufragen? <\/P> <\/P>Kontinuierliches Einfügen, Aktualisieren und Löschen von Bearbeitungen<\/H3> <\/P>Daten, die starken verzweigten Versionsbearbeitungen unterliegen, sind wertvolle Arbeit für GIS, und obwohl Sie den Datenzustand durch Zugriff auf die zugrunde liegenden Feature-Services teilen können, wird das Hinzufügen einer öffentlichen Mapping-Last zum Server vom Administrator nicht begrüßt. Es stellt sich heraus, dass Sie den Zustand der Daten mit Unterstützung für Zeitreisen mithilfe eines cloud-nativen Ansatzes teilen können<\/STRONG>. Ermöglicht wird dies durch das insert-only Datenmodell<\/STRONG> des branch versioning<\/STRONG> – der Zustand eines Features zu jedem Zeitpunkt wird durch GDB_FROM_DATE in Kombination mit OBJECTID bestimmt – die Zeile mit dem neuesten GDB_FROM_DATE für jeden eindeutigen Wert von OBJECTID ist der aktuelle Zustand eines Features, und wenn Sie frühere GDB_FROM_DATE-Werte abfragen, erhalten Sie Zeitreisen. Der einzige Trick besteht darin, GeoParquet-Dateien zu erstellen, die Bearbeitungsmomente darstellen, aber dann kommt die QUALIFY-Klausel erneut zur Rettung, um die gewünschten Daten zu liefern.<\/P>Hier sind zwei Ansichten von Parcel-Daten über denselben Bereich und unter Verwendung derselben Quell-GeoParquet-Dateien<\/STRONG>.<\/P>
Aktuelle und frühere Momente<\/span><\/span><\/P>Die linke Ansicht zeigt den neuesten Moment, die rechte Ansicht einen früheren Moment; man kann sehen, dass viele Parzellen unterteilt wurden. Die Datenquelle behält die vollständige Datenhistorie bei, Bearbeitungen führen dazu, dass neue GeoParquet-Dateien zu einem Ordner oder Cloud-Objektspeicher hinzugefügt werden. Hier habe ich eine Baseline-GeoParquet-Datei von 1,46 GB für den ursprünglichen Zustand der Daten mit ein paar kleinen GeoParquet-Dateien mit Bearbeitungen über zwei Wochen.<\/STRONG><\/P>
GeoParquet-Dateien mit vollständiger Datenhistorie<\/span><\/span><\/P>Hier ist ein Manifest der Blog-Download-Datei CloudNativeDataDistribution.zip<\/STRONG>:<\/P>ImportCurrentDivisionAreas.ipynb<\/STRONG>-NotebookLädt Overture Division Area-Features in Ihre Projekt-Heim-Geodatabase herunter<\/LI>Erstellt mehrsprachige Namen für Features in einer zugehörigen Tabelle<\/LI>Erstellt oder aktualisiert einen Locator unter Verwendung von Division Area-Features als Referenzdaten<\/LI><\/UL><\/LI>GetBaselineSF311<\/STRONG>-Spatial ETL ToolExtrahiert den vollständigen 311-Datensatz für San Francisco in GeoParquet<\/LI>Benötigt ArcGIS Data Interoperability<\/LI>Benötigt ein Konto und App-Token<\/LI><\/UL><\/LI>GetUpdatesSF311<\/STRONG>-Spatial ETL ToolExtrahiert 311-Falldaten, die neuer sind als alle in einer vorhandenen GeoParquet-Datei<\/LI>Erstellt eine neue GeoParquet-Datei<\/LI>Benötigt ArcGIS Data Interoperability<\/LI>Benötigt ein Konto und App-Token<\/LI><\/UL><\/LI>Generate311Points <\/STRONG>-Script ToolDemonstriert die Verwendung der GeoParquet-Dateien zur Erstellung einer Memory Feature Class<\/LI><\/UL><\/LI>ExtractCurrentParcels.ipynb<\/STRONG>-Notebook
Demonstriert das Extrahieren des neuesten Datenzustands von GeoParquet-Dateien in einem branch versioned Datenmodell<\/LI><\/UL><\/LI>ExtractEarlierParcels.ipynb<\/STRONG>-NotebookDemonstriert das Extrahieren eines früheren Datenzustands von GeoParquet-Dateien in einem branch versioned Datenmodell<\/LI><\/UL><\/LI><\/UL>Nicht enthalten, aber auf Anfrage verfügbar, sind die Werkzeuge zum Erstellen von GeoParquet-Dateien für die Parcel-Daten. Denken Sie daran: Während meine Beispielwerkzeuge lokalen Dateispeicher für GeoParquet verwenden, würden Sie in der Produktion einen Cloud-Objektspeicher wie AWS S3 verwenden.<\/P>Nun, während ich hoffe, Sie auf der User Conference 2026 in San Diego zu sehen, falls Sie mehr Motivation brauchen, hier eine Vorschau auf eine Demo, die Overture Building Theme-Daten in eine Szene bringt. Sehen Sie nach, ob Sie ein paar Easter Egg Script Tools im Blog-Download finden können 😉<\/span>.<\/P>
Overture Buildings<\/span><\/span><\/P> <\/P>