Como obter o centróide de um conjunto de pontos no PostGIS?

15

Eu uso o PostgreSQL com a extensão PostGIS.

Eu tenho um conjunto de pontos na the_geomcoluna de uma tabela myschema.myobjects. Quero criar uma instrução select para obter o centróide deste cluster, portanto, a partir de uma instrução select como esta:

SELECT the_geom FROM myschema.myobjects

Preciso encontrar a sintaxe correta para uma declaração como:

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

Respostas:

20

você tem que usar a função union assim

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

para que você possa obter o centróide de ponto que possui o mesmo atributo.

Sergio
fonte
6

O PostGIS possui duas funções para combinar várias geometrias em uma única geometria que você pode usar como entrada ST_Centroid.

ST_Collect simplesmente combina um conjunto de geometrias sem modificá-las.

A alternativa,ST_Union "dissolverá" várias geometrias e removerá componentes redundantes. Provavelmente não é o que você deseja para este aplicativo.

Para ver a diferença, 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)

e

 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)

Nesse caso, ST_Unionremoveu o ponto duplicado, enquanto o ST_Collectreteve.

dbaston
fonte
4

Se você está procurando desempenho, use esta consulta:

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

fornece mais ou menos a mesma saída que:

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

como na resposta do @dbaston, mas é mais rápido e não usa tanta memória.

gemo1011
fonte