Datentypen für Geodaten

Snowflake bietet native Unterstützung von räumlichen Merkmalen 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.

Wenn Sie Geodaten (z. B. Längen- und Breitengrad, WKT, WKB, GeoJSON usw.) haben, sollten Sie diese Daten konvertieren und in GEOGRAPHY-Spalten speichern, anstatt die Daten in ihren ursprünglichen Formaten in VARCHAR-, VARIANT- oder NUMBER-Spalten zu behalten. Das Speichern Ihrer Daten in GEOGRAPHY-Spalten kann die Leistung von Abfragen, die Geofunktionen verwenden, erheblich verbessern.

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:

Möglicherweise sind auch folgende Referenzen hilfreich:

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:

    • Funktion

    • FeatureCollection

Eingabe und Ausgabe

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) gibt java.sql.Types.VARCHAR zurück.

    • ResultSetMetaData.getColumnClassName(i) gibt "java.lang.String" zurück.

  • Wenn GEOGRAPHY_OUTPUT_FORMAT='WKT' oder 'EWKT':

    • ResultSetMetaData.getColumnType(i) gibt java.sql.Types.VARCHAR zurück.

    • ResultSetMetaData.getColumnClassName(i) gibt "java.lang.String" zurück.

  • Wenn GEOGRAPHY_OUTPUT_FORMAT='WKB' oder 'EWKB':

    • ResultSetMetaData.getColumnType(i) gibt java.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:

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.

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. Beachten Sie Folgendes:

  • Bei Koordinaten in WKT, EWKT und GeoJSON 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.

Das Beispiel erstellt eine Tabelle mit einer Spalte GEOGRAPHY, fügt Daten im Format WKT ein und gibt die Daten in verschiedenen Ausgabeformaten zurück.

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 |
+--------------------------------------------------------------------------------------------+