Как получить центр тяжести набора точек в PostGIS?

16

Я использую PostgreSQL с расширением PostGIS.

У меня есть набор точек в the_geomстолбце из таблицы myschema.myobjects. Я хочу создать оператор SELECT, чтобы получить центр тяжести этого кластера, поэтому из оператора SELECT вот так:

SELECT the_geom FROM myschema.myobjects

Мне нужно найти правильный синтаксис для такого утверждения, как:

SELECT ST_AsText(ST_Centroid( (SELECT the_geom FROM myshema.myobjects) ));
Реми Б.
источник

Ответы:

21

Вы должны использовать функцию объединения, как это

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

так что вы можете получить центр тяжести точки с таким же атрибутом.

Sergio
источник
6

PostGIS имеет две функции для объединения нескольких геометрий в одну геометрию, которую вы можете использовать в качестве входных данных ST_Centroid.

ST_Collect просто комбинирует набор геометрий, не изменяя их.

Альтернатива ST_Unionбудет «растворять» несколько геометрий и удалять избыточные компоненты. Это, вероятно, не то, что вы хотите для этого приложения.

Чтобы увидеть разницу, сравните:

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

 -- POINT(1 1)

и

 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)

В этом случае ST_Unionудалил дублирующую точку, пока ST_Collectсохранил ее.

dbaston
источник
4

Если вы ищете производительность, используйте этот запрос:

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

это дает вам более или менее такой же вывод, как:

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

как в ответе @dbaston, но быстрее и не использует столько памяти.

gemo1011
источник