Best Practices für die geografische Analyse
In diesem Dokument werden Best Practices zur Optimierung der Leistung von georäumlichen Abfragen in BigQuery beschrieben. Mit diesen Best Practices können Sie die Leistung verbessern und Kosten und Latenz senken.
Datasets können große Sammlungen von Polygonen, Multipolygonformen und Linienstrings enthalten, um komplexe Elemente darzustellen, z. B. Straßen, Grundstücke und Überflutungsgebiete. Jede Form kann Tausende von Punkten enthalten. Bei den meisten geografischen Vorgängen in BigQuery (z. B. bei Überschneidungen und Entfernungsberechnungen) besucht der zugrunde liegende Algorithmus in der Regel die meisten Punkte in jeder Form, um ein Ergebnis zu erzielen. Bei einigen Vorgängen besucht der Algorithmus alle Punkte. Bei komplexen Formen kann das Aufrufen jedes Punkts die Kosten und die Dauer der räumlichen Vorgänge 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 BigQuery-geospatialen Tabellen nach einer geografischen Spalte gruppiert sind.
Formen vereinfachen
Best Practice:Verwenden Sie die Funktionen „Vereinfachen“ und „An Raster anpinnen“, um eine vereinfachte Version des ursprünglichen Datensatzes als materialisierte Ansicht zu speichern.
Viele komplexe Formen mit einer großen Anzahl von Punkten können ohne großen Genauigkeitsverlust vereinfacht werden. Verwenden Sie die BigQuery-Funktionen ST_SIMPLIFY
und ST_SNAPTOGRID
einzeln 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 Datensatzes als materialisierte Ansicht zu speichern, die automatisch anhand der Basistabelle auf dem neuesten Stand gehalten wird.
Die Vereinfachung von Formen ist in den folgenden Anwendungsfällen am nützlichsten, um die Kosten und Leistung eines Datensatzes zu verbessern:
- Die Ähnlichkeit mit der tatsächlichen Form muss hoch sein.
- Sie müssen Vorgänge mit hoher Präzision ausführen.
- Sie möchten Visualisierungen beschleunigen, ohne dass die Formdetails sichtbar beeinträchtigt werden.
Das folgende Codebeispiel zeigt, wie die Funktion ST_SIMPLIFY
auf einer Basistabelle mit einer GEOGRAPHY
-Spalte namens geom
angewendet wird. Der Code vereinfacht Formen und entfernt Punkte, ohne dass die Kanten einer Form um mehr als die angegebene Toleranz von 1,0 Metern verschoben 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 die Punkte mit der Funktion ST_SNAPTOGRID
an ein Raster mit einer Auflösung von 0,00001 Grad angedockt werden:
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, also 10e-5 = 0,00001. Im schlimmsten Fall, also am Äquator, entspricht das einer Auflösung von etwa 1 Meter.
Nachdem Sie diese Ansichten erstellt haben, fragen Sie die base_mv
-Ansicht mit derselben Abfragesemantik ab, die Sie auch für die Basistabelle verwenden würden. Mit dieser Methode können Sie schnell eine Reihe 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 Anwendungsfälle für Messungen die erforderliche Genauigkeit fest. 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. beim Messen der Entfernung zwischen einem Gebäude und dem nächsten Gewässer, sollten Sie einen kleineren Grenzwert von maximal 1 Meter verwenden. Wenn Sie kleinere Grenzwerte verwenden, werden weniger Punkte aus der angegebenen Form entfernt.
Wenn Sie Kartenebenen aus einem Webdienst bereitstellen, können Sie mit dem bigquery-geotools-Projekt, einem Geoserver-Treiber, der die Bereitstellung räumlicher Ebenen aus BigQuery ermöglicht, materialisierte Ansichten für verschiedene Zoomstufen vorab berechnen. Mit diesem Treiber werden mehrere materialisierte Ansichten mit unterschiedlichen ST_SIMPLIFY
-Grenzwertparametern erstellt, damit bei höheren Zoomstufen weniger Details gesendet werden.
Punkte und Rechtecke verwenden
Best Practice:Reduzieren Sie die Form auf einen Punkt oder ein Rechteck, um ihren Standort 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 sind für die Darstellung des Standorts der Form optimiert.
Sie können den geografischen Mittelpunkt einer Form (den Centroid) verwenden, um den Standort der gesamten Form darzustellen. Verwenden Sie ein Rechteck, das die Form enthält, um den Umfang der Form zu erstellen. Mit diesem können Sie den Standort der Form darstellen und Informationen zu ihrer relativen Größe beibehalten.
Die Verwendung von Punkten und Rechtecken ist am besten geeignet, um die Kosten und Leistung eines Datensatzes zu verbessern, wenn Sie die Entfernung zwischen zwei Punkten messen möchten, 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 kann die Anzahl der Vergleiche, die bei Verwendung der Funktionen ST_DISTANCE
oder ST_DWITHIN
ausgeführt werden, durch die Vorberechnung von Parzellenmittelpunkten mit der Funktion ST_CENTROID
in Kombination mit der im Abschnitt Formen vereinfachen dieses Dokuments beschriebenen Methode reduziert werden. Bei Verwendung der Funktion ST_CENTROID
muss der Parzellenmittelpunkt in die Berechnung einbezogen werden. Durch die Vorberechnung der Parzellenmittelpunkte auf diese Weise kann auch die Leistungsvariabilität reduziert werden, da unterschiedliche Parzellenformen wahrscheinlich unterschiedliche Punktzahlen enthalten.
Eine Variante dieser Methode besteht darin, die Funktion ST_BOUNDINGBOX
anstelle der Funktion ST_CENTROID
zu verwenden, um einen rechteckigen Umriss um die Eingabeform zu berechnen. Dies 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 gleichbleibende Leistung, da die Ausgabe der ST_BOUNDINGBOX
-Funktion immer nur vier Punkte enthält, die berücksichtigt werden müssen. Das Ergebnis des Begrenzungsrahmens hat den Typ STRUCT
. Sie müssen die Entfernungen also manuell berechnen oder die Vektorindexmethode verwenden, die weiter unten in diesem Dokument beschrieben wird.
Umrisse verwenden
Best Practice:Verwenden Sie einen Umriss, um die Position einer Form zu optimieren.
Stellen Sie sich vor, Sie würden eine Form in einen Schrumpfschlauch einschließen und die Begrenzung des Schrumpfschlauchs berechnen. Diese Begrenzung wird als Hull bezeichnet. Bei einer konvexen Hülle sind alle Winkel der resultierenden Form konvex. Wie bei der Ausdehnung einer Form behält eine konvexe Hülle einige Informationen über die relative Größe und Proportionen der zugrunde liegenden Form bei. Bei der Verwendung eines Hulls müssen jedoch mehr Punkte gespeichert und bei nachfolgenden Analysen berücksichtigt werden.
Mit der Funktion ST_CONVEXHULL
können Sie die Darstellung des Standorts der Form optimieren. Die Verwendung dieser Funktion verbessert die Genauigkeit, geht aber zu Lasten der Leistung. Die Funktion ST_CONVEXHULL
ähnelt der Funktion ST_EXTENT
, mit der Ausnahme, dass die Ausgabeform mehr Punkte enthält und die Anzahl der Punkte je nach Komplexität der Eingabeform 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 Funktion ST_CONVEXHULL
jedoch ein gutes Gleichgewicht zwischen Kosten, Leistung und Genauigkeit.
Rastersysteme verwenden
Best Practice:Verwenden Sie geografische Rastersysteme, um Gebiete zu vergleichen.
Wenn Sie in Ihren Anwendungsfällen Daten in lokalisierten Gebieten zusammenfassen und statistische Zusammenfassungen dieser Gebiete miteinander vergleichen möchten, können Sie ein standardisiertes Rastersystem verwenden, um verschiedene Gebiete zu vergleichen.
Ein Einzelhändler möchte beispielsweise die demografischen Veränderungen im Zeitverlauf in Gebieten analysieren, in denen sich seine Geschäfte befinden oder in denen er ein neues Geschäft eröffnen möchte. Oder eine Versicherungsgesellschaft möchte ihr Wissen über Immobilienrisiken verbessern, indem sie die vorherrschenden Naturgefahrenrisiken in einem bestimmten Gebiet analysiert.
Mithilfe von Standard-Rastersystemen wie S2 und H3 lassen sich solche statistischen Aggregationen und räumlichen Analysen beschleunigen. Die Verwendung dieser Rastersysteme kann auch die Entwicklung von Analysen vereinfachen und die Entwicklungseffizienz verbessern.
So sind beispielsweise Vergleiche mit Zählbezirken in den USA aufgrund von Größenabweichungen nicht einheitlich. Um Vergleiche zwischen Zählbezirken auf gleicher Grundlage durchzuführen, müssen Korrekturfaktoren angewendet werden. Außerdem ändern sich Zensusbezirke und andere Verwaltungsgrenzen im Laufe der Zeit und es ist mit Aufwand verbunden, diese Änderungen zu korrigieren. Mithilfe von Rastersystemen für räumliche Analysen können Sie diese Herausforderungen bewältigen.
Vektorsuche und Vektorindexe verwenden
Best Practice:Verwenden Sie die Vektorsuche und Vektorindizes für geospatiale Abfragen vom Typ „Nächster Nachbar“.
Die Vektorsuchfunktionen wurden in BigQuery eingeführt, um Anwendungsfälle für maschinelles Lernen wie die semantische Suche, die Ähnlichkeitserkennung und die Retrieval Augmented Generation zu ermöglichen. Für diese Anwendungsfälle ist eine Indexierungsmethode namens ungefähre Suche nach dem nächsten Nachbarn erforderlich. Mit der Vektorsuche können Sie georäumliche Abfragen nach dem nächsten Nachbarn beschleunigen und vereinfachen, indem Sie Vektoren vergleichen, die Punkte im Raum darstellen.
Mit der Vektorsuche können Sie nach Features nach 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ächstgelegenen ermitteln. Nachdem Sie den Radius festgelegt haben, verwenden Sie die Funktion ST_DWITHIN
, um nahe gelegene Elemente zu ermitteln.
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 Centroide jedes Gebäudes als Vektor in einer neuen Tabelle speichern, die Tabelle indexieren und mit der Vektorsuche suchen.
In diesem Beispiel können Sie auch Overture Maps-Daten in BigQuery verwenden, um eine separate Tabelle mit Gebäudeformen zu erstellen, die einem Interessensgebiet und einem Vektor namens geom_vector
entsprechen. Das Gebiet von Interesse in diesem Beispiel ist die Stadt Norfolk, Virginia, USA, mit dem FIPS-Code 51710, wie im folgenden Codebeispiel dargestellt:
CREATE TABLE geo-solution-demos.vector_search.norfolk_buildings
AS (
SELECT
*,
[
ST_X(ST_CENTROID(building.geometry)),
ST_Y(ST_CENTROID(building.geometry))] AS geom_vector
FROM geo-solution-demos.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 ein Vektorindex für die Tabelle erstellt wird:
CREATE
vector index building_vector_index
ON
`geo-solution-demos.vector_search.norfolk_buildings`(geom_vector)
OPTIONS (index_type = 'IVF')
Mit dieser Abfrage werden die zehn Gebäude ermittelt, die einem bestimmten Ankergebäude am nächsten sind, das durch anchor_building_id
dargestellt wird:
declare anchor_building_id STRING;
SET anchor_building_id = '08b2af6202ce5fff02007d1778948bc4';
SELECT base.*
FROM
VECTOR_SEARCH(
TABLE `geo-solution-demos.vector_search.norfolk_buildings`,
'geom_vector',
(
SELECT
geom_vector
FROM
`geo-solution-demos.vector_search.norfolk_buildings`
WHERE id = anchor_building_id
),
top_k => 10,
distance_type => 'EUCLIDEAN',
options => '{"fraction_lists_to_search":0.1}')
Wenn Sie die Geodaten in BigQuery Geo Viz aufrufen, sehen Sie als Ausgabe einen Cluster von Gebäudeformen, die dem Ankergebäude am nächsten sind, wie in der folgenden Abbildung dargestellt:
Wenn Sie diese Abfrage in der Google Cloud Console ausführen, klicken Sie auf Jobinformationen und prüfen Sie, ob Verwendungsmodus des Vektorindexes auf FULLY_USED
festgelegt ist. Das bedeutet, dass für die Abfrage der Vektorindex building_vector_index
verwendet wird, den Sie zuvor erstellt haben.
Große Formen teilen
Best Practice:Große Formen mit der Funktion ST_SUBDIVIDE
teilen
Mit der Funktion ST_SUBDIVIDE
können Sie große Formen oder lange Linienstrings in kleinere Formen aufteilen.
Nächste Schritte
- Weitere Informationen zum Verwenden von Rastersystemen für die räumliche Analyse
- Weitere Informationen zu geografischen Funktionen in BigQuery
- Weitere Informationen zum Verwalten von Vektorindexen
- Weitere Informationen zu Best Practices für die räumliche Indexierung und ‑Clusterung in BigQuery
- Weitere Informationen zum Analysieren und Visualisieren raumbezogener Daten in BigQuery finden Sie unter Erste Schritte mit raumbezogenen Analysen.