Catégories :

Fonctions géospatiales

ST_COLLECT

Il existe deux formes de ST_COLLECT :

  • Scalaire : cette fonction combine deux objets GEOGRAPHY en un seul.

  • Agrégat : cette fonction combine tous les objets GEOGRAPHY d’une colonne en un objet GEOGRAPHY.

Syntaxe

Scalar:

    ST_COLLECT( <geography_expression_1> , <geography_expression_2> )

Aggregate:

    ST_COLLECT( <geography_expression_1> )

Arguments

expression_géographie_1

Un objet GEOGRAPHY.

expression_géographie_2

Un objet GEOGRAPHY.

Renvoie

La fonction renvoie une valeur de type GEOGRAPHY.

Notes sur l’utilisation

  • Si g1 et g2 sont tous deux des objets Point, le résultat est un objet MultiPoint contenant les deux points. De même, si g1 et g2 sont tous deux des objets LineString, le résultat est un objet MultiLineString. Etc.

  • Si g1 et g2 sont différents types d’objets géospatiaux, ou si au moins l’un des objets GEOGRAPHY en entrée est une collection (par exemple MultiLine, GeometryCollection ou FeatureCollection), alors le résultat est un GeometryCollection contenant les deux.

Exemples

Les requêtes ci-dessous montrent les utilisations scalaires et agrégées de la fonction ST_COLLECT.

Créer et charger la table :

create table geospatial_table_01 (g1 GEOGRAPHY, g2 GEOGRAPHY);
insert into geospatial_table_01 (g1, g2) values 
    ('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 'POLYGON((1 1, 2 1, 2 2, 1 2, 1 1))');

Cela appelle ST_COLLECT en tant que fonction scalaire pour créer une valeur MultiPoint qui contient les deux points sur la même ligne :

-- Scalar function:
SELECT ST_COLLECT(g1, g2) FROM geo3;
+------------------------+
| ST_COLLECT(G1, G2)     |
|------------------------|
| {                      |
|   "coordinates": [     |
|     [                  |
|       -180,            |
|       -90              |
|     ],                 |
|     [                  |
|       -45,             |
|       -45              |
|     ]                  |
|   ],                   |
|   "type": "MultiPoint" |
| }                      |
| {                      |
|   "coordinates": [     |
|     [                  |
|       0,               |
|       0                |
|     ],                 |
|     [                  |
|       -60,             |
|       -60              |
|     ]                  |
|   ],                   |
|   "type": "MultiPoint" |
| }                      |
| {                      |
|   "coordinates": [     |
|     [                  |
|       180,             |
|       90               |
|     ],                 |
|     [                  |
|       45,              |
|       45               |
|     ]                  |
|   ],                   |
|   "type": "MultiPoint" |
| }                      |
+------------------------+

Cela appelle ST_COLLECT en tant que fonction d’agrégation pour créer une valeur MultiPoint qui contient tous les points dans la même colonne :

-- Aggregate function:
SELECT ST_COLLECT(g1), ST_COLLECT(g2) FROM geo3;
+------------------------+------------------------+
| ST_COLLECT(G1)         | ST_COLLECT(G2)         |
|------------------------+------------------------|
| {                      | {                      |
|   "coordinates": [     |   "coordinates": [     |
|     [                  |     [                  |
|       -180,            |       -45,             |
|       -90              |       -45              |
|     ],                 |     ],                 |
|     [                  |     [                  |
|       0,               |       -60,             |
|       0                |       -60              |
|     ],                 |     ],                 |
|     [                  |     [                  |
|       180,             |       45,              |
|       90               |       45               |
|     ]                  |     ]                  |
|   ],                   |   ],                   |
|   "type": "MultiPoint" |   "type": "MultiPoint" |
| }                      | }                      |
+------------------------+------------------------+

Cela appelle d’abord ST_COLLECT en tant que fonction d’agrégation sur chaque colonne pour créer des valeurs MultiPoint qui contiennent tous les points de chaque colonne, puis appelle ST_COLLECT sur ces deux valeurs MultiPoint pour créer un GeometryCollection qui contient tous les points dans les deux colonnes. Le GeometryCollection résultant est hiérarchique.

-- Aggregate and then Collect:
SELECT ST_COLLECT(ST_COLLECT(g1), ST_COLLECT(g2)) FROM geo3;
+--------------------------------------------+
| ST_COLLECT(ST_COLLECT(G1), ST_COLLECT(G2)) |
|--------------------------------------------|
| {                                          |
|   "geometries": [                          |
|     {                                      |
|       "coordinates": [                     |
|         [                                  |
|           -180,                            |
|           -90                              |
|         ],                                 |
|         [                                  |
|           0,                               |
|           0                                |
|         ],                                 |
|         [                                  |
|           180,                             |
|           90                               |
|         ]                                  |
|       ],                                   |
|       "type": "MultiPoint"                 |
|     },                                     |
|     {                                      |
|       "coordinates": [                     |
|         [                                  |
|           -45,                             |
|           -45                              |
|         ],                                 |
|         [                                  |
|           -60,                             |
|           -60                              |
|         ],                                 |
|         [                                  |
|           45,                              |
|           45                               |
|         ]                                  |
|       ],                                   |
|       "type": "MultiPoint"                 |
|     }                                      |
|   ],                                       |
|   "type": "GeometryCollection"             |
| }                                          |
+--------------------------------------------+