GeoPandas สำหรับวิศวกรสำรวจ: Workflow จัดการข้อมูลหมุดพิกัดด้วย Python
ถ้าคุณเป็นวิศวกรสำรวจที่ต้องจัดการข้อมูลหมุดพิกัดหลายพันจุดทุกวัน คงเคยเจอปัญหาแบบนี้ — Excel เปิดไฟล์ CSV 50,000 แถวแล้วค้าง, ต้องแปลงพิกัด Indian 1975 เป็น WGS84 ทีละไฟล์ใน QGIS, หรือต้อง Export Shapefile หลายสิบชุดจากโปรเจกต์เดียวกัน
คำตอบสำหรับปัญหาเหล่านี้คือ GeoPandas — ไลบรารี Python ที่เปลี่ยน workflow งานสำรวจของคุณจาก "manual คลิกทีละไฟล์" ให้กลายเป็น "สคริปต์เดียวทำครั้งเดียวจบ" บทความนี้จะพาคุณเริ่มตั้งแต่ติดตั้ง ไปจนถึงเขียนสคริปต์ใช้งานจริงในงานสำรวจไทย
ทำไมวิศวกรสำรวจถึงต้องรู้จัก GeoPandas

GeoPandas คือไลบรารี Python ที่ต่อยอดจาก Pandas (ซึ่งเป็นเครื่องมือจัดการตารางข้อมูลยอดนิยม) ให้รองรับข้อมูลเชิงพื้นที่ (Spatial Data) ได้ครบถ้วน ทั้ง Point, Line, Polygon พร้อมระบบพิกัด (CRS) ครบทุกระบบที่ใช้ในงานสำรวจไทย
ปัญหาที่ GeoPandas แก้ให้วิศวกรสำรวจ
| ปัญหาเดิม | GeoPandas ช่วยได้อย่างไร |
|---|---|
| Excel ช้าเมื่อข้อมูลเกิน 10,000 แถว | Pandas/GeoPandas จัดการข้อมูลล้านแถวได้สบาย |
| แปลง CRS ทีละไฟล์ใน QGIS | แปลงหลายไฟล์ในลูปเดียว |
| Manual คำนวณระยะ/พื้นที่ | ใช้ฟังก์ชันเดียวทั้งโปรเจกต์ |
| Export Shapefile ทีละชุด | เขียน loop ได้ Shapefile เป็นร้อยในไม่กี่วินาที |
| เช็กข้อมูลซ้ำ/ผิดพลาด | ใช้ spatial query ตรวจสอบอัตโนมัติ |
ข้อดีเทียบกับเครื่องมืออื่น
- ฟรี Open Source — ไม่ต้องซื้อ license แพง
- ทำงานอัตโนมัติได้ — เหมาะกับงานซ้ำๆ เช่น รายเดือน รายโครงการ
- รองรับทุก format — Shapefile, GeoJSON, KML, GeoPackage, PostGIS
- รวมกับ Data Science ได้ — วิเคราะห์ทางสถิติ, Machine Learning, สร้างกราฟ
- Reproducible — สคริปต์เดียวใครรันก็ได้ผลเหมือนกัน เหมาะกับการส่งมอบลูกค้า
💼 เบื้องหลังงานจริงที่ WAIPIA: ทีมเราใช้ Python + GeoPandas เป็น backbone ของทุกโครงการ ตั้งแต่ประมวลผลข้อมูล GNSS RTK ภาคสนาม แปลงระบบพิกัด ไปจนถึงเตรียมข้อมูลให้ Dashboard WebGIS ของลูกค้า — ถ้าองค์กรคุณยังทำงานด้วย Excel/QGIS แบบ manual อยู่ นี่คือจุดที่ปรับปรุงประสิทธิภาพได้มากที่สุด
ติดตั้ง GeoPandas และ Dependencies

วิธีที่แนะนำ: Conda (Miniconda / Anaconda)
GeoPandas อาศัยไลบรารี C/C++ อย่าง GDAL, PROJ, GEOS ซึ่งติดตั้งยากผ่าน pip บน Windows เราจึงแนะนำ Conda เป็นวิธีที่ง่ายและเสถียรที่สุด
# สร้าง environment ใหม่สำหรับงาน GIS
conda create -n gis python=3.11
conda activate gis
# ติดตั้ง GeoPandas และไลบรารีที่เกี่ยวข้อง
conda install -c conda-forge geopandas jupyterlab matplotlib contextily
วิธีที่ 2: pip (สำหรับ macOS/Linux)
pip install geopandas matplotlib contextily
ตรวจสอบการติดตั้ง
import geopandas as gpd
print(gpd.__version__)
# ควรขึ้น version เช่น 1.0.1 หรือสูงกว่า
อ่านข้อมูลหมุดสำรวจจากไฟล์ CSV

สมมติคุณมีไฟล์ control_points.csv จากงานสำรวจ GNSS RTK ที่มีหน้าตาแบบนี้:
point_id,easting,northing,elevation,description
CP-01,660523.412,1515234.178,45.215,หมุดหลัก A
CP-02,660625.180,1515302.456,44.980,หมุดหลัก B
CP-03,660701.335,1515410.002,45.820,จุดตรวจสอบ
ขั้นตอนสร้าง GeoDataFrame
import pandas as pd
import geopandas as gpd
# 1. อ่าน CSV เป็น DataFrame ธรรมดา
df = pd.read_csv("control_points.csv")
# 2. แปลงเป็น GeoDataFrame โดยระบุ CRS เป็น UTM Zone 47N (EPSG:32647)
gdf = gpd.GeoDataFrame(
df,
geometry=gpd.points_from_xy(df.easting, df.northing),
crs="EPSG:32647"
)
print(gdf.head())
print(f"จำนวนหมุด: {len(gdf)}")
print(f"CRS: {gdf.crs}")
อธิบายโค้ด:
gpd.points_from_xy()สร้าง geometry แบบ Point จากคอลัมน์ X, Ycrs="EPSG:32647"บอกว่าพิกัดเป็น UTM Zone 47N (ใช้ในภาคตะวันตกของไทย) ถ้าเป็นภาคตะวันออกใช้EPSG:32648(UTM Zone 48N)
💡 เกี่ยวกับโซน UTM: ประเทศไทยครอบคลุม 2 โซน — Zone 47N (ตะวันตก) และ Zone 48N (ตะวันออก) โดยมีเส้นแบ่งที่ลองจิจูด 102°E อ่านเพิ่มเติมได้ที่บทความ UTM Zone 47 vs 48
แปลงระบบพิกัด (CRS Transformation)

งานสำรวจไทยมักต้องแปลงพิกัดระหว่างระบบต่างๆ — ตัวอย่างที่พบบ่อย:
- Indian 1975 → WGS84 — งานที่ดินเก่าแปลงเข้าระบบใหม่
- UTM 47N → WGS84 Geographic — แสดงบน Google Earth / WebMap
- WGS84 Geographic → UTM — รับพิกัดจาก GNSS แล้วแปลงเป็นระบบโปรเจกต์
ตัวอย่าง: แปลง UTM Zone 47N → WGS84 Geographic (lat/lon)
# แปลง CRS ไปเป็น WGS84 (EPSG:4326)
gdf_wgs84 = gdf.to_crs(epsg=4326)
# ดึงพิกัด lat/lon ใส่คอลัมน์ใหม่
gdf_wgs84["longitude"] = gdf_wgs84.geometry.x
gdf_wgs84["latitude"] = gdf_wgs84.geometry.y
print(gdf_wgs84[["point_id", "latitude", "longitude"]].head())
ตัวอย่าง: แปลง Indian 1975 UTM Zone 47N → WGS84 UTM Zone 47N
# สมมติข้อมูลต้นทางเป็น Indian 1975 / UTM Zone 47N (EPSG:24047)
gdf_old = gpd.read_file("old_cadastre.shp") # อ่าน Shapefile เดิม
print(f"CRS เดิม: {gdf_old.crs}")
# แปลงเป็น WGS84 / UTM Zone 47N (EPSG:32647)
gdf_new = gdf_old.to_crs(epsg=32647)
gdf_new.to_file("new_cadastre.shp")
⚠️ ข้อควรระวัง: การแปลง Indian 1975 ↔ WGS84 ควรใช้พารามิเตอร์ datum transformation ที่ถูกต้องตามพื้นที่ บทความ ระบบพิกัดในไทย อธิบายเรื่องนี้ไว้ละเอียด
EPSG Code ที่ใช้บ่อยในงานสำรวจไทย
| ระบบพิกัด | EPSG |
|---|---|
| WGS84 Geographic (lat/lon) | 4326 |
| WGS84 / UTM Zone 47N | 32647 |
| WGS84 / UTM Zone 48N | 32648 |
| Indian 1975 / UTM Zone 47N | 24047 |
| Indian 1975 / UTM Zone 48N | 24048 |
| Web Mercator (สำหรับ WebMap) | 3857 |
Spatial Operations ที่ใช้บ่อยในงานสำรวจ

1. คำนวณระยะระหว่างหมุด
# ระยะ Euclidean ใน UTM (หน่วยเมตร)
p1 = gdf.geometry.iloc[0]
p2 = gdf.geometry.iloc[1]
distance = p1.distance(p2)
print(f"ระยะจาก {gdf.point_id.iloc[0]} ถึง {gdf.point_id.iloc[1]}: {distance:.3f} m")
# สร้างตารางระยะของหมุดทุกคู่
from itertools import combinations
distances = []
for i, j in combinations(gdf.index, 2):
d = gdf.geometry.iloc[i].distance(gdf.geometry.iloc[j])
distances.append({
"from": gdf.point_id.iloc[i],
"to": gdf.point_id.iloc[j],
"distance_m": round(d, 3)
})
dist_df = pd.DataFrame(distances)
dist_df.to_csv("distance_matrix.csv", index=False)
2. สร้าง Buffer รอบหมุด
# Buffer รัศมี 50 เมตรรอบหมุด (ทำงานกับ UTM เท่านั้น)
buffer_50m = gdf.copy()
buffer_50m["geometry"] = gdf.geometry.buffer(50)
buffer_50m.to_file("control_points_buffer_50m.shp")
3. Spatial Join — หาหมุดที่อยู่ในขอบเขตโครงการ
# อ่านขอบเขตโครงการ
project_area = gpd.read_file("project_boundary.shp")
# Spatial Join: เลือกเฉพาะหมุดที่อยู่ใน polygon
points_in_project = gpd.sjoin(
gdf,
project_area,
how="inner",
predicate="within"
)
print(f"หมุดในโครงการ: {len(points_in_project)} / {len(gdf)} จุด")
4. คำนวณพื้นที่ Polygon
# อ่านแปลงที่ดิน
parcels = gpd.read_file("parcels.shp")
# คำนวณพื้นที่ (ตารางเมตร)
parcels["area_sqm"] = parcels.geometry.area
# แปลงเป็นไร่-งาน-ตารางวา (ถ้าต้องการ)
parcels["area_rai"] = parcels["area_sqm"] / 1600
print(parcels[["parcel_id", "area_sqm", "area_rai"]].head())
5. ตรวจสอบหมุดซ้ำ
# หา geometry ที่ซ้ำกัน (ระยะ < 0.01 m)
from shapely.geometry import Point
duplicates = []
for i in gdf.index:
for j in gdf.index:
if i < j and gdf.geometry[i].distance(gdf.geometry[j]) < 0.01:
duplicates.append((gdf.point_id[i], gdf.point_id[j]))
print(f"พบหมุดซ้ำ {len(duplicates)} คู่")
Export ไฟล์ส่งต่อทีม

GeoPandas รองรับ format ยอดนิยมสำหรับงานสำรวจครบถ้วน
# Shapefile (สำหรับ QGIS/ArcGIS)
gdf.to_file("output/control_points.shp")
# GeoJSON (สำหรับ WebGIS, Leaflet, MapLibre)
gdf_wgs84.to_file("output/control_points.geojson", driver="GeoJSON")
# ไฟล์นี้ส่งให้ Developer นำไปใส่ WebGIS Dashboard ให้ลูกค้าได้ทันที
# KML (สำหรับ Google Earth)
gdf_wgs84.to_file("output/control_points.kml", driver="KML")
# GeoPackage (ไฟล์เดียวเก็บหลาย layer — ทันสมัยกว่า Shapefile)
gdf.to_file("output/survey_project.gpkg", layer="control_points", driver="GPKG")
parcels.to_file("output/survey_project.gpkg", layer="parcels", driver="GPKG")
💡 ถ้ายังไม่แน่ใจว่าจะเลือก Shapefile หรือ GeoJSON อ่านได้ที่ Shapefile vs GeoJSON
ต่อยอดสู่ PostGIS สำหรับโปรเจกต์ใหญ่

เมื่อโปรเจกต์โตขึ้น ข้อมูลเกินหลักล้านแถว หรือทีมหลายคนต้องเข้าถึงพร้อมกัน PostGIS (PostgreSQL + Spatial Extension) คือทางเลือกที่เหมาะสม
เชื่อมต่อจาก GeoPandas
from sqlalchemy import create_engine
# สร้าง connection ไปยัง PostGIS
engine = create_engine(
"postgresql://username:password@localhost:5432/survey_db"
)
# Upload GeoDataFrame เป็นตารางใน PostGIS
gdf.to_postgis(
name="control_points",
con=engine,
if_exists="replace",
index=False
)
# ดึงข้อมูลกลับมา (รองรับ spatial query)
from geopandas import read_postgis
query = """
SELECT * FROM control_points
WHERE ST_DWithin(
geometry,
ST_MakePoint(660600, 1515300),
100
)
"""
nearby = read_postgis(query, engine, geom_col="geometry")
print(f"หมุดในรัศมี 100 ม.: {len(nearby)}")
ข้อดีของ PostGIS สำหรับงานสำรวจ
- รองรับข้อมูลใหญ่ — เก็บข้อมูลหลายสิบล้านจุดไม่มีปัญหา
- Multi-user — ทีมหลายคนเข้าถึงพร้อมกันได้ปลอดภัย
- Spatial Index — ค้นหาข้อมูลเชิงพื้นที่เร็วแบบฉับพลัน
- รวมกับ WebGIS ง่าย — เชื่อมต่อกับ GeoServer, pg_tileserv, Supabase
- Versioning / Backup — ระบบ Transaction + Point-in-time recovery
🗄️ ไม่อยากตั้ง Server เอง? WAIPIA มีบริการ ออกแบบและวางระบบ Spatial Database บน PostGIS หรือ Supabase แบบ turnkey พร้อมเชื่อมต่อกับ Dashboard WebGIS ให้ใช้งานได้ทันที เหมาะกับโครงการที่มีข้อมูลหลายล้านจุดหรือทีมหลายคนที่ต้องเข้าถึงพร้อมกัน
ตัวอย่าง Workflow เต็มสำหรับงานสำรวจรายวัน

import geopandas as gpd
import pandas as pd
from pathlib import Path
def process_survey_project(csv_file, output_dir):
"""Workflow สำหรับประมวลผลไฟล์งานสำรวจรายวัน"""
# 1. อ่านและสร้าง GeoDataFrame
df = pd.read_csv(csv_file)
gdf = gpd.GeoDataFrame(
df,
geometry=gpd.points_from_xy(df.easting, df.northing),
crs="EPSG:32647"
)
# 2. กรองข้อมูลที่ผิดปกติ (ค่า elevation ผิดปกติ)
gdf = gdf[(gdf.elevation > -10) & (gdf.elevation < 2000)]
# 3. สร้างหลาย CRS
output = Path(output_dir)
output.mkdir(exist_ok=True)
gdf.to_file(output / "points_utm47.shp")
gdf.to_crs(4326).to_file(output / "points_wgs84.geojson", driver="GeoJSON")
gdf.to_crs(4326).to_file(output / "points_google_earth.kml", driver="KML")
# 4. สรุปสถิติ
summary = {
"total_points": len(gdf),
"elev_min": gdf.elevation.min(),
"elev_max": gdf.elevation.max(),
"elev_mean": round(gdf.elevation.mean(), 3),
"bbox": list(gdf.total_bounds)
}
import json
with open(output / "summary.json", "w", encoding="utf-8") as f:
json.dump(summary, f, ensure_ascii=False, indent=2)
print(f"✅ ประมวลผล {len(gdf)} หมุด — Export ที่ {output_dir}")
return summary
# ใช้งาน
process_survey_project(
csv_file="data/day_2026-04-25.csv",
output_dir="output/2026-04-25"
)
สคริปต์ข้างต้นใช้ได้จริงทุกวัน เพียงเปลี่ยน filename วันใหม่ก็ได้ผลลัพธ์ครบ — ประหยัดเวลา Manual ได้มากกว่าชั่วโมงต่อวัน
🛠️ จาก Script สู่ Application จริง: เมื่อสคริปต์ Python ของคุณซับซ้อนขึ้น หรือต้องให้ทีมภาคสนามใช้งานโดยไม่ต้องรันคำสั่ง WAIPIA รับแปลงสคริปต์ GeoPandas ของคุณเป็น Web Application หรือ Mobile App ให้ทีมสำรวจใช้งานผ่านหน้าจอ UI ได้ทันที — อัปโหลด CSV, เลือก CRS, กดปุ่ม, รับ Shapefile / GeoJSON พร้อมใช้งาน ไม่ต้องเปิด Terminal อีกต่อไป
สรุป

GeoPandas เปลี่ยนงานสำรวจจากการ Manual คลิกทีละไฟล์ใน QGIS/Excel ให้กลายเป็น สคริปต์อัตโนมัติ ที่ทำงานซ้ำได้ Reproducible และรวดเร็ว เหมาะอย่างยิ่งกับงานที่มีข้อมูลจำนวนมาก หรือต้องทำเป็นประจำทุกวัน
ประเด็นสำคัญที่ควรจำ:
- เริ่มติดตั้งด้วย Conda จะง่ายและเสถียรที่สุด
- ใช้
gpd.points_from_xy()สร้าง Point จาก CSV และระบุ CRS ด้วย EPSG code to_crs()คือฟังก์ชันหลักสำหรับแปลงระบบพิกัด Indian 1975 ↔ WGS84 ↔ UTM- Spatial Operations (buffer, distance, sjoin, area) ใช้งานได้ทันที
- ต่อยอดสู่ PostGIS เมื่อโปรเจกต์ใหญ่หรือทีมหลายคน
สำหรับวิศวกรสำรวจที่เริ่มต้นใหม่ ขอให้ลองเขียนสคริปต์เล็กๆ สำหรับงานซ้ำของตัวเองก่อน เช่น แปลง CRS หรือ Export Shapefile จาก CSV — แล้วจะเห็นว่า Python + GeoPandas คุ้มค่ากับการเรียนรู้ขนาดไหน
บทความที่เกี่ยวข้อง
- ระบบพิกัดในประเทศไทย: Indian 1975, WGS84, ITRF
- UTM Zone 47 vs 48: วิธีเลือกโซนให้ถูกต้อง
- Shapefile vs GeoJSON: เลือกใช้อย่างไร
- สร้าง WebGIS ด้วย Leaflet และ MapLibre
- คู่มือ GNSS RTK สำหรับวิศวกรสำรวจ
เกี่ยวกับ WAIPIA Development
หากคุณสนใจงานสำรวจภาคสนามที่ผสานเข้ากับระบบ WebGIS, PostGIS Database หรือ Python Automation WAIPIA พร้อมให้คำปรึกษาและบริการครบวงจร ตั้งแต่ GNSS RTK, Drone Photogrammetry, LiDAR จนถึงการพัฒนา Platform ข้อมูลเชิงพื้นที่เฉพาะโครงการของคุณ
บริการพัฒนาซอฟต์แวร์ด้าน GIS / Geospatial:
- 🖥️ รับพัฒนา WebGIS / Web Application — แผนที่ออนไลน์ Interactive, Dashboard ข้อมูลสำรวจ, ระบบจัดการแปลงที่ดิน, Platform แสดงข้อมูล Drone/LiDAR (React, Next.js, Leaflet, MapLibre, Cesium)
- 📱 รับพัฒนา Mobile Application ด้าน Geospatial — แอป Field Survey, GNSS Logger, ระบบเก็บข้อมูลภาคสนามแบบ Offline-first, แอปตรวจสอบหมุดสำรวจ (iOS / Android / Flutter / React Native)
- 🗄️ ออกแบบและวางระบบ Spatial Database — PostGIS, Supabase, Geoserver, pg_tileserv สำหรับโครงการขนาดใหญ่
- ⚙️ Python Automation & ETL สำหรับงานสำรวจ — พัฒนาสคริปต์แปลงข้อมูล CRS, สร้างรายงาน, เชื่อมต่อ API, และ Workflow อัตโนมัติเฉพาะองค์กร
ไม่ว่าคุณจะเป็นบริษัทสำรวจ เจ้าของโครงการอสังหาริมทรัพย์ หน่วยงานราชการ หรือสตาร์ทอัพด้านภูมิสารสนเทศ WAIPIA มีทีมวิศวกรสำรวจและนักพัฒนาซอฟต์แวร์ที่เข้าใจทั้งสองโลกพร้อมให้บริการ
- 📞 โทร: 095-7243421
- 💬 Line OA: @info_wd
- 🌐 เว็บไซต์: waipia.com