การนำเข้าข้อมูลจากไฟล์ CSV เป็นลายเส้น Polygon
- ก็ถือว่าเป็นทิปและทริคเล็กๆน้อยๆ ในกรณีสร้าง Vector ที่เป็นรูป Polygon จากข้อมูลดั้งเดิมที่เป็นไฟล์ Excel แล้วแปลงเป็น CSV นำมาสร้างเป็นรูป Vector ใน Quantum GIS ซึ่งโปรแกรมด้าน GIS ที่ฟรีและเปิดโค๊ด cross-platform ในแวดวง GIS คงรู้จักกันดี ข้อมูลในเบื้องต้นที่จะนำมาทดสอบเป็นตัวอย่างคือ
- ไฟล์รูปแปลงที่ดิน งานสำรวจในภาคสนามจะได้มาเป็นค่าพิกัด UTM และมี ID สำหรับรูปแปลงที่ดินไว้ด้วย ส่วนใหญ่แล้วเมื่อได้ค่าพิกัดแปลงที่ดินจากสนามแล้ว Draftman จะทำการสร้างรูปใน Autocad เพื่อตรวจสอบรูปร่าง ซึ่งการนำไฟล์ CAD แปลงเป็นฟอร์แม็ต้าน GIS ทำได้หลายโปรแกรมเช่นเปิดไฟล์ CAD ด้วย Global Mapper ทำการสร้าง attribute เพื่อเก็บ ID รูปแปลงที่ดิน แต่ในกรณีผมขอย้อนไปจุดเริ่มว่าถ้ามีไฟล์แบบ CSV และเก็บรูปแปลงเป็นค่าพิกัดเรียงไปตามลำดับจะทำอย่างไร?
- ไฟล์Attribute เก็บ Parcel_ID แปลงที่ดินพร้อมคุณสมบัติต่างเช่น ชื่อแปลงที่ดิน, ชื่อกลุ่มแปลงที่ดิน
ความต้องการขั้นต้นใน QGIS
- ต้องการ Plug-in ชื่อ “Add Delimited Text Layer” เป็นปลั๊กอินที่มากับ QGIS ตั้งแต่ติดตั้งเสร็จตอนแรกไม่แสดง ต้องทำการเลือกก่อนผ่านเมนู Plugins > Manage Plugins… ทำเครื่องหมายเลือกให้กับ “Add Delimited Text Layer” เท่านี้ก็ใช้ได้
- ต้องการ Plug-in ชื่อ “Points2One” ปลั๊กอินตัวนี้ไม่ได้มาแต่แรก ต้องติดตั้งเพิ่มผ่านทางเมนู Plugins > Fetch Python Plugins… ต้องอินเทอร์เน็ตด้วยจึงจะดาวน์โหลดแล้วติดตั้งได้
- ต้องการ Plug-in ชื่อ “MMQGIS”เหมือนกับตัวบนคือต้องติดตั้งเพิ่ม
- Plug-in ชื่อ “fTools” มากับ QGIS ตั้งแต่แรกแล้ว
ขั้นตอนการทำงาน
- รวมไฟล์แปลงที่ดินเป็นไฟล์เดียว ถ้าไฟล์แปลงที่ดินเก็บแยกไฟล์กันให้นำมารวมเป็นไฟล์ CSV ไฟล์เดียวจะสะดวกมาก แต่ละวงของ polygon จะต่างกันที่ Parcel_ID
นำเข้าไฟล์ CSV
- ใช้ปลั๊กอิน “Add Delimited Text Layer” ทำการอ่านไฟล์ CSV ของเรา ผลลัพธ์จะอยู่ในรูปจุด (Point) แต่ละจุดจะมี Parcel_ID ที่ต่างกัน และในกลุ่มจุดที่ Parcel_ID เดียวกัน QGIS จะสร้าง feather_id ให้ตามลำดับการนำเข้า
แปลงข้อมูลจุด (Point) เป็นลายเส้น (Polygon)
ใช้ปลั๊กอิน “Points2One” ทำการรวมจุดที่มี Parcel_ID เดียวกันเป็น Polygon สืบจากข้อ 2 ปลั๊กอินนี้จะมองหา Parcel_ID เดียวกันแล้วลำดับ feather_id เริ่มลากเส้นจาก feather_id เท่ากับ 1 จนไปสิ้นสุดตัวสุดท้ายแล้วทำการปิดรูปให้
Join Attribute
- เตรียมไฟล์ Attribute ของเดิมอาจจะเป็น Export ทำการ Export เป็น CSV ที่สำคัญคือต้องมีคอลัมน์ใดคอลัมน์หนึ่งที่มีเลข Parcel_IDเป็นหมายเลขแปลงที่ดิน ตัวอย่างชื่อคอลัมน์คือ Par_ID ทึ่จะเชื่อมโยงไปยังรูป polygon แปลงที่ดิน
- ใช้ปลั๊กอิน “MMQGIS” ทำการ Joint Attribute ด้วยเมนู Plugins > mmgis > Attributes Join from CSV File… จากไดอะล็อกเลือกไฟล์ (Input CSV File) แล้วกำหนด ID ของไฟล์ที่ CSV File Field ในที่นี้เป็น Par_IDเลือก layer ที่จะนำมา join (Join Layer) ในที่นี้เป็น Polygon_Parcels เลือก Join Layer Attribute ในที่นี้เป็น Parcel_ID เลือก Output Shape File เพื่อเก็บไฟล์ที่ Join Attribute กันแล้ว ส่วน Parcel_ID ไหนหาตัว join ไม่ได้เก็บไว้ในไฟล์ notfound.csv ซึ่งทำให้สามารถตรวจสอบได้ว่า Parcel_ID ที่ไม่สามารถหาคู่กันเจอ
- หลังจาก Join แล้วลองปรับการแสดงผลดูได้ดังรูป
- ลองเปิด table ของ layer ที่ join แล้วดู
การประมวลผลในเบื้องต้น
- มาลองใช้ปลั๊กอินในการประมวลผลดู ปลั๋กอินตัวนี้ชื่อ fTools มาพร้อมกับ QGIS แต่ต้อง enable ก่อนถึงจะใช้งานได้ สำหรับ GIS แล้วการทำ processing เพื่อประมวลผลหาผลลัพธ์ที่ต้องการคือหัวใจของงาน GIS เมื่อได้ผลลัพธ์แล้วต่อไปก็คือการทำ Report และแสดง map สำหรับผลลัพธ์นั้นๆ
- โจทย์ก็มีว่าถ้ามีแนวถนนกว้างเท่ากับ 100 เมตร (จริงแล้วคือเขตถนนหรือ right of way) ผ่านเข้าไปในแปลงที่ดิน ให้ประมวลผลว่าเข้าไปในแปลงไหนพร้อมแสดงเป็น map
- ข้อมูล (layer) ที่จะนำมาประมวลผลสมมติว่ามี polyline (เส้นเดี่ยวไม่มีความกว้าง) ที่แทนแนวถนนตัดผ่านแปลงที่ดิ ผมนำเข้าถนนเข้าดังรูป
- ต่อไปจะขยายถนนให้ได้ขนาดกว้าง 100 เมตรด้วยการทำ Buffer ด้วยปลั๊กอืน fTools ใช้เมนู Vector > Geoprocessing Tools > Buffer ป้อนค่าใส่ไดอะล็อกดังรูป
- ต่อไปจะหา polygon แปลงที่ดินที่ถูกตัดด้วยขอบเขตถนน 100 เมตรที่ตัดผ่าน ที่เมนู Vector > Geoprocessing > Intersect ใส่ค่าไปตาม dialog ดังรูปด้านล่าง
ผลลัพธ์ที่ได้
- ลองเปิดดู Attribute table ของ layer ที่ได้จากการ intersect
สรุป
- สำหรับผมแล้วใช้ QGIS เป็นหลักเพราะไม่ได้ใช้ฟังก์ชั่นการวิเคราะห์ที่ลึกซึ้งนัก ความเร็วของ QGIS ก็ไม่เลวเปิดรูปประมาณ 3 กิกะไบต์ก็ยังไปได้ แต่ขาดเรื่องการจัดปรินต์ Layout ที่ยังไม่ดีพอ อีกอย่างคือการ label ยังไม่เก่ง แต่ฟีเจอร์ต่างๆทางทีมผู้พัฒนาก็ปรับปรุงไปเรื่อยๆครับ
ถือโอกาสสวัสดีปีใหม่นะครับ ลูกพี่ ไม่แน่ใจว่าพี่อยู่ในพม่าหรือเปล่า ถ้าส่งทางนี้พี่คงเห็นแน่ๆ ขอให้สุขภาพแข็งแรง ประสบความสำเร็จในหน้าที่การงาน คิดหวังสิ่งใดให้สมปรารถนา และมีแรงมาเขียนบล็อกได้อีกนานๆ นะครับ
เช่นกันครับ Zee ขอบคุณมากครับสำหรับคำอวยพร