Comment obtenir le centroïde d'un ensemble de points dans PostGIS?

16

J'utilise PostgreSQL avec l'extension PostGIS.

J'ai un ensemble de points dans la the_geomcolonne d'une table myschema.myobjects. Je veux créer une instruction select pour obtenir le centre de gravité de ce cluster, donc à partir d'une instruction select comme celle-ci:

SELECT the_geom FROM myschema.myobjects

J'ai besoin de trouver la syntaxe correcte pour une déclaration comme:

SELECT ST_AsText(ST_Centroid( (SELECT the_geom FROM myshema.myobjects) ));
Rémi B.
la source

Réponses:

21

vous devez utiliser la fonction union comme celle-ci

SELECT att1, st_centroid(st_union(geom)) as geom
FROM schema.table
GROUP BY att1;

afin que vous puissiez obtenir le centroïde du point qui a le même attribut.

Sergio
la source
6

PostGIS a deux fonctions pour combiner plusieurs géométries en une seule géométrie que vous pouvez utiliser comme entrée ST_Centroid.

ST_Collect combine simplement un ensemble de géométries sans les modifier.

L'alternative, ST_Union"dissoudra" plusieurs géométries et supprimera les composants redondants. Ce n'est probablement pas ce que vous voulez pour cette application.

Pour voir la différence, comparez:

 SELECT ST_AsText(ST_Centroid(ST_Union(geom))) FROM 
 (VALUES ('POINT (0 0)'), ('POINT (2 2)'), ('POINT (2 2)')) sq (geom);

 -- POINT(1 1)

et

 SELECT ST_AsText(ST_Centroid(ST_Collect(geom))) FROM 
 (VALUES ('POINT (0 0)'), ('POINT (2 2)'), ('POINT (2 2)')) sq (geom);

 -- POINT(1.33333333333333 1.33333333333333)

Dans ce cas, ST_Uniona supprimé le point dupliqué, tout en le ST_Collectconservant.

dbaston
la source
4

Si vous recherchez des performances, utilisez cette requête:

SELECT avg(ST_X(the_geom)) as lon, avg(ST_Y(the_geom)) as lat FROM table

il vous donne plus ou moins la même sortie que:

SELECT ST_AsText(ST_Centroid(ST_Collect(the_geom))) FROM table

comme dans la réponse @dbaston, mais est plus rapide et n'utilise pas autant de mémoire.

gemo1011
la source