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:

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:

    • 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: Im JDBC-Client sehen die Metadaten einer Ergebnisspalte vom Typ GEOGRAPHY (z. B. Spalte i) ungefähr wie folgt aus:

  • Wenn GEOGRAPHY_OUTPUT_FORMAT= ‚GeoJSON‘:

    • ResultSetMetaData.getColumnTypeName(i) gibt „OBJECT“ zurück.

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

  • Wenn GEOGRAPHY_OUTPUT_FORMAT= ‚WKT‘ oder ‚EWKT‘:

    • ResultSetMetaData.getColumnTypeName(i) gibt „VARCHAR“ zurück.

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

  • Wenn GEOGRAPHY_OUTPUT_FORMAT= ‚WKB‘ oder ‚EWKB‘:

    • ResultSetMetaData.getColumnTypeName(i) gibt „BINARY“ zurück.

    • ResultSetMetaData.getColumnClassName(i) gibt „[B“ (Bytearray) zurück.

Ähnliche Informationen werden bei anderen Clients zurückgegeben, z. B. vom ODBC-Treiber.

Unterstützung für Stagingbereiche

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. Für die WKB- und EWKB-Ausgabe 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 |
+--------------------------------------------------------------------------------------------+