Як отримати центроїд набору точок у PostGIS?


16

Я використовую PostgreSQL з розширенням PostGIS.

У мене є набір точок у the_geomстовпці з таблиці myschema.myobjects. Я хочу створити оператор 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;

тож ви можете отримати центроїд точки, який має однаковий атрибут.


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зберегла його.


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, але він швидший і не використовує стільки пам’яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.