การหาตำแหน่งจุดกลางของ polygon ใน postgis
MapPostgresql
อัพเดทล่าสุด 18 ต.ค. 66
เพราะต้องทำแผนที่ตำบล เลยเจอปัญหานิดหน่อยเรื่องตำแหน่งของพิกัดตำบล
ที่มาที่ไป

ขออนุญาติเอาตำบลเท่ๆ ในจังหวัดอุทัยธานี มาเป็นตัวอย่างนะครับ

เรื่องของคือ มีข้อมูล polygon แต่มีโจทย์ว่า แล้วพิกัดหมุดของตำบลนั้นอยู่ที่ไหน

 

ใช้ ST_Centroid

เราสามารถใช้ ST_Centroid ในการหาจุดกลางของ polygon ได้ ตัวอย่างคำสั่งประมาณนี้

select x.shape, ST_Centroid(x.shape)
from table x
where x.code = 610106;

แต่ว่าด้วยความเท่ ของตำบลนี้ จุดกลางที่ได้ ดันไม่อยู่ในตำบลนี้ซะนี่ แบบนี้

นอกจากไม่ใช่ตำบลนั้น ยังข้ามอีกจังหวัดอีกซะงั้น

ใช้ ST_PointOnSurface

จากกรณีข้างบน ถ้าทรงปกติๆ มันก็อยู่ตรงกลางสวยๆ ดีอยู่หรอก แต่ถ้าทรงมันเท่ เกินไป เราสามารถใช้ ST_PointOnSurface แทนได้ ดังตัวอย่างแบบนี้

select x.shape, ST_PointOnSurface(x.shape)
from table x
where x.code = 610106;

ผลที่ได้จะเป็นแบบนี้

ซึ่งค่อนข้างดีทีเดียวเชียวครับ

แถมนิดนึงใช้ ST_Contains เพื่อเชคว่า ไอ้จุดกลางอยู่ใน polygon มั้ย

ผมอัพเดทพิกัดจุดกลาง ลงฟิลด์ center ก็เลยต้อง re-check อีกรอบว่า แล้วพิกัดมันอยู่ในพื้นที่จริงรึเปล่าด้วยคำสั่ง ST_Contains ดังตัวอย่างนี้ครับ

select x.*
from table x
where ST_Contains(x.shape, x.center);

หรือถ้าจะตรวจว่า มีรายการไหนมันไม่อยู่ใน polygon ก็ใช้แบบนี้แทนได้ครับ

select x.*
from table x
where ST_Contains(x.shape, x.center) = false;
Beta Version v23.12.4 : ขออภัยเว็บกำลังก่อสร้าง (อีกแล้ว) แต่คราวนี้กำลังสร้างจริงจังละ