如何在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) ));

Answers:


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答案中的内容,但速度更快,并且不会占用太多内存。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.