¿Cómo obtener el centroide de un conjunto de puntos en PostGIS?

16

Yo uso PostgreSQL con la extensión PostGIS.

Tengo un conjunto de puntos en la the_geomcolumna de una tabla myschema.myobjects. Quiero crear una instrucción select para obtener el centroide de este clúster, así que a partir de una instrucción select como esta:

SELECT the_geom FROM myschema.myobjects

Necesito encontrar la sintaxis correcta para una declaración como:

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

Respuestas:

21

tienes que usar la función de unión como esta

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

para que pueda obtener el centroide de punto que tiene el mismo atributo.

Sergio
fuente
6

PostGIS tiene dos funciones para combinar múltiples geometrías en una sola geometría que puede usar como entrada ST_Centroid.

ST_Collect simplemente combina un conjunto de geometrías sin modificarlas.

La alternativa, ST_Union"disolverá" múltiples geometrías y eliminará componentes redundantes. Probablemente esto no sea lo que desea para esta aplicación.

Para ver la diferencia, compare:

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

 -- POINT(1 1)

y

 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)

En este caso, ST_Unionha eliminado el punto duplicado, mientras lo ST_Collectha retenido.

dbaston
fuente
4

Si está buscando rendimiento, use esta consulta:

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

te da más o menos la misma salida que:

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

como en la respuesta de @dbaston, pero es más rápido y no usa tanta memoria.

gemo1011
fuente