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é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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.