Mit raumbezogenen Daten arbeiten

Mit raumbezogenen Analysen können Sie geografische Daten in BigQuery analysieren. Geografische Daten werden auch als raumbezogene Daten bezeichnet.

Zu den gängigen Objekttypen bei der Arbeit mit räumlichen Daten gehören die folgenden:

  • Eine Geometrie stellt eine Oberfläche auf der Erde dar. Sie wird häufig mithilfe von Punkten, Linien, Polygonen oder einer Sammlung von Punkten, Linien und Polygonen beschrieben. Eine Geometriesammlung ist eine Geometrie, die die räumliche Vereinigung aller Formen in der Sammlung darstellt.
  • Eine räumliche Funktion steht für ein logisches räumliches Objekt. Sie kombiniert eine Geometrie mit zusätzlichen anwendungsspezifischen Attributen.
  • Eine Sammlung räumlicher Funktionen besteht aus einer Reihe von räumlichen Funktionen.

In BigQuery stellt der Datentyp GEOGRAPHY eine Geometrie oder Geometriesammlung dar. Zur Darstellung von räumlichen Merkmalen erstellen Sie eine Tabelle mit einer GEOGRAPHY-Spalte für die Geometrie sowie mit zusätzlichen Spalten für die Attribute. Jede Tabellenzeile ist eine räumliche Funktion und die gesamte Tabelle steht für eine Sammlung räumlicher Funktionen.

Der Datentyp GEOGRAPHY beschreibt einen Punktsatz auf der Erdoberfläche. Ein Punktsatz ist eine Menge von Punkten, Linien und Polygonen auf dem WGS84-Referenzsphäroid mit geodätischen Kanten. Sie können den Datentyp GEOGRAPHY durch Aufrufen einer der geografischen Funktionen von GoogleSQL verwenden.

Raumbezogene Daten laden

Einzelne Punkte auf der Erde können einfach durch das Wertepaar Längengrad, Breitengrad beschrieben werden. Sie können beispielsweise eine CSV-Datei laden, die Werte für Längen- und Breitengrad enthält, und diese dann mit der Funktion ST_GEOGPOINT in GEOGRAPHY-Werte konvertieren.

Für komplexere geografische Standorte können Sie die folgenden raumbezogenen Datenformate in eine GEOGRAPHY-Spalte laden:

  • Well-known Text (WKT)
  • Well-known Binary (WKB)
  • GeoJSON
  • GeoParquet

WKT- oder WKB-Daten laden

WKT ist ein Textformat zur Beschreibung einzelner geometrischer Formen mit Punkten, Linien, Polygonen mit optionalen Löchern oder einer Sammlung von Punkten, Linien oder Polygonen. WKB ist die binäre Version des WKT-Formats. WKB kann für Formate, die keine Binärdaten wie JSON unterstützen, Hex-codiert werden.

Im Folgenden wird zum Beispiel ein Punkt in WKT definiert:

POINT(-121 41)

Zur Beschreibung einer räumlichen Funktion ist WKT normalerweise in ein Container-Dateiformat wie eine CSV-Datei oder in eine Datenbanktabelle eingebettet. Eine Dateizeile oder eine Tabellenzeile entspricht in der Regel der räumlichen Funktion. Die gesamte Datei oder die gesamte Tabelle entspricht der Funktionssammlung. Zum Laden von WKT-Daten in BigQuery geben Sie ein Schema an, das eine GEOGRAPHY-Spalte für die raumbezogenen Daten angibt.

Sie haben beispielsweise eine CSV-Datei mit folgenden Daten:

"POLYGON((-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35))",poly1
"POLYGON((-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66))",poly2
"POINT(1 2)",point1

Sie können diese Datei mit dem Befehl load des bq-Befehlszeilentools laden:

bq load --source_format=CSV \
  --schema="geography:GEOGRAPHY,name:STRING" \
  mydataset.mytable filename1.csv

Weitere Informationen zum Laden von Daten in BigQuery finden Sie unter Einführung in das Laden von Daten.

Sie können WKT-Daten in eine vorhandene BigQuery-Tabelle mit der Spalte GEOGRAPHY streamen, indem Sie Daten als String in der API-Anfrage serialisieren.

bq

Führen Sie den Befehl insert des bq-Befehlszeilentools aus:

echo '{"geo": "LINESTRING (-118.4085 33.9416, -73.7781 40.6413)"}' \
    | bq insert my_dataset.geo_table

Python

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Python API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

from google.cloud import bigquery
import shapely.geometry
import shapely.wkt

bigquery_client = bigquery.Client()

# This example uses a table containing a column named "geo" with the
# GEOGRAPHY data type.
table_id = "my-project.my_dataset.my_table"

# Use the Shapely library to generate WKT of a line from LAX to
# JFK airports. Alternatively, you may define WKT data directly.
my_geography = shapely.geometry.LineString(
    [(-118.4085, 33.9416), (-73.7781, 40.6413)]
)
rows = [
    # Convert data into a WKT string.
    {"geo": shapely.wkt.dumps(my_geography)},
]

#  table already exists and has a column
# named "geo" with data type GEOGRAPHY.
errors = bigquery_client.insert_rows_json(table_id, rows)
if errors:
    raise RuntimeError(f"row insert failed: {errors}")
else:
    print(f"wrote 1 row to {table_id}")

Weitere Informationen zum Streamen von Daten in BigQuery finden Sie unter Daten in BigQuery streamen.

Sie können einen WKT-Textstring mit der Funktion ST_GeogFromText in einen GEOGRAPHY-Wert konvertieren.

GeoJSON-Daten laden

GeoJSON ist ein JSON-basiertes Format für Geometrien und räumliche Funktionen. Im Folgenden wird zum Beispiel ein Punkt in GeoJSON definiert:

{ "type": "Point", "coordinates": [-121,41] }

GeoJSON-Daten können die folgenden Objekttypen enthalten:

  • Geometrieobjekte. Ein Geometrieobjekt ist eine räumliche Form, die als Vereinigung von Punkten, Linien und Polygonen mit optionalen Löchern beschrieben wird.
  • Funktionsobjekte. Ein Funktionsobjekt enthält eine Geometrie sowie zusätzliche Name/Wert-Paare, deren Bedeutung anwendungsspezifisch ist.
  • Funktionssammlungen. Eine Sammlung Funktionen besteht aus einer Reihe von Funktionsobjekten.

Es gibt zwei Möglichkeiten, GeoJSON-Daten in BigQuery zu laden:

Durch Zeilenumbruch getrennte GeoJSON-Dateien laden

Eine durch Zeilenumbruch getrennte GeoJSON-Datei enthält eine Liste von GeoJSON-Funktionsobjekten, eines pro Zeile in der Datei. Ein GeoJSON-Funktionsobjekt ist ein JSON-Objekt mit den folgenden Mitgliedern:

  • type Für Featureobjekte muss der Wert Feature lauten. BigQuery validiert den Wert, fügt ihn aber nicht in das Tabellenschema ein.

  • geometry Der Wert ist ein GeoJSON-Geometry-Objekt oder null. BigQuery konvertiert dieses Mitglied in einen GEOGRAPHY-Wert.

  • properties Der Wert ist ein beliebiges JSON-Objekt oder null. Wenn der Wert nicht null ist, lädt BigQuery jedes Mitglied des JSON-Objekts als separate Tabellenspalte. Weitere Informationen darüber, wie BigQuery JSON-Datentypen parst, finden Sie unter Details zum Laden von JSON-Daten.

  • id. Optional. Wenn vorhanden, ist der Wert entweder ein String oder eine Zahl. BigQuery lädt diesen Wert in eine Spalte mit dem Namen id.

Wenn das Featureobjekt andere Mitglieder enthält, die hier nicht aufgeführt sind, konvertiert BigQuery diese Mitglieder direkt in Tabellenspalten.

Sie können eine durch neue Zeilen getrennte GeoJSON-Datei mit dem Befehl bq load des bq-Befehlszeilentools wie folgt laden:

bq load \
 --source_format=NEWLINE_DELIMITED_JSON \
 --json_extension=GEOJSON \
 --autodetect \
 DATASET.TABLE \
 FILE_PATH_OR_URI

Ersetzen Sie Folgendes:

  • DATASET ist der Name des Datasets.
  • TABLE ist der Name der Zieltabelle.
  • FILE_PATH_OR_URI ist ein Pfad zu einer lokalen Datei oder einem Cloud Storage-URI.

Im vorherigen Beispiel wird die automatische Schemaerkennung aktiviert. Wenn Sie besser steuern möchten, wie BigQuery die Werte im Objekt properties konvertiert, können Sie stattdessen ein explizites Schema angeben. Weitere Informationen finden Sie unter Schemas angeben. Wenn Sie ein explizites Schema angeben, nehmen Sie keine übergeordnete type-Spalte in die Schemadefinition auf. Legen Sie für jedes Mitglied des Mitglieds properties eine separate Spalte fest, keine einzelne verschachtelte Spalte.

Gemäß RFC 7946 ist eine vollständige GeoJSON-Datenstruktur ein einzelnes JSON-Objekt. Viele Systeme exportieren GeoJSON-Daten als ein einzelnes FeatureCollection-Objekt, das alle Geometrien enthält. Um dieses Format in BigQuery zu laden, müssen Sie die Datei konvertieren. Entfernen Sie dazu das FeatureCollection-Objekt auf Stammebene und teilen Sie die einzelnen Featureobjekte in separate Zeilen auf. Der folgende Befehl verwendet beispielsweise das jq-Befehlszeilentool, um eine GeoJSON-Datei in ein durch Zeilenumbruch getrenntes Format aufzuteilen:

cat ~/file1.json | jq -c '.features[]' > converted.json

Externe Tabelle aus einer durch Zeilenumbruch getrennten GeoJSON-Datei erstellen

Sie können eine in Cloud Storage gespeicherte GeoJSON-Datei mit Zeilenumbrüchen abfragen, indem Sie eine externe Tabelle erstellen. Verwenden Sie zum Erstellen der externen Tabelle die DDL-Anweisung CREATE EXTERNAL TABLE. Setzen Sie in der OPTIONS-Klausel die Option format auf NEWLINE_DELIMITED_JSON und die Option json_extension auf GEOJSON.

Beispiel:

CREATE EXTERNAL TABLE mydataset.table1 OPTIONS (
  format="NEWLINE_DELIMITED_JSON",
  json_extension = 'GEOJSON',
  uris = ['gs://mybucket/geofile.json']
);

GeoJSON-Geometriedaten laden

Raumbezogene Analysen unterstützen das Laden einzelner GeoJSON-Geometrieobjekte, die als Textstrings in andere Dateitypen eingebettet sind. Sie können beispielsweise eine CSV-Datei laden, in der eine der Spalten ein GeoJSON-Geometrieobjekt enthält.

Wenn Sie diese Art von GeoJSON-Daten in BigQuery laden möchten, stellen Sie ein Schema bereit, das eine Spalte GEOGRAPHY für die GeoJSON-Daten angibt. Sie müssen das Schema manuell angeben. Wenn andererseits die automatische Erkennung aktiviert ist, lädt BigQuery die Daten als STRING-Wert.

Geospatiale Analysen unterstützen nicht das Laden von GeoJSON-Funktionsobjekten oder Funktionssammlungen. Wenn Sie Funktionsobjekte laden müssen, sollten Sie durch Zeilenumbruch getrennte GeoJSON-Dateien verwenden.

Sie können GeoJSON-Daten in eine vorhandene BigQuery-Tabelle mit der Spalte GEOGRAPHY streamen, indem Sie Daten als String in der API-Anfrage serialisieren.

bq

Führen Sie den Befehl insert des bq-Befehlszeilentools aus:

echo '{"geo": "{\"type\": \"LineString\", \"coordinates\": [[-118.4085, 33.9416], [-73.7781, 40.6413]]}"}' \
  | bq insert my_dataset.geo_table

Python

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Python API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

import geojson
from google.cloud import bigquery

bigquery_client = bigquery.Client()

# This example uses a table containing a column named "geo" with the
# GEOGRAPHY data type.
table_id = "my-project.my_dataset.my_table"

# Use the python-geojson library to generate GeoJSON of a line from LAX to
# JFK airports. Alternatively, you may define GeoJSON data directly, but it
# must be converted to a string before loading it into BigQuery.
my_geography = geojson.LineString([(-118.4085, 33.9416), (-73.7781, 40.6413)])
rows = [
    # Convert GeoJSON data into a string.
    {"geo": geojson.dumps(my_geography)}
]

#  table already exists and has a column
# named "geo" with data type GEOGRAPHY.
errors = bigquery_client.insert_rows_json(table_id, rows)
if errors:
    raise RuntimeError(f"row insert failed: {errors}")
else:
    print(f"wrote 1 row to {table_id}")

Sie können ein GeoJSON-Geometrieobjekt mithilfe der Funktion ST_GEOGFROMGEOJSON in einen GEOGRAPHY-Wert konvertieren. Sie können die Geometrien beispielsweise als STRING-Werte speichern und dann eine Abfrage ausführen, die ST_GEOGFROMGEOJSON aufruft.

GeoParquet-Dateien laden

GeoParquet ist eine Spezifikation, die dem Parquet-Dateiformat raumbezogene Typen hinzufügt. GeoParquet enthält Metadaten, die den enthaltenen georäumlichen Daten eine eindeutige Semantik verleihen und Interpretationsprobleme vermeiden, die bei anderen Formaten für georäumliche Daten auftreten.

Beim Laden von Parquet-Dateien prüft BigQuery, ob GeoParquet-Metadaten vorhanden sind. Wenn GeoParquet-Metadaten vorhanden sind, werden in BigQuery standardmäßig alle darin beschriebenen Spalten in eine entsprechende GEOGRAPHY-Spalte geladen. Weitere Informationen zum Laden von Parquet-Dateien finden Sie unter Parquet-Daten laden.

Externe Tabelle aus GeoParquet-Daten erstellen

In externen Tabellen, die auf GeoParquet-Dateien verweisen, werden relevante Spalten dem Typ GEOGRAPHY zugeordnet.

Statistiken, die in der GeoParquet-Datei verfügbar sind (bbox, covering), werden nicht verwendet, um Abfragen über eine externe Tabelle zu beschleunigen.

Koordinatensysteme und Kanten

Bei raumbezogenen Analysen stellen Punkte Positionen auf der Oberfläche eines WGS84-Sphäroids, ausgedrückt als Längengrad plus geodätischer Breitengrad, dar. Eine Kante ist ein sphärisches geodätisches Objekt zwischen zwei Endpunkten. Das heißt, Kanten sind der kürzeste Pfad auf der Oberfläche einer Sphäre.

Das WKT-Format bietet kein Koordinatensystem. Beim Laden von WKT-Daten wird bei raumbezogenen Analysen davon ausgegangen, dass die Daten WGS84-Koordinaten mit sphärischen Kanten verwenden. Achten Sie darauf, dass Ihre Quelldaten mit dem Koordinatensystem übereinstimmen, es sei denn, die Geografien sind klein genug, dass der Unterschied zwischen sphärischen und planaren Kanten ignoriert werden kann.

GeoJSON nutzt explizit WGS84-Koordinaten mit planaren Kanten. Beim Laden von GeoJSON-Daten werden raumbezogene Analysen planare Kanten in sphärische Kanten umgewandelt. Raumbezogene Analysen fügen der Linie bei Bedarf zusätzliche Punkte hinzu, sodass die konvertierte Kantenfolge innerhalb von zehn Metern der ursprünglichen Linie verbleibt. Dieser Vorgang wird als Tesselierung oder als ungleichmäßige Verdichtung bezeichnet. Sie können den Tesselierungsvorgang nicht direkt steuern.

Verwenden Sie WKT, um Standorte mit sphärischen Kanten zu laden. Für das Laden von Regionen mit planaren Kanten, die häufig als Geometrien bezeichnet werden, ist es am einfachsten, GeoJSON zu verwenden. Wenn Ihre Geometriedaten jedoch bereits im WKT-Format vorliegen, besteht eine weitere Möglichkeit darin, die Daten als STRING-Typ zu laden und dann die Funktion ST_GEOGFROMTEXT zur Konvertierung in GEOGRAPHY-Werte zu verwenden. Setzen Sie den Parameter planar auf TRUE, um die Daten als planar zu interpretieren.

GeoParquet-Dateien enthalten Metadaten zum Koordinatensystem und zu den Kanten, die zum Erstellen der Daten verwendet wurden. Beim Lesen von GeoParquet-Dateien mit ebenen Kanten werden diese bei raumbezogenen Analysen in sphärische Kanten umgewandelt. GeoParquet-Dateien mit anderen Koordinatensystemen als WGS84 werden abgelehnt.

Achten Sie bei der Auswahl eines Austauschformats darauf, das von Ihren Quelldaten verwendete Koordinatensystem zu verstehen. Die meisten Systeme unterstützen explizit das Parsen von Geografie (statt der Geometrie) von WKT oder sie gehen von planaren Kanten aus.

In den Koordinaten sollte als Erstes der Längengrad und als Zweites der Breitengrad in Sekunden angegeben sein. Bei langen Segmenten oder Kanten in der Geografie ist eine Tesselierung erforderlich, da raumbezogene Analysen sie als sphärische geodätische Objekte interpretieren, die möglicherweise nicht mit dem Koordinatensystem übereinstimmen, aus dem die Daten stammen.

Polygonausrichtung

Auf einer Kugel hat jedes Polygon ein komplementäres Polygon. Zu einem Polygon, mit dem die Kontinente der Erde beschrieben werden, gehört beispielsweise ein komplementäres Polygon, das die Ozeane der Erde beschreibt. Da die beiden Polygone durch dieselben Begrenzungsringe beschrieben werden, sind Regeln erforderlich, um zu klären, welches der beiden Polygone durch einen bestimmten WKT-String beschrieben wird.

Wenn Sie WKT- und WKB-Strings aus Dateien laden oder per Streaming übernehmen, gehen raumbezogene Analysen davon aus, dass die Polygone in der Eingabe in folgender Weise ausgerichtet sind: Wenn Sie der Begrenzung des Polygons in der Reihenfolge der Eingabescheitelpunkte folgen, liegt das Innere des Polygons auf der linken Seite. Raumbezogene Analysen wenden beim Exportieren von Geografieobjekten in WKT- und WKB-Strings die gleiche Regel an.

Wenn Sie die Funktion ST_GeogFromText zum Konvertieren eines WKT-Strings in einen GEOGRAPHY-Wert verwenden, gibt der Parameter oriented an, wie die Funktion das Polygon bestimmt:

  • FALSE: Interpretieren der Eingabe als Polygon mit der kleineren Fläche. Dies ist das Standardverhalten.

  • TRUE: Verwenden Sie die oben beschriebene Ausrichtungsregel links. Mit dieser Option können Sie Polygone laden, deren Fläche größer als eine Halbkugel ist.

Da GeoJSON-Strings auf einer planaren Karte definiert sind, kann die Ausrichtung eindeutig bestimmt werden, auch wenn die Eingabe nicht der in der GeoJSON-Formatspezifikation definierten Ausrichtungsregel RFC 7946 entspricht.

Umgang mit falsch formatierten raumbezogenen Daten

Wenn Sie raumbezogene Daten aus anderen Tools in BigQuery laden, können aufgrund von ungültigen WKT- oder GeoJSON-Daten Conversion-Fehler auftreten. Eine Fehlermeldung wie Edge K has duplicate vertex with edge N weist zum Beispiel darauf hin, dass das Polygon doppelte Scheitelpunkte (neben dem ersten und letzten) enthält.

Zur Vermeidung von Formatierungsproblemen lassen sich mit einer Funktion standardkonforme Ausgaben generieren. Wenn Sie beispielsweise Daten aus PostGIS exportieren, können Sie mit der PostGIS-Funktion ST_MakeValid die Ausgabe standardisieren. Alternativ können Sie die Daten als Text importieren und dann durch Aufrufen von ST_GEOGFROMTEXT oder ST_GEOGFROMGEOJSON mit dem Parameter make_valid konvertieren. Wenn make_valid TRUE ist, versucht diese Funktionen, ungültige Polygone zu reparieren.

Zum Ermitteln oder Ignorieren falsch formatierter Daten haben Sie die Möglichkeit, problematische Daten mit dem Funktionspräfix SAFE auszugeben. Die folgende Abfrage verwendet beispielsweise das Präfix SAFE zum Abrufen fehlerhaft formatierter räumlicher Daten.

SELECT
  geojson AS bad_geojson
FROM
  mytable
WHERE
  geojson IS NOT NULL
  AND SAFE.ST_GeogFromGeoJson(geojson) IS NULL

Einschränkungen

Raumbezogene Analysen unterstützen die folgenden Funktionen in raumbezogenen Formaten nicht:

  • Dreidimensionale Geometrien. Dazu gehören das Suffix „Z“ im WKT-Format und die Höhenkoordinaten im GeoJSON-Format.
  • Lineare Referenzsysteme. Dazu gehört auch das Suffix „M“ im WKT-Format.
  • WKT-Geometrieobjekte außer den Geometrie-Primitiven und mehrteiligen Geometrien. Insbesondere unterstützen raumbezogene Analysen nur Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon und GeometryCollection.

Weitere Informationen zu spezifischen Einschränkungen für GeoJson- und WKT-Eingabeformate finden Sie unter ST_GeogFromGeoJson und ST_GeogFromText.

Raumbezogene Google Earth Engine-Daten laden

Google Earth Engine ist eine raumbezogene Datenplattform, die mithilfe von Rasterdaten Informationen aus Satelliten- und Erdbeobachtungsbildern kompiliert und analysiert. Dabei sind die Daten über ein Raster von Zellen organisiert, die Informationen zu digitalen Bildern darstellen. Während BigQuery hauptsächlich mit tabellarischen Vektordaten arbeitet, können Nutzer ihre BigQuery-Daten zusammen mit Rasterdaten aus Earth Engine verwenden, um sowohl Vektor- als auch Raster-Datasets in ihre Workflows zu integrieren.

Informationen zum Exportieren von Earth Engine-Daten nach BigQuery finden Sie unter Nach BigQuery exportieren.

Raumbezogene Daten umwandeln

Wenn Ihre Tabelle eigene Spalten für Längen- und Breitengrad enthält, können Sie die Werte in geografische Werte umwandeln, indem Sie GoogleSQL-Geografiefunktionen wie ST_GeogPoint verwenden. Wenn Sie beispielsweise zwei DOUBLE-Spalten für Längen- und Breitengrad haben, können Sie mithilfe der folgenden Abfrage eine Standortspalte erstellen.

SELECT
  *,
  ST_GeogPoint(longitude, latitude) AS g
FROM
  mytable

BigQuery kann WKT- und GeoJSON-Strings in geografische Typen umwandeln. Wenn Ihre Daten in einem anderen Format wie Shapefiles vorliegen, verwenden Sie ein externes Tool, um die Daten in ein unterstütztes Dateiformat zu konvertieren, etwa eine CSV-Datei. Dabei müssen GEOGRAPHY-Spalten als WKT- oder GeoJSON-Strings codiert sein.

Raumbezogene Daten partitionieren und gruppieren

Tabellen, die GEOGRAPHY-Spalten enthalten, können partitioniert und gruppiert werden. Sie haben auch die Möglichkeit, eine GEOGRAPHY-Spalte als Clustering-Spalte zu verwenden. Eine GEOGRAPHY-Spalte kann jedoch nicht als Partitionierungsspalte genutzt werden.

Wenn Sie GEOGRAPHY-Daten in einer Tabelle speichern und Ihre Abfragen Daten mithilfe eines räumlichen Prädikats filtern, müssen Sie darauf achten, dass die Tabelle nach der Spalte GEOGRAPHY gruppiert ist. Dies verbessert in der Regel die Abfrageleistung und senkt gegebenenfalls auch die Kosten. Ein räumliches Prädikat ruft eine boolesche geografische Funktion mit einer Spalte vom Typ GEOGRAPHY als Argument auf. Im folgenden Beispiel wird ein räumliches Prädikat verwendet, das die Funktion ST_DWithin nutzt:

WHERE ST_DWithin(geo, ST_GeogPoint(longitude, latitude), 100)

JOINs mit räumlichen Daten verwenden

Räumliche JOINs sind Joins zweier Tabellen mit einer geografischen Prädikatsfunktion in der WHERE-Klausel. Beispiel:

-- how many stations within 1 mile range of each zip code?
SELECT
    zip_code AS zip,
    ANY_VALUE(zip_code_geom) AS polygon,
    COUNT(*) AS bike_stations
FROM
    `bigquery-public-data.new_york.citibike_stations` AS bike_stations,
    `bigquery-public-data.geo_us_boundaries.zip_codes` AS zip_codes
WHERE ST_DWithin(
         zip_codes.zip_code_geom,
         ST_GeogPoint(bike_stations.longitude, bike_stations.latitude),
         1609.34)
GROUP BY zip
ORDER BY bike_stations DESC

Räumliche Joins lassen sich mit festen geografischen Daten besser ausführen. Im obigen Beispiel ergeben sich die geografischen Werte aus der Abfrage. Der Join ist aber leistungsfähiger, wenn die geografischen Werte in einer BigQuery-Tabelle gespeichert sind.

Die folgende Abfrage ruft beispielsweise die Längengrad/Breitengrad-Paare ab und konvertiert sie in geografische Punkte. Wenn Sie diese Abfrage ausführen, geben Sie eine neue Zieltabelle zum Speichern der Abfrageergebnisse an.

SELECT
  *,
  ST_GeogPoint(pLongitude, pLatitude) AS p
FROM
  mytable

BigQuery implementiert optimierte räumliche JOINs für INNER JOIN- und CROSS JOIN-Operatoren mit den folgenden GoogleSQL-Prädikatsfunktionen:

Räumliche Joins sind nicht optimiert:

  • Für LEFT, RIGHT oder FULL OUTER Joins
  • Wenn ANTI Joins verwendet werden
  • Wenn das räumliche Prädikat negiert wird

Ein JOIN, der das Prädikat ST_DWithin verwendet, wird nur optimiert, wenn der Entfernungsparameter ein konstanter Ausdruck ist.

Räumliche Daten exportieren

Wenn Sie räumliche Daten aus BigQuery exportieren, werden die Werte von GEOGRAPHY-Spalten immer als WKT-Strings formatiert. Für den Export von Daten im GeoJSON-Format verwenden Sie die Funktion ST_AsGeoJSON.

Wenn die Tools, mit denen Sie die exportierten Daten analysieren, den Datentyp GEOGRAPHY nicht unterstützen, können Sie die Spaltenwerte mit einer geografischen Funktion wie ST_AsText oder ST_AsGeoJSON in Strings konvertieren. Raumbezogene Analysen fügen der Linie bei Bedarf zusätzliche Punkte hinzu, sodass die konvertierte Kantenfolge innerhalb von zehn Metern der ursprünglichen geodätischen Linie verbleibt.

Bei der folgenden Abfrage wird beispielsweise ST_AsGeoJSON zur Konvertierung von GeoJSON-Werten in Strings verwendet:

SELECT
  ST_AsGeoJSON(ST_MakeLine(ST_GeogPoint(1,1), ST_GeogPoint(3,2)))

Die sich daraus ergebenden Daten sollten in etwa so aussehen:

{ "type": "LineString", "coordinates": [ [1, 1], [1.99977145571783, 1.50022838764041], [2.49981908082299, 1.75018082434274], [3, 2] ] }

Die GeoJSON-Linie hat zwei zusätzliche Punkte. Diese Punkte werden von den raumbezogenen Analysen hinzugefügt, damit die GeoJSON-Linie exakt dem Pfad der ursprünglichen Linie entspricht.

Nächste Schritte