วิธีรับ centroid ของชุดคะแนนใน PostGIS


16

ฉันใช้ PostgreSQL กับส่วนขยาย PostGIS

ฉันมีชุดของจุดในคอลัมน์จากตารางthe_geom myschema.myobjectsฉันต้องการสร้างคำสั่ง select เพื่อรับ centroid ของคลัสเตอร์นี้ดังนั้นจากคำสั่ง 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;

เพื่อให้คุณสามารถรับ centroid ของจุดที่มีคุณลักษณะเดียวกัน


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 คำตอบ แต่จะเร็วกว่าและไม่ได้ใช้หน่วยความจำมากนัก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.