+280m+320m
← กลับไปบทความทั้งหมดTutorial

GeoPandas สำหรับวิศวกรสำรวจ: Workflow จัดการข้อมูลหมุดพิกัดด้วย Python

2026-04-25T00:39:23+07:00ทีม WAIPIAอ่าน 8 นาที
GeoPandas สำหรับวิศวกรสำรวจ: Workflow จัดการข้อมูลหมุดพิกัดด้วย Python

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

คำตอบสำหรับปัญหาเหล่านี้คือ GeoPandas — ไลบรารี Python ที่เปลี่ยน workflow งานสำรวจของคุณจาก "manual คลิกทีละไฟล์" ให้กลายเป็น "สคริปต์เดียวทำครั้งเดียวจบ" บทความนี้จะพาคุณเริ่มตั้งแต่ติดตั้ง ไปจนถึงเขียนสคริปต์ใช้งานจริงในงานสำรวจไทย

ทำไมวิศวกรสำรวจถึงต้องรู้จัก GeoPandas

ตารางเปรียบเทียบปัญหาเดิมในงานสำรวจกับวิธีแก้ด้วย GeoPandas Python 5 ข้อ

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

4 ขั้นตอนติดตั้ง GeoPandas ด้วย Conda: ติดตั้ง Miniconda, สร้าง Environment, Activate, Install Packages

วิธีที่แนะนำ: 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

ไดอะแกรม 3 ขั้นตอนแปลง CSV หมุดพิกัดเป็น DataFrame และ GeoDataFrame พร้อม CRS

สมมติคุณมีไฟล์ 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, Y
  • crs="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, WGS84 Geographic พร้อมตาราง EPSG Code ไทย

งานสำรวจไทยมักต้องแปลงพิกัดระหว่างระบบต่างๆ — ตัวอย่างที่พบบ่อย:

  • 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 ที่ใช้บ่อยในงานสำรวจ

5 ฟังก์ชันหลัก Spatial Operations ของ GeoPandas: Distance, Buffer, Spatial Join, Area, Find Dupes

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 ไฟล์ส่งต่อทีม

4 รูปแบบไฟล์ที่ GeoPandas Export ได้: Shapefile, GeoJSON, KML, GeoPackage พร้อมกลุ่มผู้ใช้

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 สำหรับโปรเจกต์ใหญ่

สถาปัตยกรรม GeoPandas เชื่อม PostGIS ไปยัง WebGIS พร้อมข้อดี 5 ข้อสำหรับงานสำรวจ

เมื่อโปรเจกต์โตขึ้น ข้อมูลเกินหลักล้านแถว หรือทีมหลายคนต้องเข้าถึงพร้อมกัน 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 เต็มสำหรับงานสำรวจรายวัน

Pipeline 4 ขั้นตอนสำหรับ Workflow งานสำรวจรายวัน: Read CSV, Filter, Multi-CRS Export, Summary JSON

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 อีกต่อไป

สรุป

5 ประเด็นสำคัญของ GeoPandas สำหรับงานสำรวจ: Conda, points_from_xy, to_crs, Spatial Ops, PostGIS

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 คุ้มค่ากับการเรียนรู้ขนาดไหน

บทความที่เกี่ยวข้อง


เกี่ยวกับ 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
PythonGeoPandasGISงานสำรวจPostGISCoordinate SystemsTutorial