วิธีใช้ PostGIS ใน ServBay: เพิ่มขีดความสามารถเชิงพื้นที่ให้ PostgreSQL
PostGIS
เป็นส่วนขยายที่ทรงพลังสำหรับฐานข้อมูล PostgreSQL เพิ่มฟีเจอร์การรองรับชนิดข้อมูล ฟังก์ชัน และดัชนีที่เกี่ยวกับข้อมูลเชิงภูมิสารสนเทศ ซึ่งหมายความว่าคุณสามารถจัดเก็บข้อมูลจุด เส้น รูปหลายเหลี่ยม และข้อมูลตำแหน่งอื่นๆ ในฐานข้อมูล และดำเนินการสอบถามเชิงพื้นที่หรือวิเคราะห์ขั้นสูงได้ เหมาะอย่างยิ่งสำหรับนักพัฒนาเว็บแอปที่ต้องจัดการข้อมูลแผนที่ บริการระบุตำแหน่ง หรือแอปที่เกี่ยวข้องกับตำแหน่งทุกชนิด PostGIS จึงเป็นเครื่องมือสำคัญที่ขาดไม่ได้
ServBay คือสภาพแวดล้อมพัฒนาเว็บบน macOS ที่ได้รวม PostgreSQL พร้อม PostGIS extension มาให้แล้วแบบ bundled ไม่ต้องลงเพิ่มเอง ช่วยให้การใช้งาน PostGIS บนเครื่องของคุณสะดวกและประหยัดเวลา ลงมือใช้ได้ทันที
บทความนี้จะอธิบายอย่างละเอียดถึงวิธีเปิดใช้งานและเริ่มต้นใช้ PostGIS บน ServBay เพื่อให้คุณเพิ่มฟีเจอร์เชิงภูมิสารสนเทศให้โปรเจกต์ของคุณได้อย่างรวดเร็ว
ข้อควรมีเบื้องต้น
ก่อนใช้งาน PostGIS กรุณาเตรียมพร้อมดังนี้
- ติดตั้งและรัน ServBay: ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง ServBay บน macOS แล้ว
- เปิดใช้งานและเริ่ม PostgreSQL package: ที่หน้าควบคุมของ ServBay ให้แน่ใจว่า PostgreSQL ได้ถูก enable และกำลังทำงานอยู่ หากยังไม่ได้เปิด ให้เข้าไปที่แผงควบคุม ServBay เลือก PostgreSQL, ติ๊ก enable แล้วกดเริ่มใช้งาน
- เข้าถึงฐานข้อมูล PostgreSQL: รู้วิธีเชื่อมต่อฐาน PostgreSQL ที่รันบน ServBay ด้วย
psql
(command line) หรือเครื่องมือ GUI เช่น TablePlus, pgAdmin ค่าเริ่มต้นคุณสามารถใช้psql -U postgres
เพื่อเชื่อมต่อฐานข้อมูลบนเครื่องได้เลย
การติดตั้งและเปิดใช้งาน PostGIS Extension
ServBay ได้เตรียมไฟล์ส่วนขยาย PostGIS ให้พร้อมหมดแล้ว คุณแค่ต้อง "เปิดใช้งาน" ในฐานข้อมูลที่ต้องการใช้ PostGIS
ขั้นตอนการเปิดใช้ PostGIS extension มีดังนี้
เชื่อมต่อไปที่ฐานข้อมูล PostgreSQL เป้าหมาย: เปิดแอป Terminal แล้วใช้คำสั่ง
psql
เพื่อเชื่อมต่อฐานข้อมูลของคุณ โดยเปลี่ยนyour_username
เป็นชื่อผู้ใช้ฐานข้อมูล (เช่นpostgres
) และyour_database
เป็นชื่อฐานข้อมูลเป้าหมายbashpsql -U your_username -d your_database
1หากต้องการเปิดใช้งานบนฐานข้อมูลและผู้ใช้
postgres
(default) ให้รันbashpsql -U postgres
1สร้าง Extension PostGIS ในฐานข้อมูล: เมื่อล็อกอินสำเร็จ ที่ prompt ของ
psql
ให้รัน SQL นี้sqlCREATE EXTENSION postgis;
1คำสั่งนี้จะติดตั้งและตั้งค่าทุกองค์ประกอบที่จำเป็นสำหรับ PostGIS ในฐานข้อมูล (เช่น datatype, ฟังก์ชัน, operators ต่างๆ)
ตรวจสอบว่า PostGIS ติดตั้งสำเร็จหรือไม่: ที่ prompt psql ให้ใช้คำสั่ง
\dx
เพื่อตรวจสอบ extension ที่ติดตั้งแล้วsql\dx
1หาก PostGIS ถูก enable จะเห็นรายการ
postgis
กับเวอร์ชันปรากฏในลิสต์List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows)
1
2
3
4
5
6หมายเหตุ: เวอร์ชันของ PostGIS อาจต่างกันไปตามเวอร์ชันของ ServBay
เรียบร้อยแล้ว คุณสามารถเริ่มใช้ความสามารถเชิงภูมิสารสนเทศในฐานข้อมูล PostgreSQL เป้าหมายได้ทันที
การตั้งค่าข้อมูล PostGIS
หลังเปิดใช้ PostGIS คุณสามารถสร้างตารางใหม่ที่เก็บข้อมูลเชิงภูมิสารสนเทศ หรือเพิ่มคอลัมน์ภูมิสารสนเทศเข้าตารางเดิมก็ได้ PostGIS จะมีชนิดข้อมูลหลักคือ geometry
และ geography
โดย geometry
เหมาะกับระบบพิกัดแบบแบนราบ ส่วน geography
เหมาะกับข้อมูลพิกัดแบบ geographic (เช่น latitude/longitude บนพื้นผิวโลก)
สร้างตารางพร้อมคอลัมน์เชิงภูมิสารสนเทศ
ตัวอย่างต่อไปนี้ใช้สร้างตารางชื่อว่า locations
เพื่อเก็บจุดตำแหน่ง
สร้างตาราง: บน psql หรือผ่าน GUI ให้รัน
sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
: คือกำหนดคอลัมน์geom
มีชนิดข้อมูลเป็นจุด (Point) และรหัส SRID เท่ากับ 4326 ซึ่งคือ WGS84 ระบบพิกัดมาตรฐานที่ใช้โดย GPS และแผนที่ใหญ่ๆ อย่าง OpenStreetMap, Google Maps- คุณสามารถเปลี่ยนชนิดรูปร่าง (LineString, Polygon หรือ MultiPoint ฯลฯ) หรือเลือก SRID อื่นได้ตามต้องการ
ใส่ข้อมูลตัวอย่าง: ใช้ฟังก์ชันของ PostGIS แปลง WKT (Well-Known Text) ไปเป็น geometry
sqlINSERT INTO locations (name, geom) VALUES ('ServBay Headquarters', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- ตัวอย่างพิกัดปักกิ่ง ('ServBay Shanghai Office', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- ตัวอย่างพิกัดเซี่ยงไฮ้
1
2
3หมายเหตุ: รูปแบบ WKT สำหรับ
POINT(ลองจิจูด ละติจูด)
สร้างดัชนีเชิงพื้นที่
ถ้าตารางมีข้อมูลภูมิสารสนเทศจำนวนมาก การสร้าง spatial index จะช่วยให้การสืบค้นเร็วขึ้นมาก โดยเฉพาะกับการสอบถามตามขอบเขต ขอบเขตครอบคลุม หรือค้นหาจุดที่ใกล้ที่สุด ดัชนี GiST (Generalized Search Tree) เป็นชนิดที่ใช้บ่อยที่สุดใน PostGIS
สร้างดัชนี GiST: ที่ psql หรือ GUI ให้รัน
sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1คำสั่งนี้จะสร้าง GiST index บนคอลัมน์ geom ในตาราง locations PostgreSQL optimizer จะเลือกใช้อัตโนมัติเมื่อมี query เชิงพื้นที่
การสอบถามข้อมูลเชิงภูมิสารสนเทศด้วย PostGIS
PostGIS มีฟังก์ชันให้ใช้จำนวนมากสำหรับวิเคราะห์และค้นหาข้อมูลภูมิสารสนเทศ ตัวอย่างที่นักพัฒนาเว็บใช้กันบ่อยมีดังนี้
สอบถามระยะห่างระหว่างสองจุด
คำนวณระยะเส้นตรงระหว่างสองตำแหน่ง
sql
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- จุด A
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- จุด B
);
1
2
3
4
2
3
4
ST_Distance()
: คำนวณระยะระหว่าง geometry 2 ชิ้น สำหรับ geometry ที่ใช้ SRID 4326 ผลลัพธ์คือระยะทางแบบองศา หากต้องการหน่วยเมตรและความละเอียดสูงให้ใช้ชนิดgeography
หรือST_Distance(geography_a, geography_b, use_spheroid)
คำสั่งสอบถามความสัมพันธ์ (Containment)
ตรวจสอบว่า geometry หนึ่ง (เช่น พื้นที่) รวม geometry อื่น (เช่น จุด) หรือไม่ เช่นสอบถามว่าจุดใดอยู่ในพื้นที่ขอบเขต
sql
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- ตัวอย่างสี่เหลี่ยม
geom
);
1
2
3
4
5
2
3
4
5
ST_Contains(geometry A, geometry B)
: คืนค่า true ถ้า A ครอบคลุม B ทั้งหมด
สอบถามหาจุดที่ใกล้ที่สุด (Nearest Neighbor)
ค้นหา location ที่ใกล้กับจุดหนึ่งที่สุด พร้อมใช้ GiST index ช่วยให้ดึงข้อมูลได้ไว
sql
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326) -- ใช้ <-> เพื่อเรียงลำดับระยะห่างผ่าน index
LIMIT 5;
1
2
3
4
2
3
4
<->
เป็น operator พิเศษใน PostGIS สำหรับวัด “ระยะทาง” เอื้อให้ query แบบ nearest neighbor เร็วมากเมื่อมี GiST index
การวิเคราะห์ข้อมูลเชิงภูมิสารสนเทศด้วย PostGIS
นอกจากสอบถามพื้นฐานแล้ว PostGIS ยังวิเคราะห์ข้อมูลขั้นสูงกว่าได้ เช่น สร้าง buffer, คำนวณพื้นที่ซ้อนทับ, รวม shape ฯลฯ
การทำ Buffer
สร้างพื้นที่รอบ geometry ตามระยะที่กำหนด (เช่น โซนรอบสำนักงาน)
sql
SELECT ST_Buffer(geom, 0.01) -- buffer ระยะ 0.01 องศาประมาณ 1.1 กม.
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
2
3
ST_Buffer(geometry, distance)
: สร้าง buffer ตามระยะที่ระบุ หน่วยของระยะตรงกับระบบพิกัด (องศา สำหรับ 4326)
ตรวจสอบจุดทับซ้อน (Intersection)
หาส่วนที่ geometry สองอันซ้อนกัน คืนนิยาม geometry ของส่วนที่ทับซ้อน
sql
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
4
5
6
2
3
4
5
6
ST_Intersection(geometry A, geometry B)
: คืน geometry ที่คือส่วนนำมาซ้อนกันของ A กับ B
การรวมรูปทรง (Union)
นำ geometry หลายอันมารวมกันเป็นอันเดียว
sql
SELECT ST_Union(geom)
FROM locations;
1
2
2
ST_Union(geometry set)
: ผนวก geometry ในเซตทั้งหมดเป็นค่าเดียว
การแสดงผลข้อมูลเชิงภูมิสารสนเทศ
การนำข้อมูล PostGIS มาวาดแผนที่หรือแสดงบนเว็บไซต์เป็นโจทย์สำคัญของนักพัฒนา คุณสามารถเลือกใช้โปรแกรม GIS บนคอม หรือไลบรารีแผนที่บนเว็บก็ได้
ใช้เครื่องมือ GIS Desktop (เช่น QGIS)
QGIS เป็นซอฟต์แวร์ GIS โอเพนซอร์สชั้นนำ รองรับการเชื่อมต่อฐานข้อมูล PostGIS โดยตรงและจะอ่านข้อมูลของคุณมาแสดงผล
เชื่อมต่อ PostgreSQL ของ ServBay กับ QGIS:
- เปิดโปรแกรม QGIS
- ไปที่เมนู
Layer
(เลเยอร์) ->Add Layer
(เพิ่มเลเยอร์) ->Add PostGIS Layers...
(เพิ่ม PostGIS เลเยอร์...) - ที่หน้าต่างที่โผล่ขึ้นมา กด
New
(สร้างใหม่) เพื่อเพิ่มการเชื่อมต่อฐานข้อมูล - กรอกรายละเอียด
- Name (ชื่อ): ตั้งชื่อเช่น
ServBay PostGIS
- Host (เครื่อง):
localhost
หรือ127.0.0.1
- Port (พอร์ต): ค่าปกติคือ
5432
- Database (ฐานข้อมูล): ฐานข้อมูลที่คุณเปิด PostGIS ไว้
- Username (ผู้ใช้): เช่น
postgres
- Password (รหัสผ่าน): ตามที่ตั้งไว้
- Name (ชื่อ): ตั้งชื่อเช่น
- กด
Test Connection
(ทดสอบการเชื่อมต่อ) เพื่อยืนยันว่าเชื่อมต่อได้ - กด
OK
เพื่อบันทึก แล้วคลิกConnect
(เชื่อมต่อ)
โหลดข้อมูลเชิงภูมิสารสนเทศ:
- เชื่อมต่อสำเร็จ คุณจะเห็นทุกตารางในฐานข้อมูล
- ค้นหาตารางที่มี spatial column (เช่น
locations
) QGIS จะตรวจจับคอลัมน์ spatial ให้อัตโนมัติ - เลือกตารางที่ต้องการ แล้วคลิก
Add
(เพิ่ม) จากนั้นปิดหน้าต่าง ข้อมูลเชิงภูมิสารสนเทศของคุณจะถูกโชว์บนแผนที่
ใช้ไลบรารีแผนที่เว็บ (เช่น Leaflet)
สามารถแสดงข้อมูลจาก PostGIS บนหน้าเว็บผ่าน JavaScript Map Library เช่น Leaflet, OpenLayers, หรือ Mapbox GL JS (โดย backend ของคุณดึงข้อมูลจาก PostGIS แล้วส่งไปยัง frontend เป็น GeoJSON หรือฟอร์แมตที่รองรับ)
ตัวอย่างพื้นฐานสำหรับ Leaflet — สร้างแผนที่ HTML สามารถนำไปวางในโฟลเดอร์เว็บไซต์ของ ServBay ได้ (เช่น /Applications/ServBay/www/postgis-map/index.html
) แล้วเข้าชมได้ที่ postgis-map.servbay.demo
html
<!DOCTYPE html>
<html>
<head>
<title>ServBay PostGIS Leaflet Example</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 400px; width: 100%; } /* กำหนดขนาดแผนที่ */
</style>
</head>
<body>
<h1>ตัวอย่างการแสดงผล PostGIS ด้วย Leaflet</h1>
<div id="map"></div>
<script>
// สร้างแผนที่ กำหนดศูนย์กรุงเทพ
var map = L.map('map').setView([39.9042, 116.4074], 10);
// เพิ่มเลเยอร์แผนที่ OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// ตัวอย่าง: ปักหมุด (จริงๆ ควรดึงข้อมูลจาก PostGIS Backend)
// ตำแหน่งนี้อิงจาก 'ServBay Headquarters' ด้านบน
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>ServBay Headquarters</b><br>ตัวอย่างตำแหน่ง')
.openPopup();
// ในโปรเจกต์จริงจะ fetch ข้อมูล PostGIS ผ่าน endpoint แล้ววาดบนแผนที่ด้วย L.geoJSON()
/*
fetch('/api/locations') // endpoint ที่ backend คืนข้อมูล GeoJSON
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
ตัวอย่างนี้สาธิตเพียงฟีเจอร์เบื้องต้นของ Leaflet สำหรับนำข้อมูล PostGIS มาใช้จริง จำเป็นต้องสร้าง backend (PHP, Node.js, Python อะไรก็ได้ ServBay รองรับ) เพื่อดึงข้อมูล GeoJSON จากฐานข้อมูลแล้วบริการให้ frontend
คำถามที่พบบ่อย (FAQ)
Q: ถ้าเจอ error ตอนรัน
CREATE EXTENSION postgis;
ต้องทำอย่างไร?- A: ตรวจสอบว่าคุณเชื่อมต่อฐาน PostgreSQL ถูกต้องและ user มีสิทธิ์สร้าง extension (โดยปกติ
postgres
จะมี) และ PostgreSQL ใน ServBay กำลังรันอยู่ ถ้ายังมีปัญหาลองเช็ค log ของ ServBay และ PostgreSQL เพิ่มเติม
- A: ตรวจสอบว่าคุณเชื่อมต่อฐาน PostgreSQL ถูกต้องและ user มีสิทธิ์สร้าง extension (โดยปกติ
Q: SRID 4326 คืออะไร แล้วใช้ SRID อื่นได้ไหม?
- A: SRID (Spatial Reference Identifier) คือรหัสที่ระบุระบบอ้างอิงพิกัด 4326 หมายถึง WGS84 (ละติจูด/ลองจิจูด) ระบบอ้างอิงหลักของแผนที่ออนไลน์และ GPS คุณสามารถใช้ SRID อื่น เช่น 3857 (Web Mercator) ซึ่งนิยมมากสำหรับแผนที่เว็บ การเลือก SRID ขึ้นกับที่มาของข้อมูลและความต้องการของโปรเจกต์
Q: ความต่างระหว่างชนิดข้อมูล
geometry
กับgeography
คืออะไร?- A:
geometry
ใช้สำหรับคำนวณในระบบพิกัดคาร์ทีเชียน (flat/plane) ระยะทางและพื้นที่คำนวณแบบยูคลิดเหมาะสำหรับขอบเขตไม่ใหญ่มากgeography
รองรับข้อมูลภูมิศาสตร์ (บนทรงกลม/โลก) ระยะและพื้นที่คำนวณแม่นยำกว่า (คำนึงถึงความโค้งของโลก) เหมาะจะใช้กับข้อมูลข้ามภูมิภาค สำหรับงานเว็บหรือข้อมูลไม่ใหญ่มากgeometry
มักใช้ง่ายและเร็วกว่า ถ้าเน้นแม่นยำและต้องการเชิง globe ใช้geography
- A:
สรุป
PostGIS ช่วยให้ PostgreSQL รองรับการประมวลผลข้อมูลภูมิสารสนเทศครบวงจร เป็นรากฐานสำคัญสำหรับแอปที่ต้องการความสามารถด้านตำแหน่งต่างๆ ด้วย ServBay คุณสามารถเปิดใช้ PostGIS บน macOS ได้อย่างรวดเร็วโดยไม่ต้องติดตั้งหรือคอมไพล์อะไรเพิ่มเติม
บทความนี้อธิบายตั้งแต่วิธีเปิดใช้ extension การสร้างและจัดการข้อมูลเชิงพื้นที่ การสืบค้นและวิเคราะห์ตัวอย่างพร้อมแนวทาง visualization เบื้องต้น เมื่อเชี่ยวชาญในส่วนนี้แล้วคุณสามารถเริ่มต้นโปรเจกต์เว็บเชิงภูมิสารสนเทศบน ServBay ได้เลย ศึกษาเอกสาร PostGIS เพิ่มเติมเพื่อค้นพบฟีเจอร์ขั้นสูงอีกมากมายที่รอให้คุณใช้งาน