Types de données géospatiales

Snowflake offre un support natif pour les entités géospatiales telles que les points, les lignes et les polygones sur la surface de la Terre.

Dans ce chapitre :

Type de données GEOGRAPHY

Snowflake fournit le type de données GEOGRAPHY, qui modélise la Terre comme si elle était une sphère parfaite.

Le type de données GEOGRAPHY suit la norme WGS 84 (ID de référence spatiale 4326 ; pour plus de détails, voir https://spatialreference.org/ref/epsg/wgs-84/).

Les points sur la Terre sont représentés par des degrés de longitude (de -180 degrés à +180 degrés) et de latitude (-90 à +90 degrés).

L’altitude n’est actuellement pas prise en charge.

Les segments de ligne sont interprétés comme des arcs géodésiques sur la surface de la Terre.

Snowflake fournit également des fonctions géospatiales qui fonctionnent sur le type de données GEOGRAPHY.

Formats d’entrée et de sortie géospatiaux

Les formats d’entrée et de sortie du type de données GEOGRAPHY, ainsi que les noms et la sémantique des fonctions géospatiales, respectent les normes de l’industrie. Les formats d’entrée et de sortie pris en charge sont les suivants :

Vous pouvez également trouver les références suivantes utiles :

Tout écart par rapport à ces normes est indiqué explicitement dans la documentation de Snowflake.

Remarque sur le traitement GeoJSON

Les normes WKT et WKB spécifient uniquement un format ; la sémantique des objets WKT/WKB dépend du système de référence - par exemple, un plan ou une sphère.

La norme GeoJSON, en revanche, spécifie à la fois un format et sa sémantique : les points GeoJSON sont explicitement des coordonnées WGS 84 et les segments de ligne GeoJSON sont censés être des arêtes planes (lignes droites).

Contrairement à cela, le type de données GEOGRAPHY de Snowflake interprète tous les segments de ligne - y compris ceux entrés ou sortis au format GeoJSON - comme des arcs géodésiques. En substance, Snowflake traite GeoJSON comme du WKT au format JSON avec une sémantique sphérique.

Note sur le traitement d” EWKT et d” EWKB

EWKT et EWKB sont des formats non standard introduits par PostGIS. Ils améliorent les formats WKT et WKB en incluant un identificateur de système de référence spatiale (SRID), qui spécifie le système de référence de coordonnées à utiliser avec les données. Snowflake ne prend actuellement en charge que WGS84, qui correspond à SRID=4326.

Par défaut, Snowflake génère une erreur si une valeur d’entrée EWKB ou EWKT contient un SRID autre que 4326. Inversement, toutes les valeurs de sortie EWKB et EWKT ont un SRID = 4326.

Types d’objets géospatiaux

Le type de données GEOGRAPHY peut stocker les types d’objets géospatiaux suivants :

  • Objets géospatiaux WKT / WKB / EWKT / EWKB / GeoJSON :

    • Point.

    • MultiPoint.

    • LineString.

    • MultiLineString.

    • Polygone.

    • MultiPolygon.

    • GeometryCollection.

  • Ces objets géospatiaux spécifiques à GeoJSON :

    • Feature.

    • FeatureCollection.

Entrée et sortie

Cette section explique plus en détail l’entrée et la sortie de données géospatiales.

Opérations DML sur les colonnes GEOGRAPHY

Lorsqu’une colonne GEOGRAPHY est la cible d’une opération DML (INSERT, COPY, UPDATE, MERGE ou CREATE TABLE AS…), l’expression source de la colonne peut être n’importe lequel des types suivants :

  • GEOGRAPHY : une expression de type GEOGRAPHY est généralement le résultat d’une fonction d’analyse, d’une fonction constructeur ou d’une colonne GEOGRAPHY existante. Pour une liste complète des fonctions et catégories de fonctions prises en charge, voir Fonctions géospatiales.

  • VARCHAR : interprété comme une chaîne au format WKT, WKB (format hexadécimal), EWKT, EWKB (format hexadécimal), ou GeoJSON (voir TO_GEOGRAPHY(VARCHAR)).

  • BINARY : interprété comme un WKB binaire (voir TO_GEOGRAPHY(BINARY)).

  • VARIANT : interprété comme un objet GeoJSON (voir TO_GEOGRAPHY(VARIANT)).

GEOGRAPHY_OUTPUT_FORMAT: GEOGRAPHY dans les ensembles de résultats

Le paramètre de session GEOGRAPHY_OUTPUT_FORMAT contrôle le rendu des colonnes de type GEOGRAPHY dans les ensembles de résultats.

Le paramètre GEOGRAPHY_OUTPUT_FORMAT peut avoir l’une des valeurs suivantes :

Valeur du paramètre

Description

GeoJSON (par défaut)

Le résultat GEOGRAPHY est rendu sous la forme d’un OBJECT au format GeoJSON.

WKT

Le résultat GEOGRAPHY est rendu sous la forme d’un VARCHAR au format WKT.

WKB

Le résultat GEOGRAPHY est rendu sous la forme d’un BINARY au format WKB.

EWKT

Le résultat GEOGRAPHY est rendu sous la forme d’un VARCHAR au format EWKT.

EWKB

Le résultat GEOGRAPHY est rendu sous la forme d’un BINARY au format EWKB.

Pour EWKT et EWKB, le SRID est toujours 4326 dans la sortie. Consultez la note sur le traitement d” EWKT et d” EWKB.

Ce paramètre concerne tous les clients, y compris l” UI de Snowflake et le client de ligne de commande SnowSQL, ainsi que les pilotes et connecteurs JDBC, ODBC, node.js, python, etc.

Par exemple : dans le client JDBC, les métadonnées d’une colonne de résultat de type GEOGRAPHY (disons, colonne i) ressemblent à ce qui suit :

  • If GEOGRAPHY_OUTPUT_FORMAT=”GeoJSON”:

    • ResultSetMetaData.getColumnTypeName(i) returns « OBJECT ».

    • ResultSetMetaData.getColumnClassName(i) returns « java.lang.String ».

  • If GEOGRAPHY_OUTPUT_FORMAT=”WKT” or “EWKT”:

    • ResultSetMetaData.getColumnTypeName(i) returns « VARCHAR ».

    • ResultSetMetaData.getColumnClassName(i) returns « java.lang.String ».

  • If GEOGRAPHY_OUTPUT_FORMAT=”WKB” or “EWKB”:

    • ResultSetMetaData.getColumnTypeName(i) returns « BINARY ».

    • ResultSetMetaData.getColumnClassName(i) returns « [B » (array of byte).

Des informations similaires sont renvoyées pour d’autres clients, tels que le pilote ODBC.

Prise en charge des zones de préparation

Les données des fichiers CSV ou JSON / AVRO dans une zone de préparation peuvent être chargées directement (c’est-à-dire sans transformations de copie) dans une colonne GEOGRAPHY.

Le chargement de données à partir d’autres formats de fichiers (Parquet, ORC, etc.) est possible via une transformation COPY.

Prise en charge des UDFs JavaScript

Les UDFs JavaScript autorisent le type GEOGRAPHY comme argument et comme valeur de retour.

Si un UDF JavaScript a un argument de type GEOGRAPHY, cet argument sera visible en tant qu’objet JSON au format GeoJSON à l’intérieur du corps UDF.

Si un UDF JavaScript renvoie GEOGRAPHY, le corps UDF devrait renvoyer un objet JSON au format GeoJSON.

Par exemple, ces deux UDFs JavaScript sont à peu près équivalents aux fonctions intégrées ST_X et 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
$$;

Exemples

Le code ci-dessous montre des exemples d’entrée et de sortie pour le type de données GEOGRAPHY. Pour la sortie WKB et EWKB, il est supposé que le paramètre BINARY_OUTPUT_FORMAT est défini sur HEX (la valeur par défaut du paramètre).

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