Best Practices für die räumliche Analyse
Wenn Sie komplexe raumbezogene Features in BigQuery analysieren, können Datasets große Sammlungen von Polygonen, Multipolygon-Formen und Linestrings enthalten, um komplexe Features wie Straßen, Grundstücke und Überschwemmungsgebiete darzustellen. Jede Form kann Tausende von Punkten enthalten. Bei den meisten räumlichen Vorgängen in BigQuery (z. B. Schnittpunkte und Entfernungsberechnungen) besucht der zugrunde liegende Algorithmus in der Regel die meisten Punkte in jeder Form, um ein Ergebnis zu erzeugen. Bei einigen Vorgängen besucht der Algorithmus alle Punkte.
Die Verarbeitung von Formen mit Tausenden von Punkten kann die Kosten und die Dauer Ihrer Abfrage drastisch erhöhen. Wenn Sie die Leistung Ihrer raumbezogenen Abfragen optimieren und die Latenz reduzieren möchten, können Sie bestimmte Best Practices für die räumliche Analyse auf Ihre Datasets anwenden.
In diesem Dokument wird davon ausgegangen, dass Ihre BigQuery-Geodaten-Tabellen nach einer Geografiespalte geclustert sind.
Formen vereinfachen
Best Practice: Verwenden Sie die Funktionen „Vereinfachen“ und „Am Raster ausrichten“, um eine vereinfachte Version Ihres ursprünglichen Datasets als materialisierte Ansicht zu speichern.
Viele komplexe Formen mit einer großen Anzahl von Punkten können ohne nennenswerten Genauigkeitsverlust vereinfacht werden. Verwenden Sie die BigQuery-Funktionen ST_SIMPLIFY und ST_SNAPTOGRID separat oder zusammen, um die Anzahl der Punkte in komplexen Formen zu reduzieren.
Kombinieren Sie diese Funktionen mit materialisierten BigQuery-Ansichten, um eine vereinfachte Version Ihres ursprünglichen Datasets als materialisierte Ansicht zu speichern, die automatisch auf dem neuesten Stand der Basistabelle gehalten wird.
Das Vereinfachen von Formen ist in den folgenden Anwendungsfällen am nützlichsten, um die Kosten und die Leistung eines Datasets zu verbessern:
- Sie müssen eine hohe Ähnlichkeit mit der tatsächlichen Form beibehalten.
- Sie müssen hochpräzise Vorgänge mit hoher Genauigkeit ausführen.
- Sie möchten Visualisierungen beschleunigen, ohne dass die Formdetails sichtbar verloren gehen.
Das folgende Codebeispiel zeigt, wie die Funktion ST_SIMPLIFY für eine Basistabelle mit einer GEOGRAPHY-Spalte namens geom verwendet wird. Der Code vereinfacht Formen und entfernt Punkte, ohne dass die Kanten einer Form um mehr als die angegebene Toleranz von 1,0 Metern verändert werden.
CREATE MATERIALIZED VIEW project.dataset.base_mv
CLUSTER BY geom
AS (
SELECT
* EXCEPT (geom),
ST_SIMPLIFY(geom, 1.0) AS geom
FROM base_table
)
Im folgenden Codebeispiel wird gezeigt, wie Sie mit der Funktion ST_SNAPTOGRID die Punkte an einem Raster mit einer Auflösung von 0,00001 Grad ausrichten:
CREATE MATERIALIZED VIEW project.dataset.base_mv
CLUSTER BY geom
AS (
SELECT
* EXCEPT (geom),
ST_SNAPTOGRID(geom, -5) AS geom
FROM base_table
)
Das Argument grid_size in dieser Funktion dient als Exponent, d. h. 10e-5 = 0,00001. Diese Auflösung entspricht im schlimmsten Fall, der am Äquator auftritt, etwa 1 Meter.
Nachdem Sie diese Ansichten erstellt haben, fragen Sie die Ansicht base_mv mit derselben Abfragesemantik ab, die Sie auch für die Abfrage der Basistabelle verwenden würden. Mit dieser Methode können Sie schnell eine Sammlung von Formen identifizieren, die genauer analysiert werden müssen. Anschließend können Sie eine zweite, detailliertere Analyse der Basistabelle durchführen. Testen Sie Ihre Abfragen, um herauszufinden, welche Grenzwerte für Ihre Daten am besten geeignet sind.
Legen Sie für Messungsanwendungsfälle fest, wie genau die Messung sein muss. Wenn Sie die Funktion ST_SIMPLIFY verwenden, legen Sie für den Parameter threshold_meters die erforderliche Genauigkeit fest. Wenn Sie Entfernungen auf der Ebene einer Stadt oder größer messen möchten, legen Sie einen Schwellenwert von 10 Metern fest. Bei kleineren Maßstäben, z. B. beim Messen der Entfernung zwischen einem Gebäude und dem nächstgelegenen Gewässer, sollten Sie einen kleineren Schwellenwert von 1 Meter oder weniger verwenden. Wenn Sie kleinere Schwellenwerte verwenden, werden weniger Punkte aus der angegebenen Form entfernt.
Wenn Sie Kartenebenen über einen Webdienst bereitstellen, können Sie materialisierte Ansichten für verschiedene Zoomstufen mit dem bigquery-geotools-Projekt vorab berechnen. Dies ist ein Treiber für Geoserver, mit dem Sie räumliche Ebenen aus BigQuery bereitstellen können. Dieser Treiber erstellt mehrere materialisierte Ansichten mit unterschiedlichen ST_SIMPLIFY-Schwellenwertparametern, sodass bei höheren Zoomstufen weniger Details angezeigt werden.
Punkte und Rechtecke verwenden
Best Practice: Reduzieren Sie die Form auf einen Punkt oder ein Rechteck, um die Position darzustellen.
Sie können die Abfrageleistung verbessern, indem Sie die Form auf einen einzelnen Punkt oder ein Rechteck reduzieren. Die Methoden in diesem Abschnitt stellen die Details und Proportionen der Form nicht genau dar, sondern optimieren die Darstellung der Position der Form.
Sie können den geografischen Mittelpunkt einer Form (ihren Schwerpunkt) verwenden, um die Position der gesamten Form darzustellen. Verwenden Sie ein Rechteck, das die Form enthält, um die Ausdehnung der Form zu erstellen. Damit können Sie die Position der Form darstellen und Informationen zu ihrer relativen Größe beibehalten.
Die Verwendung von Punkten und Rechtecken ist am nützlichsten, um die Kosten und die Leistung eines Datasets zu verbessern, wenn Sie die Entfernung zwischen zwei Punkten messen müssen, z. B. zwischen zwei Städten.
Angenommen, Sie laden eine Datenbank mit Grundstücken in den USA in eine BigQuery-Tabelle und ermitteln dann das nächstgelegene Gewässer.
In diesem Fall können Sie die Anzahl der Vergleiche reduzieren, die bei Verwendung der Funktionen ST_DISTANCE oder ST_DWITHIN durchgeführt werden, indem Sie die Schwerpunkte der Parzellen mit der Funktion ST_CENTROID in Kombination mit der im Abschnitt Formen vereinfachen dieses Dokuments beschriebenen Methode vorab berechnen. Bei Verwendung der Funktion ST_CENTROID muss der Schwerpunkt des Flurstücks in die Berechnung einbezogen werden. Durch die Vorberechnung der Flurstücksschwerpunkte auf diese Weise kann auch die Variabilität der Leistung reduziert werden, da verschiedene Flurstücksformen wahrscheinlich eine unterschiedliche Anzahl von Punkten enthalten.
Eine Variante dieser Methode besteht darin, die Funktion ST_BOUNDINGBOX anstelle der Funktion ST_CENTROID zu verwenden, um eine rechteckige Hülle um die Eingabeform zu berechnen. Das ist zwar nicht ganz so effizient wie die Verwendung eines einzelnen Punkts, kann aber das Auftreten bestimmter Grenzfälle reduzieren. Diese Variante bietet immer noch eine gute und konsistente Leistung, da die Ausgabe der Funktion ST_BOUNDINGBOX immer nur vier Punkte enthält, die berücksichtigt werden müssen. Das Ergebnis des Begrenzungsrahmens ist vom Typ STRUCT. Das bedeutet, dass Sie die Entfernungen manuell berechnen oder die Vektorindexmethode verwenden müssen, die weiter unten in diesem Dokument beschrieben wird.
Hüllen verwenden
Best Practice: Verwenden Sie eine Hülle, um die Darstellung der Position einer Form zu optimieren.
Wenn Sie sich vorstellen, eine Form mit Schrumpffolie zu umwickeln und die Grenze der Schrumpffolie zu berechnen, wird diese Grenze als Hülle bezeichnet. In einer konvexen Hülle sind alle Winkel der resultierenden Form konvex. Wie die Ausdehnung einer Form enthält eine konvexe Hülle einige Informationen über die relative Größe und die Proportionen der zugrunde liegenden Form. Die Verwendung einer Hülle hat jedoch den Nachteil, dass in nachfolgenden Analysen mehr Punkte gespeichert und berücksichtigt werden müssen.
Mit der Funktion ST_CONVEXHULL können Sie die Darstellung der Position der Form optimieren. Die Verwendung dieser Funktion verbessert die Genauigkeit, allerdings auf Kosten der Leistung. Die Funktion ST_CONVEXHULL ähnelt der Funktion ST_EXTENT, aber die Ausgabeform enthält mehr Punkte und die Anzahl der Punkte variiert je nach Komplexität der Eingabeform. Der Leistungsvorteil ist bei kleinen Datasets mit unkomplizierten Formen wahrscheinlich vernachlässigbar. Bei sehr großen Datasets mit großen und komplexen Formen bietet die Funktion ST_CONVEXHULL jedoch ein gutes Gleichgewicht zwischen Kosten, Leistung und Genauigkeit.
Rastersysteme verwenden
Best Practice: Verwenden Sie Georastersysteme, um Gebiete zu vergleichen.
Wenn Sie Daten innerhalb lokalisierter Bereiche aggregieren und statistische Aggregationen dieser Bereiche miteinander vergleichen möchten, können Sie ein standardisiertes Rastersystem verwenden, um verschiedene Bereiche zu vergleichen.
Ein Einzelhändler möchte beispielsweise demografische Veränderungen im Laufe der Zeit in Gebieten analysieren, in denen sich seine Geschäfte befinden oder in denen er den Bau eines neuen Geschäfts in Betracht zieht. Oder eine Versicherungsgesellschaft möchte ihr Verständnis von Immobilienrisiken verbessern, indem sie die vorherrschenden Naturgefahrenrisiken in einem bestimmten Gebiet analysiert.
Die Verwendung von Standardgittersystemen wie S2 und H3 kann solche statistischen Aggregationen und räumlichen Analysen beschleunigen. Die Verwendung dieser Rastersysteme kann auch die Entwicklung von Analysen vereinfachen und die Entwicklungseffizienz verbessern.
Beispielsweise sind Vergleiche anhand von Zählbezirken in den USA aufgrund der unterschiedlichen Größe inkonsistent. Daher müssen Korrekturfaktoren angewendet werden, um Vergleiche zwischen Zählbezirken zu ermöglichen. Außerdem ändern sich Zählbezirke und andere administrative Grenzen im Laufe der Zeit und es ist mühsam, diese Änderungen zu korrigieren. Die Verwendung von Rastersystemen für räumliche Analysen kann solche Herausforderungen bewältigen.
Vektorsuche und Vektorindexe verwenden
Best Practice: Verwenden Sie die Vektorsuche und Vektorindexe für räumliche Abfragen nach dem nächsten Nachbarn.
Die Funktionen für die Vektorsuche wurden in BigQuery eingeführt, um Anwendungsfälle für maschinelles Lernen wie semantische Suche, Ähnlichkeitserkennung und Retrieval-Augmented Generation zu ermöglichen. Der Schlüssel zur Ermöglichung dieser Anwendungsfälle ist eine Indexierungsmethode, die als Suche nach dem ungefähren nächsten Nachbarn bezeichnet wird. Mit der Vektorsuche können Sie Geodatenabfragen für nächste Nachbarn beschleunigen und vereinfachen, indem Sie Vektoren vergleichen, die Punkte im Raum darstellen.
Mit der Vektorsuche können Sie nach Features in einem bestimmten Radius suchen. Legen Sie zuerst einen Radius für Ihre Suche fest. Sie können den optimalen Radius in der Ergebnismenge einer Suche nach dem nächsten Nachbarn ermitteln. Nachdem Sie den Radius festgelegt haben, verwenden Sie die Funktion ST_DWITHIN, um nahegelegene Features zu identifizieren.
Angenommen, Sie möchten die zehn Gebäude finden, die einem bestimmten Ankergebäude am nächsten sind, dessen Standort Sie bereits kennen. Sie können die Schwerpunkte der einzelnen Gebäude als Vektor in einer neuen Tabelle speichern, die Tabelle indexieren und mit der Vektorsuche durchsuchen.
In diesem Beispiel können Sie auch Overture Maps-Daten in BigQuery verwenden, um eine separate Tabelle mit Gebäudeformen für einen bestimmten Bereich und einen Vektor namens geom_vector zu erstellen. Der relevante Bereich in diesem Beispiel ist die Stadt Norfolk, VA, USA, dargestellt durch den FIPS-Code 51710, wie im folgenden Codebeispiel gezeigt:
CREATE TABLE vector_search.norfolk_buildings
AS (
SELECT
*,
[
ST_X(ST_CENTROID(building.geometry)),
ST_Y(ST_CENTROID(building.geometry))] AS geom_vector
FROM `bigquery-public-data.overture_maps.building` AS building
INNER JOIN `bigquery-public-data.geo_us_boundaries.counties` AS county
ON (st_intersects(county.county_geom, building.geometry))
WHERE county.county_fips_code = '51710'
)
Das folgende Codebeispiel zeigt, wie Sie einen Vektorindex für die Tabelle erstellen:
CREATE
vector index building_vector_index
ON
vector_search.norfolk_buildings(geom_vector)
OPTIONS (index_type = 'IVF')
Mit dieser Abfrage werden die 10 Gebäude ermittelt, die einem bestimmten Ankergebäude am nächsten sind:
SELECT base.*
FROM
VECTOR_SEARCH(
TABLE vector_search.norfolk_buildings,
'geom_vector',
(
SELECT
geom_vector
FROM
vector_search.norfolk_buildings
WHERE id = '56873794-9873-4fe1-871a-5987bb3a0efb'
),
top_k => 10,
distance_type => 'EUCLIDEAN',
options => '{"fraction_lists_to_search":0.1}')
Klicken Sie im Bereich Abfrageergebnisse auf den Tab Visualisierung. Auf der Karte wird eine Gruppe von Gebäudeformen angezeigt, die dem Ankergebäude am nächsten sind:
Wenn Sie diese Abfrage in der Cloud de Confiance Console ausführen, klicken Sie auf Jobinformationen und prüfen Sie, ob der Nutzungsmodus für Vektorindex auf FULLY_USED gesetzt ist. Dies zeigt, dass die Abfrage den Vektorindex building_vector_index verwendet, den Sie zuvor erstellt haben.
Große Formen teilen
Best Practice: Teilen Sie große Formen mit der Funktion ST_SUBDIVIDE auf.
Verwenden Sie die Funktion ST_SUBDIVIDE, um große Formen oder lange Linienstrings in kleinere Formen aufzuteilen.
Nächste Schritte
- Gittersysteme für die räumliche Analyse verwenden
- Weitere Informationen zu geografischen Funktionen in BigQuery
- Vektorindexe verwalten
- Weitere Informationen zu Best Practices für die räumliche Indexierung und das Clustering in BigQuery
- Weitere Informationen zum Analysieren und Visualisieren von Geodaten in BigQuery finden Sie unter Erste Schritte mit raumbezogenen Analysen.