Bagaimana cara mendapatkan centroid satu set poin di PostGIS?


16

Saya menggunakan PostgreSQL dengan ekstensi PostGIS.

Saya memiliki satu set poin di the_geomkolom dari sebuah tabel myschema.myobjects. Saya ingin membuat pernyataan pilih untuk mendapatkan centroid dari kluster ini, jadi dari pernyataan pilih seperti ini:

SELECT the_geom FROM myschema.myobjects

Saya perlu menemukan sintaks yang benar untuk pernyataan seperti:

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

Jawaban:


21

Anda harus menggunakan fungsi serikat seperti ini

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

sehingga Anda dapat memperoleh titik pusat dari titik yang memiliki atribut yang sama.


6

PostGIS memiliki dua fungsi untuk menggabungkan beberapa geometri menjadi satu geometri yang dapat Anda gunakan sebagai input ST_Centroid.

ST_Collect cukup menggabungkan satu set geometri tanpa mengubahnya.

Alternatifnya,, ST_Unionakan "melarutkan" banyak geometri dan menghapus komponen yang berlebihan. Ini mungkin bukan yang Anda inginkan untuk aplikasi ini.

Untuk melihat perbedaannya, bandingkan:

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

 -- POINT(1 1)

dan

 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)

Dalam hal ini, ST_Uniontelah menghapus titik duplikat, sementara ST_Collecttetap mempertahankannya.


4

Jika Anda mencari kinerja, gunakan permintaan ini:

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

itu memberi Anda lebih atau kurang keluaran yang sama dengan:

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

seperti dalam jawaban @dbaston, tetapi lebih cepat dan tidak menggunakan banyak memori.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.