วันนี้เอาเทคนิคการหมุนฟีเจอร์ใน 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)
CREATE OR REPLACE FUNCTION RotateAtCentroid(geometry, double precision, double precision, double precision)
RETURNS geometry AS 'SELECT translate( rotate( translate( $1, -1*$2, -1*$3), $4), $2, $3)'
LANGUAGE 'sql';