Postgis คือะไร postgis เป็นส่วนเสริมของ postgres ทำให้สามารถรองรับข้อมูลด้านสารสนเทศรูมิศาสตร์ (GIS) ได้หรือเรียกอีกอย่างว่า Spatial Database ได้เริ่มต้นการใช้งานให้ทำการ Install postgis  ก่อนหลังจากลงแล้วเราจะยังใช้งานไม่ได้ทันทีเราจะต้องเพิ่มตัว EXTENSION  ใน postgres ก่อนโดยใช้คำสั่ง

[sql] CREATE EXTENSION postgis;[/sql]

หลังจากนั้นตอนนี้ตัว Postgres เราก็จะสามารถใช้งาน postgis ได้แล้วจากนั้นให้ทำการสร้างข้อมูลประเภท geom

ทดลองใส่ข้อมูลลง Database

[sql] INSERT INTO tablename(col1, col2)VALUES (1, ST_SetSRID(ST_MakePoint(100.447291624752, 13.6846231499541), 4326) );[/sql]

การ Insert ด้วย Function ST_SetSRID และมีค่า 4326 คือการกำหนดรูปแบบพิกัดเป็นแบบ lat long ระบบพิกัดแผนที่ที่ต้องจำระบบพิกัดแผนที่ ในระบบข้อมูลหรือทางคอมพิวเตอร์ที่เราใช้ในประเทศไทยมี 2 ระบบ ระบบพิกัดภูมิศาสตร์ หรือ Geographic หน่วยเป็น องศา ลิปดา พิลิปดาระบบพิกัดฉาก หรือ UTM (Universal Transverse Mercator) หน่วยเป็น เมตร และมี 2 โซน Zone 47 และ Zone 48
และหมุดหลักฐานอ้างอิง ที่ประเทศไทยใช้อ้างอิง มี 2 แบบ
WGS 1984
Indian 1975
ดังนั้นระบบพิกัดแผนที่เมื่อต้องเลือกหมุดหลักฐานด้วย ทั้งหมดมี 6 แบบ
WGS 84 / Geographic
WGS 84 / UTM Zone 47
WGS 84 / UTM Zone 48
Indian 1975 / Geographic
Indian 1975 / UTM Zone 47
Indian 1975 / UTM Zone 48
และสำหรับโปรแกรมเมอร์ที่ต้องเขียนโปรแกรมติดต่อการใช้แผนที่ ต้องใช้รหัสดังนี้
epsg:4326 WGS 84 / Geographic
epsg:32647 WGS 84 / UTM Zone 47
epsg:32648 WGS 84 / UTM Zone 48
epsg:4240 Indian 1975 / Geographic
epsg:24047 Indian 1975 / UTM Zone 47
epsg:24048 Indian 1975 / UTM Zone 48

โดยหลังจากใส่ข้อมูลแล้ว ข้อมูลจะถูกแปลงไปอยู่ในรูป geom จะมีหน้าตาประมาณนี้ 01010000200400000000000000000000000000000000000000 โดยทดลองแปลงค่าใน geom กลับเป็นภาษาที่เราอ่านออกด้วยคำสั่ง

[sql]select ST_AsText("0101000020E610000069050D6DA01C59405446EEEC865E2B40")[/sql]

โดย Format ก่อนที่เราใส่ค่าลงไปจะเรียกว่า Well-Known Text (WKT) ซึ่งมีรูปแบบตามด้านล่าง

  • POINT(0 0)
  • POINT Z (0 0 0)
  • POINT ZM (0 0 0 0)
  • POINT EMPTY
  • LINESTRING(0 0,1 1,1 2)
  • LINESTRING EMPTY
  • POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
  • MULTIPOINT((0 0),(1 2))
  • MULTIPOINT Z ((0 0 0),(1 2 3))
  • MULTIPOINT EMPTY
  • MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
  • MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
  • GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))

ทดลองดึงค่าด้วยคำสั่งด้านล่างโดยค่าในรูป geom หรือ 4326 ระยะทางของรัศมีนั้นจะต้องกรอกเป็น Decimal degrees ซึ่งระยะ 0.01 จะอยู่ประมาณ 1.11 กิโลเมตร

[sql] SELECT *
FROM tablename
WHERE ST_DWithin( geomColumnName ,ST_GeomFromText(‘POINT(100.44188645309764 13.692027979493453)’,4326),0.01);[/sql]

ซึ่งการใช้ geo ต้องใส่ distance_of_srid ในพารามิเตอร์ให้ตรงแต่อาจจะยากนิดเพราะเป็นดีกรี ดังนั้นแนะนำแปลงให้ SRID มาอยู่ใน UTM แล้วใส่หน่วยเป็น เมตร จะสะดวกกว่า โดยการแปลงค่ากลับเป็น 32647 ด้วย ST_Transform

[sql] SELECT *
FROM tablename
WHERE ST_DWithin(ST_Transform(geomColumnName ,32647),ST_Transform(ST_GeomFromText(‘POINT(100.44244431524457 13.689150932170623)’,4326),32647),1000);[/sql]

Decimal degrees
https://en.wikipedia.org/wiki/Decimal_degrees
PostGis datatype
https://postgis.net/docs/using_postgis_dbmanagement.html#RefObject