วันนี้เอาเทคนิคการหมุนฟีเจอร์ใน postgis มาฝากครับ ผมนำข้อมูลแปลงที่ดินจำนวนหนึ่งเข้ามาเก็บในฐานข้อมูล แต่แล้วก็เจอปัญหากรณีที่ ผู้ใช้หรือผู้นำเข้าข้อมูลต้องการ edit การวางตัวของแปลงที่ดิน ประมาณว่าหมุนซ้ายขวา ดังนั้นจึงต้องอาศัยฟังก์ชั่น rotate ของ postgis เพื่อช่วยในการจัดการข้อมูลแต่ก็ไม่ง่ายอย่างนั้นครับ Rotate() ดันเป็นการหมุนรอบจุด origin ไปดังนั้นก็เลยต้องมีการออกแรงหาวิธีการแก้ไข สุดท้ายก็ไปเจอใน mail group โดยมีแนวคิดง่ายๆคือ tranlate มันไปตำแหน่งบน quter ตรงข้าม -x,-y แล้วก็ rotate จากนั้นจึง tranlate กลับมาที่เดิม ผลลัพธ์ก็จะได้ geometry ใหม่ที่หมุนรอบแกน centroid แล้วครับ ลองทดสอบดูนะครับ
1. ข้อมูลตัวอย่าง เพื่อเป็นการสาธิตผมสร้างตารางที่เก็บข้อมูล polygon ของแปลงที่ดินเอาไว้ แต่เพื่อความเข้าใจง่าย ผมใช้พิกัดสมมติในการยกตัวอย่าง
CREATE TABLE parcel (gid serial PRIMARY KEY, name varchar);
SELECT AddGeometryColumn('', 'parcel', 'the_geom', -1, 'POLYGON', 2);
INSERT INTO "parcel" ("the_geom", "name") VALUES (
'POLYGON((2 2, 2 7, 12 7, 12 2, 2 2))', 'first_parcel');
จากนั้นทำการหมุน โดยหมุนรอบ centroid ของ polygon มี step ดังนี้
– tranlate จุดหมุน(centroid) ไป quater ตรงข้าม(- , -)
– rotate รอบจุดหมุนใหม่
– tranlate ผลลัพธ์ geometry data กลับมาที่ centroid เดิม
SELECT
translate(
rotate(
translate( the_geom, -x(centroid(the_geom)), -y(centroid(the_geom)) ),
radians(45)
),
x(centroid(the_geom)), y(centroid(the_geom))
)
FROM parcel;
------------------
เพื่อให้ใช้งานง่ายก็เขียน pl/sql เป็นฟังก์ชั่นเลยครับ RotateAtCentroid(geom,x_centroid,y_centroid)
ใส่ความเห็น