Datentypen für Geodaten¶
Snowflake bietet native Unterstützung für räumliche Merkmale wie Punkte, Linien und Polygone auf der Erdoberfläche.
Unter diesem Thema:
GEOGRAPHY-Datentyp¶
Snowflake stellt den Datentyp GEOGRAPHY zur Verfügung, der die Erde so modelliert, als wäre sie eine perfekte Kugel.
Der Datentyp GEOGRAPHY verwendet WGS-84 als globales Georeferenzsystem (EPSG-ID 4326; Einzelheiten siehe https://spatialreference.org/ref/epsg/wgs-84/).
Punkte auf der Erde werden als Längengrade (von -180 Grad bis +180 Grad) und Breitengrade (-90 bis +90) dargestellt.
Höhenangaben werden derzeit nicht unterstützt.
Liniensegmente werden als geodätische Bögen auf der Erdoberfläche interpretiert.
Snowflake bietet auch Geodatenfunktionen, die den Datentyp GEOGRAPHY verarbeiten.
Eingabe- und Ausgabeformate von Geodaten¶
Die Eingabe- und Ausgabeformate des Datentyps GEOGRAPHY sowie die Namen und die Semantik der Geodatenfunktionen entsprechen den Industriestandards. Folgende Eingabe- und Ausgabeformate werden unterstützt:
Well-Known Text (WKT)
Well-Known Binary (WKB)
Erweitertes WKT und WKB (EWKT und EWKB) (siehe den Hinweis zur Behandlung von EWKT und EWKB)
IETF GeoJSON (siehe den Hinweis zur Verwendung von GeoJSON)
Möglicherweise sind auch folgende Referenzen hilfreich:
Simple Feature Access des Open Geospatial mit „Common Architecture“ und SQL-Option:
Jede Abweichung von diesen Standards wird ausdrücklich in der Snowflake-Dokumentation vermerkt.
Hinweis zur Verwendung von GeoJSON¶
Die Standards WKT und WKB geben nur ein Format an. Die Semantik von WKT/WKB-Objekten hängt vom Referenzsystem ab, zum Beispiel Ebene oder Kugel.
Der GeoJSON-Standard gibt andererseits sowohl ein Format als auch seine Semantik an: GeoJSON-Punkte sind explizit WGS-84-Koordinaten, und GeoJSON-Liniensegmente werden als ebene Kanten (gerade Linien) betrachtet.
Im Gegensatz dazu interpretiert der Datentyp GEOGRAPHY von Snowflake alle Liniensegmente als geodätische Bögen, einschließlich derjenigen, die im GeoJSON-Format eingegeben oder ausgegeben werden. Im Wesentlichen behandelt Snowflake GeoJSON-Daten als JSON-formatierten WKT mit sphärischer Semantik.
Hinweis zur Verwendung von EWKT und EWKB¶
EWKT und EWKB sind spezifische Formate, die von PostGIS eingeführt wurden. Sie erweitern die Formate WKT und WKB um einen Spatial Reference System Identifier (SRID), der das mit den Daten zu verwendende Koordinatenreferenzsystem angibt. Snowflake unterstützt derzeit nur WGS84, was SRID=4326 zugeordnet ist.
Standardmäßig gibt Snowflake einen Fehler aus, wenn ein EWKB- oder EWKT-Eingabewert eine andere SRID als 4326 enthält. Umgekehrt weisen alle EWKB- und EWKT-Ausgabewerte die SRID=4326 auf.
Typen von Geodatenobjekten¶
Der Datentyp GEOGRAPHY kann die folgenden Typen von Geodatenobjekten speichern:
WKT/WKB/EWKT/EWKB/GeoJSON-Geodatenobjekte:
Punkt
MultiPoint
LineString
MultiLineString
Polygon
MultiPolygon
GeometryCollection
GeoJSON-spezifische Geodatenobjekte:
Feature
FeatureCollection
Input und Output¶
In diesem Abschnitt werden die Eingabe und Ausgabe von Geodaten ausführlicher erläutert.
DML-Operationen auf GEOGRAPHY-Spalten¶
Wenn eine GEOGRAPHY-Spalte das Ziel einer DML-Operation ist (INSERT, COPY, UPDATE, MERGE oder CREATE TABLE AS …), kann der Quellenausdruck der Spalte folgende Datentypen aufweisen:
GEOGRAPHY: Ein Ausdruck vom Typ GEOGRAPHY ist normalerweise das Ergebnis einer Analysefunktion, einer Konstruktorfunktion oder einer vorhandenen GEOGRAPHY-Spalte. Eine vollständige Liste der unterstützten Funktionen und Funktionskategorien finden Sie unter Geodatenfunktionen.
VARCHAR: Wird als WKT, WKB, EWKT, EWKB (im Hex-Format) oder als GeoJSON-formatierte Zeichenfolge interpretiert (siehe TO_GEOGRAPHY(VARCHAR)).
BINARY: Wird als WKB Binary interpretiert (siehe TO_GEOGRAPHY(BINARY)).
VARIANT: Wird als GeoJSON-Objekt interpretiert (siehe TO_GEOGRAPHY(VARIANT)).
GEOGRAPHY_OUTPUT_FORMAT: GEOGRAPHY in Resultsets¶
Der Sitzungsparameter GEOGRAPHY_OUTPUT_FORMAT steuert das Rendern von Spalten vom Typ GEOGRAPHY in Resultsets.
Der Parameter GEOGRAPHY_OUTPUT_FORMAT kann einen der folgenden Werte haben:
Parameterwert
Beschreibung
GeoJSON (Standard)
Das GEOGRAPHY-Ergebnis wird als ein OBJECT imGeoJSON-Format gerendert.
WKT
Das GEOGRAPHY-Ergebnis wird als VARCHAR im WKT-Format gerendert.
WKB
Das GEOGRAPHY-Ergebnis wird als BINARY im WKB-Format gerendert.
EWKT
Das GEOGRAPHY-Ergebnis wird als VARCHAR im EWKT-Format gerendert.
EWKB
Das GEOGRAPHY-Ergebnis wird als BINARY im EWKB-Format gerendert.
Für EWKT und EWKB ist die SRID in der Ausgabe immer „4326“. Siehe den Hinweis zur Verwendung von EWKT und EWKB.
Dieser Parameter betrifft alle Clients, einschließlich Snowflake-UI und SnowSQL-Befehlszeilenclient sowie Treiber und Konnektoren für JDBC, ODBC, node.js, Python usw.
Beispiel: Der JDBC-Treiber gibt die folgenden Metadaten für eine GEOGRAPHY-typisierte Ergebnisspalte zurück (Spalte i
in diesem Beispiel):
Wenn
GEOGRAPHY_OUTPUT_FORMAT='GeoJSON'
:ResultSetMetaData.getColumnType(i)
gibtjava.sql.Types.VARCHAR
zurück.ResultSetMetaData.getColumnClassName(i)
gibt"java.lang.String"
zurück.
Wenn
GEOGRAPHY_OUTPUT_FORMAT='WKT'
oder'EWKT'
:ResultSetMetaData.getColumnType(i)
gibtjava.sql.Types.VARCHAR
zurück.ResultSetMetaData.getColumnClassName(i)
gibt"java.lang.String"
zurück.
Wenn
GEOGRAPHY_OUTPUT_FORMAT='WKB'
oder'EWKB'
:ResultSetMetaData.getColumnType(i)
gibtjava.sql.Types.BINARY
zurück.ResultSetMetaData.getColumnClassName(i)
gibt"[B"
(Bytearray).
Bemerkung
APIs zum Abrufen von datenbankspezifischen Typnamen (getColumnTypeName
in JDBC und der SQL_DESC_TYPE_NAME
-Deskriptor in ODBC) geben immer GEOGRAPHY
für den Typnamen zurück, unabhängig vom Wert des Parameters GEOGRAPHY_OUTPUT_FORMAT
. Weitere Details dazu finden Sie unter:
Snowflake-spezifisches Verhalten in der Dokumentation zum JDBC-Treiber.
Abrufen von Ergebnissen und Informationen über Ergebnisse in der Dokumentation zum ODBC-Treiber.
Unterstützung von Stagingbereichen¶
Daten aus CSV- oder JSON/AVRO-Dateien in einem Stagingbereich können direkt (d. h. ohne COPY-Transformationen) in eine GEOGRAPHY-Spalte geladen werden.
CSV: Zeichenfolgenwerte aus der entsprechenden CSV-Spalte werden als GeoJSON, WKT, EWKT, WKB oder EWKB analysiert (siehe TO_GEOGRAPHY(VARCHAR)).
JSON/AVRO: Die JSON-Werte in der Datei werden als GeoJSON interpretiert (siehe TO_GEOGRAPHY(VARIANT)).
Siehe auch Hinweis zur Verwendung von GeoJSON.
Das Laden von Daten aus anderen Dateiformaten (Parquet, ORC usw.) ist über eine COPY-Transformation möglich.
Unterstützung für JavaScript-UDFs¶
In JavaScript-UDFs kann der Datentyp GEOGRAPHY als Argument und als Rückgabewert verwendet werden.
Wenn eine JavaScript-UDF ein Argument vom Typ GEOGRAPHY hat, wird dieses Argument im UDF-Body als JSON-Objekt im GeoJSON-Format angezeigt.
Wenn eine JavaScript-UDF den Datentyp GEOGRAPHY zurückgibt, wird erwartet, dass der UDF-Body ein JSON-Objekt im GeoJSON-Format zurückgibt.
Beispielsweise entsprechen die beiden folgenden JavaScript-UDFs in etwa den integrierten Funktionen ST_X und ST_MAKEPOINT:
create or replace function my_st_x(G geography) returns real
language javascript
as
$$
if (G["type"] != "Point")
{
throw "Not a point"
}
return G["coordinates"][0]
$$;
create or replace function my_st_makepoint(LNG real, LAT real) returns geography
language javascript
as
$$
g = {}
g["type"] = "Point"
g["coordinates"] = [ LNG, LAT ]
return g
$$;
Beispiele¶
Der folgende Code zeigt die Ein- und Ausgabe von Beispieldaten mit dem Datentyp GEOGRAPHY.
Bei Koordinaten in der WKT-, EWKT- und GeoJSON-Ausgabe wird erst die Länge, dann die Breite angezeigt (z. B. POINT(Länge, Breite)
).
Bei WKB- und EWKB-Ausgaben wird angenommen, dass der Parameter BINARY_OUTPUT_FORMAT auf HEX
(Standardwert des Parameters) gesetzt ist.
create table geospatial_table (g GEOGRAPHY); insert into geospatial_table values ('POINT(-122.35 37.55)'), ('LINESTRING(-124.20 42.00, -120.01 41.99)');alter session set GEOGRAPHY_OUTPUT_FORMAT='GeoJSON';select g from geospatial_table; +------------------------+ | G | |------------------------| | { | | "coordinates": [ | | -122.35, | | 37.55 | | ], | | "type": "Point" | | } | | { | | "coordinates": [ | | [ | | -124.2, | | 42 | | ], | | [ | | -120.01, | | 41.99 | | ] | | ], | | "type": "LineString" | | } | +------------------------+alter session set GEOGRAPHY_OUTPUT_FORMAT='WKT';select g from geospatial_table; +-------------------------------------+ | G | |-------------------------------------| | POINT(-122.35 37.55) | | LINESTRING(-124.2 42,-120.01 41.99) | +-------------------------------------+alter session set GEOGRAPHY_OUTPUT_FORMAT='WKB';select g from geospatial_table; +------------------------------------------------------------------------------------+ | G | |------------------------------------------------------------------------------------| | 01010000006666666666965EC06666666666C64240 | | 010200000002000000CDCCCCCCCC0C5FC00000000000004540713D0AD7A3005EC01F85EB51B8FE4440 | +------------------------------------------------------------------------------------+alter session set GEOGRAPHY_OUTPUT_FORMAT='EWKT';select g from geospatial_table; +-----------------------------------------------+ | G | |-----------------------------------------------| | SRID=4326;POINT(-122.35 37.55) | | SRID=4326;LINESTRING(-124.2 42,-120.01 41.99) | +-----------------------------------------------+alter session set GEOGRAPHY_OUTPUT_FORMAT='EWKB';select g from geospatial_table; +--------------------------------------------------------------------------------------------+ | G | |--------------------------------------------------------------------------------------------| | 0101000020E61000006666666666965EC06666666666C64240 | | 0102000020E610000002000000CDCCCCCCCC0C5FC00000000000004540713D0AD7A3005EC01F85EB51B8FE4440 | +--------------------------------------------------------------------------------------------+