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