Best Practices für die räumliche Analyse
In diesem Dokument werden Best Practices zur Optimierung der Leistung von Geoanalysen in BigQuery beschrieben. Mit diesen Best Practices können Sie die Leistung verbessern und Kosten und Latenz reduzieren.
Datasets können große Sammlungen von Polygonen, Multipolygonen und Linien enthalten, um komplexe Elemente wie Straßen, Grundstücke und Überschwemmungsgebiete darzustellen. Jede Form kann Tausende von Punkten enthalten. Bei den meisten räumlichen Operationen in BigQuery (z. B. Schnittmengen und Distanzberechnungen) werden im zugrunde liegenden Algorithmus in der Regel die meisten Punkte in jeder Form besucht, um ein Ergebnis zu erzielen. Bei einigen Vorgängen werden alle Punkte vom Algorithmus berücksichtigt. Bei komplexen Formen kann der Besuch jedes Punktes die Kosten und die Dauer der räumlichen Operationen erhöhen. Mit den in diesem Leitfaden vorgestellten Strategien und Methoden können Sie diese gängigen räumlichen Vorgänge optimieren, um die Leistung zu verbessern und die Kosten zu senken.
In diesem Dokument wird davon ausgegangen, dass Ihre räumlichen BigQuery-Tabellen nach einer Spalte vom Typ „GEOGRAPHY“ geclustert sind.
Formen vereinfachen
Best Practice:Verwenden Sie die Funktionen „simplify“ und „snap-to-grid“, um eine vereinfachte Version Ihres ursprünglichen Datasets als materialisierte Ansicht zu speichern.
Viele komplexe Formen mit einer großen Anzahl von Punkten lassen sich ohne großen Verlust an Genauigkeit vereinfachen. 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 Ansichten in BigQuery, um eine vereinfachte Version Ihres ursprünglichen Datasets als materialisierte Ansicht zu speichern, die automatisch mit der Basistabelle synchronisiert wird.
Das Vereinfachen von Formen ist am nützlichsten, um die Kosten und Leistung eines Datasets in den folgenden Anwendungsfällen zu verbessern:
- Die Ähnlichkeit mit der tatsächlichen Form muss hoch sein.
- 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 eine Kante einer Form um mehr als die angegebene Toleranz von 1,0 Metern verschoben wird.
CREATE MATERIALIZED VIEW project.dataset.base_mv
CLUSTER BY geom
AS (
SELECT
* EXCEPT (geom),
ST_SIMPLIFY(geom, 1.0) AS geom
FROM base_table
)
Das folgende Codebeispiel zeigt, 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 etwa 1 Meter, was am Äquator der Fall ist.
Nachdem Sie diese Ansichten erstellt haben, fragen Sie die base_mv
-Ansicht mit derselben Abfragesemantik ab, die Sie zum Abfragen der Basistabelle verwenden würden. Mit dieser Methode können Sie schnell eine Gruppe 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 Schwellenwerte für Ihre Daten am besten geeignet sind.
Legen Sie für Messanwendungsfälle fest, welche Genauigkeit für Ihren Anwendungsfall erforderlich ist. Wenn Sie die Funktion ST_SIMPLIFY
verwenden, legen Sie den Parameter threshold_meters
auf die erforderliche Genauigkeit fest. Wenn Sie Entfernungen im Maßstab einer Stadt oder größer messen möchten, legen Sie einen Grenzwert von 10 Metern fest. Bei kleineren Maßstäben, z. B. wenn Sie die Entfernung zwischen einem Gebäude und dem nächsten Gewässer messen, sollten Sie einen kleineren Grenzwert von 1 Meter oder weniger verwenden. Bei kleineren Grenzwerten werden weniger Punkte aus der angegebenen Form entfernt.
Wenn Sie Kartenlayer über einen Webdienst bereitstellen, können Sie mit dem bigquery-geotools-Projekt, einem Treiber für GeoServer, der es Ihnen ermöglicht, räumliche Layer aus BigQuery bereitzustellen, materialisierte Ansichten für verschiedene Zoomstufen vorab berechnen. Mit diesem Treiber werden mehrere materialisierte Ansichten mit unterschiedlichen ST_SIMPLIFY
-Schwellenwertparametern erstellt, sodass bei höheren Zoomfaktoren weniger Details bereitgestellt werden.
Punkte und Rechtecke verwenden
Best Practice:Reduzieren Sie die Form auf einen Punkt oder ein Rechteck, um ihre 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 des Standorts der Form.
Sie können den geografischen Mittelpunkt einer Form (ihren Zentroid) 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.
Punkte und Rechtecke sind am nützlichsten, um die Kosten und Leistung eines Datasets zu verbessern, wenn Sie die Entfernung zwischen zwei Punkten, z. B. zwischen zwei Städten, messen müssen.
Sie könnten beispielsweise eine Datenbank mit Grundstücken in den USA in eine BigQuery-Tabelle laden und dann das nächstgelegene Gewässer ermitteln.
In diesem Fall kann die Vorberechnung von Parzellenschwerpunkten mit der Funktion ST_CENTROID
in Kombination mit der im Abschnitt Formen vereinfachen dieses Dokuments beschriebenen Methode die Anzahl der Vergleiche reduzieren, die bei Verwendung der Funktionen ST_DISTANCE
oder ST_DWITHIN
durchgeführt werden. Bei Verwendung der Funktion ST_CENTROID
muss der Schwerpunkt des Pakets in die Berechnung einbezogen werden. Durch die Vorberechnung der Paketzentroide kann auch die Variabilität der Leistung reduziert werden, da verschiedene Paketformen wahrscheinlich unterschiedliche Anzahlen 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 weiterhin eine gute und konsistente Leistung, da die Ausgabe der ST_BOUNDINGBOX
-Funktion 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 Distanzen 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 den Standort einer Form zu optimieren.
Wenn Sie sich vorstellen, dass eine Form in Schrumpffolie eingewickelt wird, und Sie die Grenze der Schrumpffolie berechnen, wird diese Grenze als Hülle bezeichnet. Bei einer konvexen Hülle sind alle Winkel der resultierenden Form konvex. Wie die Ausdehnung einer Form behält auch die konvexe Hülle einige Informationen über die relative Größe und die Proportionen der zugrunde liegenden Form bei. Die Verwendung einer Hülle hat jedoch den Nachteil, dass mehr Punkte gespeichert und in nachfolgenden Analysen 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, geht aber auf Kosten der Leistung. Die Funktion ST_CONVEXHULL
ähnelt der Funktion ST_EXTENT
, mit der Ausnahme, dass die Ausgabefigur mehr Punkte enthält und die Anzahl der Punkte je nach Komplexität der Eingabefigur variiert. Bei kleinen Datasets mit nicht komplexen Formen ist der Leistungsvorteil wahrscheinlich vernachlässigbar. Bei sehr großen Datasets mit großen und komplexen Formen bietet die ST_CONVEXHULL
-Funktion jedoch ein gutes Gleichgewicht zwischen Kosten, Leistung und Genauigkeit.
Rastersysteme verwenden
Best Practice:Verwenden Sie geografische Gridsysteme, um Gebiete zu vergleichen.
Wenn Sie Daten in lokalisierten Bereichen zusammenfassen und statistische Zusammenfassungen dieser Bereiche miteinander vergleichen möchten, kann es sinnvoll sein, ein standardisiertes Gridsystem zu verwenden.
Ein Einzelhändler möchte beispielsweise demografische Veränderungen im Zeitverlauf in Gebieten analysieren, in denen sich seine Geschäfte befinden oder in denen er über den Bau eines neuen Geschäfts nachdenkt. Oder eine Versicherungsgesellschaft möchte ihr Wissen über Immobilienrisiken verbessern, indem sie die vorherrschenden Naturgefahrenrisiken in einem bestimmten Gebiet analysiert.
Die Verwendung von Standard-Gridsystemen wie S2 und H3 kann solche statistischen Aggregationen und räumlichen Analysen beschleunigen. Die Verwendung dieser Gridsysteme kann auch die Entwicklung von Analysen vereinfachen und die Entwicklungseffizienz verbessern.
Vergleiche mit Volkszählungsbezirken in den USA sind beispielsweise aufgrund der unterschiedlichen Größe der Bezirke nicht konsistent. Daher müssen Korrekturfaktoren angewendet werden, um vergleichbare Vergleiche zwischen Volkszählungsbezirken durchzuführen. Außerdem ändern sich Volkszählungsbezirke und andere administrative Grenzen im Laufe der Zeit und es ist ein gewisser Aufwand erforderlich, um diese Änderungen zu berücksichtigen. Mit Rastersystemen für die räumliche Analyse lassen sich solche Herausforderungen bewältigen.
Vektorsuche und Vektorindexe verwenden
Best Practice:Verwenden Sie die Vektorsuche und Vektorindizes für räumliche Anfragen zu den nächsten Nachbarn.
Die Vektorsuchfunktionen wurden in BigQuery eingeführt, um Machine-Learning-Anwendungsfälle wie semantische Suche, Ähnlichkeitserkennung und Retrieval Augmented Generation zu ermöglichen. Der Schlüssel zur Aktivierung dieser Anwendungsfälle ist eine Indexierungsmethode namens ungefähre Suche nach dem nächsten Nachbarn. Mit der Vektorsuche können Sie räumliche Anfragen zum nächsten 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 den Ergebnissen einer Suche nach dem nächsten Nachbarn ermitteln. Nachdem Sie den Radius festgelegt haben, verwenden Sie die Funktion ST_DWITHIN
, um nahegelegene Features zu ermitteln.
Stellen Sie sich beispielsweise vor, Sie möchten die zehn Gebäude finden, die einem bestimmten Ankergebäude, dessen Standort Sie bereits kennen, am nächsten liegen. Sie können die Schwerpunkte jedes Gebäudes als Vektor in einer neuen Tabelle speichern, die Tabelle indexieren und die Vektorsuche verwenden.
Für dieses Beispiel können Sie auch Overture Maps-Daten in BigQuery verwenden, um eine separate Tabelle mit Gebäudeformen zu erstellen, die einem interessierenden Gebiet und einem Vektor namens geom_vector
entsprechen. Das Gebiet von Interesse in diesem Beispiel ist die Stadt Norfolk im US-Bundesstaat Virginia, die durch den FIPS-Code 51710 dargestellt wird, wie im folgenden Codebeispiel zu sehen ist:
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 liegen:
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. Die Karte zeigt eine Gruppe von Gebäudeformen, die dem Ankergebäude am nächsten sind:
Wenn Sie diese Abfrage in der Google Cloud -Konsole ausführen, klicken Sie auf Job Information (Jobinformationen) und prüfen Sie, ob Vector Index Usage Mode (Verwendungsmodus für Vektorindex) auf FULLY_USED
festgelegt ist. Das bedeutet, dass bei der Abfrage der Vektorindex building_vector_index
verwendet wird, den Sie zuvor erstellt haben.
Große Formen unterteilen
Best Practice:Teilen Sie große Formen mit der Funktion ST_SUBDIVIDE
auf.
Mit der Funktion ST_SUBDIVIDE
können Sie große Formen oder lange Linien-Strings in kleinere Formen aufteilen.
Nächste Schritte
- Weitere Informationen zur Verwendung von Rastern für die räumliche Analyse
- Weitere Informationen zu geografischen Funktionen in BigQuery
- Informationen zum Verwalten von Vektorindexen
- Weitere Informationen zu Best Practices für die räumliche Indexierung und das Clustering in BigQuery
- Weitere Informationen zum Analysieren und Visualisieren raumbezogener Daten in BigQuery finden Sie unter Erste Schritte mit raumbezogenen Analysen.