สร้าง WebGIS ด้วย Leaflet และ MapLibre: คู่มือสำหรับวิศวกรสำรวจ
ในยุคที่ข้อมูลสำรวจทุกชุดถูกเก็บในรูปแบบดิจิทัล คำถามที่วิศวกรและช่างสำรวจหลายคนเริ่มถามคือ "จะนำข้อมูลพิกัดและ GeoJSON เหล่านี้ขึ้นแสดงบนเว็บให้ลูกค้าดูได้อย่างไร?" คำตอบอยู่ที่ WebGIS — และเครื่องมือที่ทรงพลังที่สุดในขณะนี้คือ Leaflet และ MapLibre GL JS ซึ่งทั้งสองตัวเป็น Open Source ใช้ฟรี และรองรับข้อมูลสำรวจได้อย่างสมบูรณ์
บทความนี้จะพาคุณตั้งแต่ต้นจนจบ ตั้งแต่ความเข้าใจพื้นฐานของ WebGIS ไปจนถึงการเขียนโค้ดแสดงข้อมูลจากงานสำรวจจริงบนแผนที่ออนไลน์
WebGIS คืออะไร และทำไมวิศวกรสำรวจถึงต้องรู้จัก

WebGIS (Web-based Geographic Information System) คือระบบแผนที่และข้อมูลเชิงพื้นที่ที่ทำงานผ่านเว็บเบราว์เซอร์ โดยไม่ต้องติดตั้งโปรแกรมพิเศษ ผู้ใช้เพียงเปิดเว็บไซต์ก็สามารถดูแผนที่, ค้นหาข้อมูล, และวิเคราะห์ผลได้ทันที
สำหรับวิศวกรสำรวจ WebGIS มีประโยชน์ในหลายด้าน:
- รายงานผลให้ลูกค้า — นำเสนอตำแหน่งหมุดสำรวจ, เส้นทาง, หรือขอบเขตโครงการบนแผนที่แบบ Interactive แทนการส่งไฟล์ PDF
- ติดตามงานภาคสนาม — แสดงตำแหน่ง GPS Real-time ของทีมสำรวจ
- วิเคราะห์ข้อมูล — Overlay ข้อมูล Survey หลายชั้นบนแผนที่เดียวกัน
- แชร์ข้อมูล GIS — แสดงไฟล์ Shapefile, GeoJSON, หรือ KML บนเว็บโดยไม่ต้องใช้ ArcGIS Online
ความแตกต่างระหว่าง WebGIS กับ Desktop GIS
| รายการ | Desktop GIS (QGIS/ArcGIS) | WebGIS (Leaflet/MapLibre) |
|---|---|---|
| การติดตั้ง | ต้องติดตั้งบนเครื่อง | ไม่ต้องติดตั้ง เปิดเบราว์เซอร์ได้เลย |
| การแชร์ | ส่งไฟล์ให้กัน | แชร์ URL ลิงก์ |
| ประสิทธิภาพ | สูง รองรับข้อมูลขนาดใหญ่ | ขึ้นกับการออกแบบ |
| ค่าใช้จ่าย | มีทั้งฟรีและเสียเงิน | ส่วนใหญ่ฟรี |
| การพัฒนา | ใช้งานได้ทันที | ต้องเขียนโค้ด HTML/JS |
Leaflet vs MapLibre GL JS: เลือกใช้อะไรดีสำหรับงานสำรวจ?

ก่อนเริ่มเขียนโค้ด ต้องตัดสินใจก่อนว่าจะใช้ไลบรารีไหน เพราะทั้งสองมีจุดแข็งต่างกัน
Leaflet — เรียบง่าย เริ่มต้นได้เร็ว
Leaflet เป็นไลบรารีแผนที่ JavaScript ที่ได้รับความนิยมสูงสุดในโลก ด้วยขนาดเพียง ~42KB มันรองรับ Raster Tiles (PNG/JPEG) เป็นหลัก เหมาะสำหรับ:
- งานที่ต้องการเริ่มต้นเร็ว ไม่ซับซ้อน
- แสดง Markers, Lines, Polygons บน Basemap
- นำเข้าข้อมูล GeoJSON จากงานสำรวจ
- ผู้เริ่มต้นที่ยังไม่คุ้นกับ JavaScript มากนัก
MapLibre GL JS — ทรงพลัง รองรับ 3D
MapLibre GL JS คือ Fork ของ Mapbox GL JS ที่เป็น Open Source เต็มตัว ใช้เทคโนโลยี WebGL ในการ Render ทำให้:
- แสดงแผนที่ 3D ได้ (เช่น แสดงค่าความสูง DEM)
- รองรับ Vector Tiles ประสิทธิภาพสูง
- Zoom ราบรื่น หมุนมุมมองได้
- เหมาะกับโปรเจกต์ขนาดใหญ่หรือต้องการแสดงผล 3D
ตารางเปรียบเทียบ
| คุณสมบัติ | Leaflet | MapLibre GL JS |
|---|---|---|
| ขนาดไลบรารี | ~42KB | ~900KB |
| การเรียนรู้ | ง่าย | ปานกลาง |
| รองรับ 3D | ไม่รองรับ (native) | รองรับ |
| Vector Tiles | ผ่าน Plugin | รองรับ native |
| Raster Tiles | รองรับ native | รองรับ |
| GeoJSON | รองรับ native | รองรับ native |
| Community | ใหญ่มาก | กำลังเติบโต |
คำแนะนำ: ถ้าเพิ่งเริ่มต้นหรือต้องการแสดงจุด/เส้น/พื้นที่บน Basemap — เลือก Leaflet ถ้าต้องการแผนที่ 3D, Performance สูง หรือ Vector Tiles — เลือก MapLibre GL JS
เริ่มต้นสร้างแผนที่ด้วย Leaflet

มาเริ่มต้นกันด้วยโค้ดง่ายๆ ที่สามารถเปิดในเบราว์เซอร์ได้ทันที
ขั้นตอนที่ 1: สร้างไฟล์ HTML พื้นฐาน
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebGIS สำรวจ — WAIPIA</title>
<!-- โหลด Leaflet CSS -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<style>
body { margin: 0; }
#map { height: 100vh; width: 100%; }
</style>
</head>
<body>
<div id="map"></div>
<!-- โหลด Leaflet JS -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
// สร้างแผนที่ ตั้ง Center ที่กรุงเทพฯ, Zoom 13
const map = L.map('map').setView([13.7563, 100.5018], 13);
// เพิ่ม Basemap จาก OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors',
maxZoom: 19
}).addTo(map);
</script>
</body>
</html>
บันทึกไฟล์นี้เป็น index.html แล้วเปิดในเบราว์เซอร์ — คุณจะเห็นแผนที่ OpenStreetMap ทันที โดยไม่ต้องติดตั้งอะไรเพิ่ม
ขั้นตอนที่ 2: เลือก Basemap ที่เหมาะสม
สำหรับงานสำรวจ บางครั้ง OpenStreetMap อาจไม่เพียงพอ ลองใช้ภาพถ่ายดาวเทียมแทน:
// Basemap ภาพถ่ายดาวเทียม (Esri)
const satellite = L.tileLayer(
'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
{ attribution: '© Esri', maxZoom: 19 }
).addTo(map);
// Basemap Topographic
const topo = L.tileLayer(
'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',
{ attribution: '© OpenTopoMap', maxZoom: 17 }
);
// สร้าง Layer Control ให้สลับ Basemap ได้
const baseMaps = {
"ภาพถ่ายดาวเทียม": satellite,
"Topographic": topo
};
L.control.layers(baseMaps).addTo(map);
นำข้อมูลสำรวจขึ้นแผนที่ — Markers, GeoJSON และ Popup

ส่วนที่วิศวกรสำรวจจะใช้บ่อยที่สุดคือการนำข้อมูลพิกัดจากงานจริงขึ้นแสดงบนแผนที่
แสดงหมุดสำรวจ (Survey Control Points)
// ข้อมูลหมุดสำรวจ (ตัวอย่าง)
const controlPoints = [
{ id: "BM-001", lat: 13.7563, lng: 100.5018, elev: 12.34, desc: "หมุดอ้างอิงหลัก" },
{ id: "BM-002", lat: 13.7580, lng: 100.5050, elev: 13.12, desc: "หมุดระดับ A" },
{ id: "BM-003", lat: 13.7540, lng: 100.4990, elev: 11.87, desc: "หมุดระดับ B" }
];
// สร้าง Marker พร้อม Popup แสดงข้อมูล
controlPoints.forEach(point => {
L.marker([point.lat, point.lng])
.bindPopup(`
<b>${point.id}</b><br>
${point.desc}<br>
ละติจูด: ${point.lat}<br>
ลองจิจูด: ${point.lng}<br>
ระดับ: ${point.elev} ม. (MSL)
`)
.addTo(map);
});
นำเข้าข้อมูล GeoJSON จากงานสำรวจ
ไฟล์ GeoJSON เป็นรูปแบบที่ QGIS และซอฟต์แวร์สำรวจส่วนใหญ่ Export ออกมาได้ Leaflet รองรับโดยตรง:
// โหลด GeoJSON จากไฟล์ (ต้องรันผ่าน Web Server)
fetch('survey-boundary.geojson')
.then(response => response.json())
.then(data => {
L.geoJSON(data, {
style: {
color: '#ff7800', // สีเส้นขอบ
weight: 3, // ความหนาของเส้น
opacity: 1,
fillColor: '#ffb347', // สีพื้น
fillOpacity: 0.3
},
onEachFeature: (feature, layer) => {
if (feature.properties) {
layer.bindPopup(`
<b>${feature.properties.name || 'ขอบเขตโครงการ'}</b><br>
พื้นที่: ${feature.properties.area_rai || '-'} ไร่
`);
}
}
}).addTo(map);
});
แสดงเส้นทางสำรวจ (Survey Traverse)
// จุดพิกัดเส้นทาง Traverse (ลำดับ)
const traversePoints = [
[13.7563, 100.5018],
[13.7570, 100.5030],
[13.7555, 100.5045],
[13.7540, 100.5035],
[13.7545, 100.5020]
];
// วาดเส้น Traverse
const traverseLine = L.polyline(traversePoints, {
color: '#0066cc',
weight: 3,
dashArray: '8, 4' // เส้นประ
}).addTo(map);
// Fit แผนที่ให้ครอบคลุมเส้นทางทั้งหมด
map.fitBounds(traverseLine.getBounds());
MapLibre GL JS: แผนที่ 3D และ Vector Tiles สำหรับงานขั้นสูง

เมื่อโปรเจกต์ต้องการแสดง ข้อมูลความสูง (DEM/DSM) หรือแผนที่แบบ 3D MapLibre GL JS คือตัวเลือกที่ดีที่สุด
ติดตั้งและสร้างแผนที่ MapLibre พื้นฐาน
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<title>WebGIS 3D — WAIPIA</title>
<link href="https://unpkg.com/maplibre-gl@4.0.0/dist/maplibre-gl.css" rel="stylesheet" />
<style>
body { margin: 0; }
#map { height: 100vh; }
</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/maplibre-gl@4.0.0/dist/maplibre-gl.js"></script>
<script>
const map = new maplibregl.Map({
container: 'map',
style: 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json',
center: [100.5018, 13.7563], // [lng, lat] — สังเกตลำดับกลับจาก Leaflet
zoom: 12,
pitch: 45, // เอียงมุมมอง 45 องศา
bearing: -15 // หมุนแผนที่ -15 องศา
});
// เพิ่ม Navigation Control
map.addControl(new maplibregl.NavigationControl());
</script>
</body>
</html>
เพิ่ม Marker และ Popup ใน MapLibre
// เพิ่ม Marker
new maplibregl.Marker({ color: '#ff7800' })
.setLngLat([100.5018, 13.7563]) // [lng, lat]
.setPopup(
new maplibregl.Popup({ offset: 25 })
.setHTML('<b>BM-001</b><br>ระดับ: 12.34 ม.')
)
.addTo(map);
แสดงข้อมูล GeoJSON ใน MapLibre
map.on('load', () => {
// เพิ่ม Source ข้อมูล
map.addSource('survey-area', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'Polygon',
coordinates: [[
[100.4990, 13.7540],
[100.5050, 13.7540],
[100.5050, 13.7590],
[100.4990, 13.7590],
[100.4990, 13.7540]
]]
},
properties: { name: 'ขอบเขตโครงการ A', area_rai: 45.6 }
}
});
// เพิ่ม Layer แสดงพื้นที่
map.addLayer({
id: 'survey-fill',
type: 'fill',
source: 'survey-area',
paint: {
'fill-color': '#ff7800',
'fill-opacity': 0.3
}
});
// เพิ่ม Layer เส้นขอบ
map.addLayer({
id: 'survey-outline',
type: 'line',
source: 'survey-area',
paint: {
'line-color': '#ff7800',
'line-width': 3
}
});
});
ตัวอย่างการแสดงข้อมูล GNSS RTK บน WebGIS

สถานการณ์จริง: นำไฟล์ CSV ที่ Export จาก GNSS Receiver มาแสดงบนแผนที่
แปลง CSV ของงาน GNSS เป็น GeoJSON
สมมุติว่าคุณมีไฟล์ CSV จากงาน GNSS RTK ดังนี้:
point_id,northing,easting,height,description
P001,1521234.567,669876.543,12.345,หมุด Control หลัก
P002,1521350.123,669920.456,13.210,มุมอาคาร A
P003,1521280.789,670015.321,12.890,มุมอาคาร B
ต้องแปลงจาก UTM Zone 47N (Indian 1975) เป็น WGS84 ก่อน จากนั้นสร้าง GeoJSON:
// ข้อมูลที่แปลงเป็น WGS84 แล้ว
const gnssPoints = {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: { type: "Point", coordinates: [100.5018, 13.7563] },
properties: { id: "P001", height: 12.345, desc: "หมุด Control หลัก" }
},
{
type: "Feature",
geometry: { type: "Point", coordinates: [100.5030, 13.7575] },
properties: { id: "P002", height: 13.210, desc: "มุมอาคาร A" }
},
{
type: "Feature",
geometry: { type: "Point", coordinates: [100.5045, 13.7567] },
properties: { id: "P003", height: 12.890, desc: "มุมอาคาร B" }
}
]
};
// แสดงบน Leaflet
const gnssLayer = L.geoJSON(gnssPoints, {
pointToLayer: (feature, latlng) => {
// ใช้ Circle Marker แทน Icon มาตรฐาน
return L.circleMarker(latlng, {
radius: 8,
fillColor: '#e74c3c',
color: '#fff',
weight: 2,
opacity: 1,
fillOpacity: 0.9
});
},
onEachFeature: (feature, layer) => {
const p = feature.properties;
layer.bindPopup(`
<div style="min-width:150px">
<b style="font-size:14px">${p.id}</b><br>
<hr style="margin:4px 0">
<b>คำอธิบาย:</b> ${p.desc}<br>
<b>ความสูง:</b> ${p.height} ม. (Ellipsoidal)<br>
<b>พิกัด:</b> ${feature.geometry.coordinates[1].toFixed(6)}N,
${feature.geometry.coordinates[0].toFixed(6)}E
</div>
`);
}
}).addTo(map);
// ซูมไปยังข้อมูล
map.fitBounds(gnssLayer.getBounds().pad(0.1));
เพิ่ม Measurement Tool (วัดระยะและพื้นที่)
สำหรับงานสำรวจ การวัดระยะบนแผนที่เป็นสิ่งที่ขาดไม่ได้:
// ติดตั้ง Plugin: Leaflet.Measure
// <script src="https://unpkg.com/leaflet-measure@3.1.0/dist/leaflet-measure.js"></script>
L.control.measure({
primaryLengthUnit: 'meters',
secondaryLengthUnit: 'kilometers',
primaryAreaUnit: 'sqmeters',
secondaryAreaUnit: 'hectares',
localization: 'en'
}).addTo(map);
Deploy WebGIS ขึ้น Server

เมื่อพัฒนาเสร็จแล้ว การ Deploy ทำได้หลายวิธี:
วิธีที่ 1: GitHub Pages (ฟรี เหมาะกับโปรเจกต์ขนาดเล็ก)
# สร้าง Repository บน GitHub
git init
git add .
git commit -m "WebGIS Survey Map"
git remote add origin https://github.com/username/survey-map.git
git push -u origin main
# เปิด GitHub Pages ใน Settings → Pages → Branch: main
แผนที่จะออนไลน์ที่ https://username.github.io/survey-map/
วิธีที่ 2: Netlify Drop (เร็วที่สุด ใช้เวลา 1 นาที)
เข้าไปที่ netlify.com/drop แล้วลากโฟลเดอร์ทิ้งลงไป ระบบจะ Deploy อัตโนมัติ ได้ URL พร้อมใช้ทันที
วิธีที่ 3: รันบน VPS หรือ Cloud Server
# ติดตั้ง Nginx
sudo apt install nginx
# Copy ไฟล์เว็บไปที่
cp -r ./webgis/* /var/www/html/
# Start Nginx
sudo systemctl start nginx
เคล็ดลับสำหรับวิศวกรสำรวจ

ก่อนจบ ขอแนะนำสิ่งที่มักถูกมองข้ามในการทำ WebGIS สำหรับงานสำรวจ:
เรื่องระบบพิกัด (Coordinate System) — Leaflet และ MapLibre ใช้ WGS84 (EPSG:4326) เป็น Standard ถ้าข้อมูลของคุณอยู่ในระบบ UTM Zone 47N / Indian 1975 ต้องแปลงก่อนเสมอ สามารถใช้ QGIS หรือ proj4js library ในการแปลง
ขนาดไฟล์ GeoJSON — ถ้าข้อมูลมีจำนวนจุดมาก (เช่น Point Cloud หรือ Contour เส้นชั้นความสูงละเอียด) ให้ Simplify Geometry ก่อน ใช้คำสั่ง mapshaper หรือ QGIS Simplify เพื่อลดขนาดไฟล์
HTTPS บน Production — ฟีเจอร์ Geolocation ของเบราว์เซอร์ต้องการ HTTPS จึงจะทำงาน ถ้าต้องการแสดงตำแหน่ง GPS ของผู้ใช้ ต้องใช้ SSL Certificate
สรุป
WebGIS ด้วย Leaflet และ MapLibre GL JS เปิดโอกาสให้วิศวกรสำรวจสามารถนำข้อมูลที่เก็บมาจากภาคสนามมาแสดงผลบนเว็บได้อย่างมืออาชีพโดยไม่ต้องพึ่งพา GIS Software ราคาแพง ไม่ว่าจะเป็นหมุดสำรวจ เส้นทาง Traverse ขอบเขตโครงการ หรือข้อมูล GNSS RTK ก็สามารถนำขึ้นแผนที่ออนไลน์ได้ทั้งหมด
สำหรับผู้เริ่มต้น ให้เริ่มที่ Leaflet ก่อนเพราะเรียนรู้ง่ายและโค้ดน้อยกว่า เมื่อชำนาญแล้วค่อยขยับไป MapLibre GL JS เพื่อรองรับงานที่ต้องการ 3D และ Performance สูงขึ้น
หากต้องการพัฒนาระบบ WebGIS สำหรับองค์กรหรือโครงการสำรวจของคุณ ทีม WAIPIA Development พร้อมให้คำปรึกษาและรับพัฒนาระบบครบวงจร
บทความโดย ทีม WAIPIA Development — บริการสำรวจและแผนที่ครบวงจร โทรศัพท์: 095-7243421 | Line OA: @info_wd | เว็บไซต์: waipia.com