Làm cách nào để lấy trọng tâm của một tập hợp các điểm trong PostGIS?


15

Tôi sử dụng PostgreSQL với phần mở rộng PostGIS.

Tôi có một tập hợp các điểm trong the_geomcột từ một bảng myschema.myobjects. Tôi muốn tạo một câu lệnh chọn để lấy tâm của cụm này, vì vậy từ một câu lệnh chọn như thế này:

SELECT the_geom FROM myschema.myobjects

Tôi cần tìm đúng cú pháp cho một câu như:

SELECT ST_AsText(ST_Centroid( (SELECT the_geom FROM myshema.myobjects) ));

Câu trả lời:


20

bạn phải sử dụng chức năng hợp nhất như thế này

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

vì vậy bạn có thể có được trọng tâm của điểm có cùng thuộc tính.


6

PostGIS có hai chức năng để kết hợp nhiều hình học thành một hình học duy nhất mà bạn có thể sử dụng làm đầu vào ST_Centroid.

ST_Collect chỉ cần kết hợp một bộ hình học mà không sửa đổi chúng.

Thay thế, ST_Unionsẽ "hòa tan" nhiều hình học và loại bỏ các thành phần dư thừa. Đây có lẽ không phải là những gì bạn muốn cho ứng dụng này.

Để thấy sự khác biệt, hãy so sánh:

 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)

Trong trường hợp này, ST_Unionđã loại bỏ điểm trùng lặp, trong khi ST_Collectvẫn giữ lại điểm đó.


4

Nếu bạn đang tìm kiếm hiệu suất, hãy sử dụng truy vấn này:

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

nó cung cấp cho bạn ít nhiều cùng một đầu ra như:

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

như trong câu trả lời @dbaston, nhưng nhanh hơn và không sử dụng nhiều bộ nhớ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.