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> )
Copy

Arguments

geography_expression_1

Un objet GEOGRAPHY.

geography_expression_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 MultiLineString, GeometryCollection ou FeatureCollection), alors le résultat est un GeometryCollection contenant les deux objets d’entrée.

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 geo3 (g1 GEOGRAPHY, g2 GEOGRAPHY);
INSERT INTO geo3 (g1, g2) VALUES
    ( 'POINT(-180 -90)', 'POINT(-45 -45)' ),
    ( 'POINT(   0   0)', 'POINT(-60 -60)' ),
    ( 'POINT(+180 +90)', 'POINT(+45 +45)' );
Copy

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" |
| }                      |
+------------------------+
Copy

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" |
| }                      | }                      |
+------------------------+------------------------+
Copy

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"             |
| }                                          |
+--------------------------------------------+
Copy