ขออนุญาติเอาตำบลเท่ๆ ในจังหวัดอุทัยธานี มาเป็นตัวอย่างนะครับ
เรื่องของคือ มีข้อมูล polygon แต่มีโจทย์ว่า แล้วพิกัดหมุดของตำบลนั้นอยู่ที่ไหน
เราสามารถใช้ ST_Centroid
ในการหาจุดกลางของ polygon ได้ ตัวอย่างคำสั่งประมาณนี้
select x.shape, ST_Centroid(x.shape)
from table x
where x.code = 610106;
แต่ว่าด้วยความเท่ ของตำบลนี้ จุดกลางที่ได้ ดันไม่อยู่ในตำบลนี้ซะนี่ แบบนี้
นอกจากไม่ใช่ตำบลนั้น ยังข้ามอีกจังหวัดอีกซะงั้น
จากกรณีข้างบน ถ้าทรงปกติๆ มันก็อยู่ตรงกลางสวยๆ ดีอยู่หรอก แต่ถ้าทรงมันเท่ เกินไป เราสามารถใช้ ST_PointOnSurface
แทนได้ ดังตัวอย่างแบบนี้
select x.shape, ST_PointOnSurface(x.shape)
from table x
where x.code = 610106;
ผลที่ได้จะเป็นแบบนี้
ซึ่งค่อนข้างดีทีเดียวเชียวครับ
ผมอัพเดทพิกัดจุดกลาง ลงฟิลด์ 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;