Sunday, 18 September 2016

Interpolation Method of Surface Representation...เส้นสวย ด้วยการปรับแต่ง? ในงานแผนที่ฯ EP.1

>> เป็นอีกหนึ่งบทความ ที่ผู้เขียนขออนุญาติหยิบยกเอาประเด็นคำถาม ที่น่าสนใจเกี่ยวกับวิธีการ Interpolation (การประมาณค่าในช่วง) ที่ถูกถามเข้ามาผ่านทางอีเมล์ เพื่อนำมาเขียนเป็นบทความพอสังเขป เผื่อท่านใดที่สนใจในประเด็นเดียวกันนี้ จะได้ใช้ต่อยอดความรู้ ให้ดียิ่งๆขึ้นไป และกลับมาชี้ทางสว่างให้กับผู้เขียน ในกาลถัดไป จักเป็นพระคุณยิ่ง...ด้วยเหตุว่าองค์ความรู้เกี่ยวกับวิธีการ Interpolation หรือ 'การประมาณค่าในช่วง' เพื่อให้ได้มาซึ่งค่าพิกัดตำแหน่งและค่าระดับ 'ที่ไม่รู้' เปลี่ยนเป็น 'ค่าที่รู้' และมีความถูกต้องมากที่สุด ซึ่งองค์ความรู้ดังกล่าว เป็นศาสตร์ที่ต้องอาศัยกระบวนการทางคณิตศาสตร์ชั้นสูง ทั้งฟังก์ชั่น, อัลกอริทึ่ม, ลีส สแควร์ ฯลฯ โดยกระบวนการต่างๆเหล่านี้ เป็นเรื่องที่ผู้เขียนเรื้อๆ หลงๆ ลืมๆ ส่งคืนอาจารย์ผู้สอนกลับไป มิใช่น้อย...(T_T '')

Radial Basic Function Method
ก่อนจะลงในรายละเอียดถึงวิธีการปรับแก้/ปรับแต่ง ด้วยวิธีการ Interpolation ต่างๆ ผู้เขียนต้องขออนุญาติท้าวความถึงสาเหตุของปัญหาว่า ทำไม? เราถึงจะต้องใช้วิธีการปรับแก้/ปรับแต่ง Interpolation เหล่านี้...คำตอบคือ การสรรหาวิธีการ หรือกระบวนการต่างๆที่จะสามารถ 'จำลอง' แผนที่ หรือ สร้างแผนที่ 'ให้มีความเสมือน' สภาพพื้นที่ทางกายภาพของจริง 'ให้มากที่สุด' โดยเมื่อมีข้อจำกัดบางประการที่ไม่สามารถเข้าถึงข้อมูลสำรวจฯเหล่านั้นได้อย่างเพียงพอ ในการสร้างแบบจำลองแผนที่ฯ

ผู้เขียนในฐานะที่เป็นนักสำรวจฯ ที่วุ่นวาย ขายปลาช่อนอยู่กับข้อมูลสำรวจฯ (COGO) จากภาคสนามอยู่เป็นกิจวัตร ก็ประสบพบเจอปัญหากับการร่างแบบจำลองแผนที่ฯ หรือการทำให้เสมือนจริง เช่นเดียวกันกับชนชาวนายช่างฯทั้งหลาย อันเนื่องมาจากข้อจำกัดทางด้านงานสำรวจรังวัดบางประการ อาทิ อุปสรรคต่อการเข้าถึงตำแหน่งแห่งที่ บ้างเป็นพื้นที่หุบเหวลึก หน้าผาสูงชัน พื้นที่อันตรายต่างๆ ฯลฯ เป็นต้น...จากปัญหาดังกล่าว ผู้เขียนจึงได้นำกระบวนการ Interpolation มาช่วยในการปรับแก้ ประมาณค่า ตำแหน่ง/ระดับ ที่ไม่สามารถเข้าถึงตำแหน่งเหล่านี้ได้

* การขาดข้อมูลสำรวจฯ 'ที่เพียงพอ' เป็นสาเหตุหลักของความคลาดเคลื่อนไปจากความเสมือนจริง เมื่อทำการเปรียบเทียบแบบร่างจำลองที่สร้างขึ้น กับสภาพพื้นที่จริง ตามหลักการทางเรขาคณิต 

ตัวอย่างความ 'ไม่เพียงพอ' ของข้อมูลสำรวจฯ 
(นำมาซึ่งเส้นชั้นระดับความสูงที่คลาดเคลื่อน และไม่ตรงกับสภาพพื้นที่จริง)
เมื่อเกิดความ 'ไม่เพียงพอ' ของข้อมูลสำรวจฯ โดยหลักปฎิบัติที่ถูกต้องแล้ว ผู้ทำการสำรวจฯจะต้องกลับไปทำการสำรวจฯ 'เพิ่มเติม' (Data Infill) เพื่อให้ได้ข้อมูลสำรวจฯอย่างเพียงพอ ที่จะนำมาประมวลผลในกระบวนการจัดสร้างแผนที่ฯต่อไป...แต่ทั้งนี้ จากที่ได้กล่าวเอาไว้ข้างต้นว่า มี 'บางกรณี' ที่ไม่สามารถทำให้ได้มา หรือเข้าถึงซึ่งข้อมูลสำรวจฯนั้นๆได้ ดังนั้นวิธีการ Interpolation ต่างๆ จึงถูกนำมาช่วยในการแก้ปัญหาดังกล่าว ข้างต้น


Surface Interpolation
>> การประมาณค่าในช่วง เพื่อหาพิกัดตำแหน่ง และค่าระดับ ต้องอาศัยข้อมูลสำรวจฯ 'ที่ทราบค่า' (Known value) รอบๆ ตำแหน่งที่ต้องการทราบค่าเพื่อใช้อ้างอิง และ 'ประมาณค่า' ตามหลักวิธีการต่างๆ ซึ่งมีอยู่หลากหลายวิธี มีให้เลือกใช้ให้เหมาะสมกับประเภทของงาน (ที่ต้องการใช้การประมาณค่าในช่วง) โดยในแต่ละวิธี มีข้อดี-ข้อเสีย แตกต่างกันไป...

จุดสีน้ำเงิน คือตำแหน่งที่ถูกประมาณค่า โดยอาศัยข้อมูลสำรวจฯที่อยู่รอบๆ

วิธีการ 'ประมาณค่าในช่วง' (Surface Interpolation Method)
- Inverse Distance
- Krigging
- Shepard Method
- Natural Neighbor 
- Nearest Neighbor
- Polynomial Regression
- Radial Basic Function
- Triangulation with Linear 
- Moving Average
- Data Metrics
- Local Polynomial
-Trend
- Median 4
- Median 16
- และ อีกมากมาย ฯลฯ

>> ในวงการนักการสำรวจฯ, แผนที่ฯ, GIS ชาวเรา ต่างพากันคุ้นชื่อ คุ้นหูกับวิธี Krigging และ Natural Neighbor เสียเป็นส่วนใหญ่ ซึ่งวิธีการทั้ง 2 ต่างก็มีข้อดี-ข้อเสีย แตกต่างกันไป ซึ่งผู้เขียนขออนุญาติไม่ลงในรายละเอียด ในประเด็นดังกล่าว ซึ่งส่วนใหญ่จะว่าด้วยเรื่องความแตกต่างในวิธีการคำนวณทางคณิตศาสตร์ และการได้มาของผลลัพธ์ค่าตัวแปรต่างๆ อาทิ วิธี Krigging ไม่หมาะสมกับข้อมูลสำรวจฯขนาดใหญ่ (เป็นหมื่นๆจุดขึ้นไป) เพราะค่าผลรวมจำนวนข้อมูล (N) ที่มีค่ามากจะถูกนำมาหาร/กระจาย ไปแต่ละ Node ของตัว Gridding และวิธี Natural Neighbor ไม่เหมาะสมที่จะนำมาใช้ประมาณค่าในช่วง กับข้อมูลสำรวจทางปฐพี (ชั้นดิน-ชั้นหิน) และข้อมูลสำรวจทางชลศาสตร์ เพราะจะทำให้รูปร่าง รูปทรงของแบบจำลองมีความคลาดเคลื่อนผิดเพี้ยนไป ฯลฯ เหล่านี้เป็นต้น

ฉะนั้น วิธีที่จะอธิบายให้ท่านผู้อ่านเข้าใจได้มากที่สุด ในบทความนี้...ผู้เขียนจึงขออนุญาตินำตัวอย่างข้อมูลสำรวจฯบ่อน้ำ 1 ชุด มาทำการประมาณค่าในช่วง (Interpolation) ด้วยหลักวิธีการต่างๆ (เป็นที่นิยม) โดยเซ็ตค่าพารามิเตอร์ต่างๆ เป็นค่า Default เพื่อสร้างเส้นชั้นความสูง 0.5 ม...โดยที่ท่านผู้อ่านต้องพิจารณา 'เปรียบเทียบ' ผลลัพธ์ของวิธีการแต่ละวิธี โดยเฉพาะการพิจารณาที่ตำแหน่งที่มีข้อมูลน้อย (ไม่เพียงพอ) หรือ ไม่มีข้อมูลสำรวจฯ และพิจารณาว่า วิธีการ Interpolation ต่างๆ ได้ทำการปรับแก้/ปรับแต่ง ตัวแผนที่ฯอย่างไร

ข้อมูลสำรวจฯ (ดิบ) 'ก่อน' ทำการประมาณค่าในช่วง (Interpolation)

วิธี Inverse Distance

วิธี Krigging

วิธี Shepard

วิธี Natural Neighbor 

วิธี Nearest Neighbor

วิธี Polynomial Regression

วิธี Radial Basic Function

วิธี Triangulation with Linear 

วิธี Moving Average

วิธี Data Metrics

วิธี Local Polynomial
>> จะเห็นได้ว่า การนำมาวิธีการต่างๆ ของ Interpolation มาใช้ในการปรับแต่ง/ปรับแก้ ตัวแผนที่ฯจากตัวอย่างข้างต้นนั้น ได้ให้ผลลัพธ์ที่แตกต่างกัน (หรือแตกต่างกันมาก ในบางวิธีการ ซึ่งอาจจะเป็นไปได้ว่าวิธีการประมาณค่าในช่วง วิธีนั้นๆ อาจจะไม่เหมาะสมกับข้อมูลสำรวจฯที่มีลักษณะการกระจาย/กระจุกตัว ของข้อมูลข้างต้น)  และนั่นได้ส่งผลกระทบโดยตรงต่อความ 'เสมือน' ของแบบจำลองแผนที่ฯที่สร้างขึ้น กับสภาพพื้นที่จริง
(ส่วนตัว) ผู้เขียนเป็นผู้ทำการสำรวจฯตัวบ่อดังกล่าว รู้จัก และคุ้นเคยกับสภาพพื้นที่จริงว่ามีลักษณะทางกายภาพเช่นไร ฉะนั้น เมื่อนำข้อมูลสำรวจฯมาปรับแก้ ด้วยวิธีการของ Interpolation แล้ว ผู้เขียนพบว่า วิธี Triangulation with Linear, Natural Neighbor และ Kriging ล้วนแล้วแต่ให้ผลลัพธ์ หลังการปรับแก้/ปรับแต่ง 'เสมือน' พื้นที่จริง ทั้งสิ้น

** ผู้เขียน ขออนุญาติย้ำเตือนอีกครั้งว่ากระบวนการข้างต้นดังกล่าว 'ถ้า' หลีกเลี่ยงได้ก็ควรที่จะหลีกเลี่ยง ถ้าสามารถทำให้ได้มาซึ่งข้อมูลสำรวจฯที่มากพอแล้ว หรือสามารถกลับไปทำการสำรวจฯเพิ่มเติมได้ ก็ไม่ควรที่จะใช้วิธีการดังกล่าว ด้วยเหตุว่า วิธีการเหล่านี้ เป็นวิธีการที่ใช้การ 'ประมาณค่า' ซึ่งถึงแม้ว่า จะมีหลักการทางคณิตศาสตร์ที่น่าเชื่อถือมารองรับก็ตาม แต่...ก็ไม่ใช่ข้อมูลสำรวจฯที่ได้มา 'จากพื้นที่จริง'

*** และบทความนี้ อาจจะถือได้ว่า เป็นดาบ 2 คม 'เมื่อ' ถูกนำไปใช้ในการ 'ลดจำนวนจุดสำรวจฯ' ลง (ประหยัดเวลาในการทำการสำรวจฯ ประหยัดต้นทุน ประหยัด...ฯลฯ) โดยอาศัยการ 'ประมาณค่า' จากวิธีการข้างต้น...วิธีการสำรวจฯแบบ สุกเอา เผากิน เป็นสิ่งที่ชนชาวเรา เหล่านักสำรวจฯควรที่จะหลีกเลี่ยง...

Sunday, 21 August 2016

Civil 3D: Land Parcels (ว่าด้วยเรื่อง การแบ่ง 'พื้นที่' ออกเป็นส่วนๆ)

>> เป็นอีกหนึ่งบทความ (ส่วนตัว) ที่เขียนเก็บเอาไว้ตั้งแต่ปี 2012 แต่มิได้นำมาลงใน blog ด้วยเหตุว่า ตัวผู้เขียนเองก็ไม่แน่ใจว่า เมื่อมีผู้ทำตามขั้นตอนการแบ่งเนื้อที่ (Parcel) ด้วยโปรแกรมฯดังกล่าวแล้ว จะสัมฤทธิ์ผลหรือไม่ ชึ่ง ณ เวลานั้นผู้เขียนคิดว่า น่าจะเป็นเพราะตัว bug ของโปรแกรมฯ หรืออาจจะเป็นเพราะความไม่เข้าใจอย่างถ่องแท้ของตัวผู้เขียนเอง ก็เป็นได้...จึงหยุดค้างคา เรื่องดังกล่าวไว้แค่ตรงนั้น (งานสำรวจฯส่วนตัวไม่ได้ใช้ชุดคำสั่งดังกล่าวมากนัก)

ในกาลถัดมาจนถึงปัจจุบัน ซึ่งตัวโปรแกรม Autocad Civil 3D ได้ถูกพัฒนามาโดยลำดับ จนถึงเวอร์ชั่น 2017 ณ ปัจจุบัน (แต่ตัวผู้เขียนเองกลับยังหมกมุ่นอยู่กับเวอร์ชั่น 2012 T_T)...ผู้เขียนเข้าใจว่า ในเวอร์ชั่นถัดๆมา ตัวโปรแกรมน่าจะถูกพัฒนาให้ดียิ่งขึ้นกว่าเดิม โดยเฉพาะการใช้ชุดคำสั่ง Parcel แต่ทั้งนี้ผู้เขียนก็ไม่เคยได้มีโอกาส ทำการทดสอบเวอร์ชั่นรุ่นใหม่ๆ เหล่านี้

ผู้เขียนได้ให้คำแนะนำกับท่านผู้สนใจในเรื่องชุดคำสั่ง Parcel ผ่านอีเมล์อยู่หลายวาระ จนมาถึงเพื่อนนายช่างสำรวจฯท่านหนึ่งจากเว็บไซต์ใหญ่ทางด้านงานสำรวจฯ ได้ถามไถ่เข้ามาในประเด็นเดียวกันนี้อีก ผู้เขียนจึงตัดสินใจขุดบทความชุดนี้ เอามาลงใน blog ให้ท่านผู้สนใจ ลองใช้ชุดคำสั่ง หรือนำไปต่อยอดให้ดียิ่งขึ้นต่อไป หรือกลับมาชี้แนะ ชี้ทางสว่างให้กับผู้เขียน...จักเป็นพระคุณยิ่ง

หมายเหตุ: ขั้นตอน และวิธีการแบ่งพื้นที่ออกเป็นส่วนๆ โดยการใช้โปรแกรม Autocad Civil 3D นี้ ได้มาจากการทดสอบ (ส่วนตัว) โดยการใช้ โปรแกรมฯเวอร์ชั่น 2012 อนึ่ง ผู้เขียนไม่สามารถยืนยันผลสัมฤทธิ์ของการแบ่งพื้นที่ ในทุกๆกรณี โดยเหตุว่า ในบางกรณี ผู้เขียนพบว่า ไม่สามารถแบ่งซอยพื้นที่ Parcel ออกเป็นส่วนๆได้ โดยเฉพาะพื้นที่ๆมีลักษณะเป็นรูปหลายเหลี่ยมแบบซับซ้อน

Civil 3D: Land Parcels
(การแบ่งซอยพื้นที่ ออกเป็นส่วนๆ ให้มีขนาดเท่ากัน)


1. พื้นที่ๆมีลักษณะเป็นรูปทรงเรขาคณิต แบบง่ายๆ อาทิ รูปทรงสี่เหลี่ยมผืนผ้า, ทรงจัสตุรัส ฯลฯ
จากภาพข้างต้น ผู้เขียนจะสาธิต การแบ่งซอยพื้นที่ขนาด 5,000 ตร.ม. ออกเป็น 10 ส่วน ส่วนละ 500 ตร.ม. โดยใช้ชุดคำสั่ง Parcel
1.1 ออกแบบพื้นที่: ทำการลากเส้น polyline วงปิดตามภาพทางด้านล่าง
1.2 สร้าง Parcel หลัก (ก่อนแบ่งออกเป็นส่วนๆ): ที่แท๊ป Parcels เลือก Create Parcel from Objects > ลากคลุมพื้นที่ ตามข้อ 1.1 > Enter จะพบหน้าต่าง Create Parcel from Objects > ตั้งค่าการแสดงผลของ Parcel ตามต้องการ > OK
ภาพแสดง Parcel ที่ถูกสร้างขึ้น 
โดยตัวโปรแกรมฯจะทำการคำนวณพื้นที่ และเส้นรอบวง อัติโนมัติ


1.3 กำหนดค่า Parcel LayOut

Parcel Sizing: การกำหนดขนาด-ปรับแต่ง Parcel ย่อย
     1.3.1 Minimum Area: กำหนดขนาดพื้นที่ให้กับ Parcel ย่อย โดยในการสาธิตนี้กำหนดพื้นที่ Parcel ย่อยให้มีขนาดพื้นที่ Pacel ละ 500 ตร.ม. (เมื่อคูณกับ 10 Parcel จะได้เท่ากับ 5,000 ตร.ม. พอดี)
    1.3.2 Minimum Frontage: กำหนดระยะทาง (ยอมให้ได้ต่ำสุด) ให้กับแนว Frontage (อาทิ แนวเขตที่ดินหน้าบ้าน ห่างจากถนน 2 เมตร) โดยในการสาธิตนี้กำหนดระยะต่ำสุดของ Frontage ให้มีค่าตามระยะกว้างของตัว Parcel ย่อย นั่นคือ 10 ม.
    1.3.3 Use Minimum Frontage At Offset: อนุญาติให้ใช้ค่า ตามข้อ 1.3.2 โดยในการสาธิตนี้ 'ไม่ใช้' 
   1.3.4 Frontage Offset: กำหนดระยะ Frontage ให้ล้ำเข้ามา (Offset) ในพื้นที่ๆต้องการแบ่ง Parcel ย่อยโดยในการสาธิตนี้ ไม่กำหนดให้มีการ Offset ใดๆ ออกจากแนว Frontage 
   1.3.5 Minimum Width: กำหนดระยะกว้างต่ำสุด ให้กับ Parcel ย่อย โดยในการสาธิตนี้ กำหนดให้มีระยะกว้างต่ำสุดเท่ากับ 10 ม.
 1.3.5 Minimum Depth: กำหนดระยะทางลึก (แนวยาว) ต่ำสุด ให้กับ Parcel ย่อย โดยในการสาธิตนี้ กำหนดให้มีระยะทางลึกต่ำสุดเท่ากับ 50 ม.
  1.3.6 Use Maximum Depth: อนุญาติให้ใช้ค่า ตามข้อ 1.3.7 โดยในการสาธิตนี้ 'ไม่ใช้' 
  1.3.7 Maximum Depth: กำหนดระยะทางลึก (แนวยาว) ยอมให้ได้สูงสุด
  1.3.8 Multiple Solution Preference: 
     1.3.8.1 Use Shortage Frontage: แสดงผลของ Parcel ย่อยที่ถูกแบ่งซอย ไปตามทิศทางเดียวกัน   กับแนว Parcel ย่อย อื่นๆ โดยในการสาธิตนี้ เลือก Use Shortage Frontage
     1.3.8.2 Use Smallest Area:  แสดงผลของ Parcel ย่อย ในกรณีที่มีพื้นที่เศษเหลือ ตามหัวมุมของพื้นที่ (มีความสัมพันธ์กับ หัวข้อ 1.3.10)
Automatic Layout: การเปิด-ปิด ระบบ LayOut อัติโนมัติ
 1.3.9 Automatic Mode: เปิด-ปิด ระบบการแสดงผลการคำนวณ และแบ่งซอย Parcel ย่อย แบบอัติโนมัติ โดยในการสาธิตนี้ เลือก Off (กด Enter ทีละครั้ง เพื่อแสดงผล Parcel ย่อย ทีละส่วนๆ)
On
Off
  1.3.10 Remainder Distribution: การจัดการพื้นที่ ส่วนที่เหลือ (ในกรณีแบ่ง/หารพื้นที่ ไม่ลงตัว)
     1.3.10.1 Create parcel from remainder: กำหนดให้สร้าง Parcel ขึ้นมาเฉพาะพื้นที่ส่วนที่เหลือ
    1.3.10.2 Place remainder in last parcel: กำหนดให้ Parcel ย่อยส่วนสุดท้าย รวมพื้นที่ส่วนที่เหลือ เข้าไว้ด้วยกัน
    1.3.10.3 Redistribute remainder: กำหนดให้นำพื้นที่ส่วนที่เหลือ มาหารด้วยจำนวน Parcel ย่อย แล้วแชร์ส่วนที่ถูกหาร เข้าไว้ในแต่ละ Parcel ย่อย
* โดยการสาธิตนี้ เป็นการแบ่งพื้นที่ 'แบบหารลงตัว' คำสั่ง Remainder Distribution จึงไม่มีผลบังคับ


1.4 ที่แท๊ป Tool > Slide Line-Create จะพบหน้าต่าง Create Parcel Layout > ตั้งค่าการแสดงผลของ Parcel ตามต้องการ > OK > คลิกเลือก ที่ตัว Parcel หลัก (คลิกที่ตัวหนังสือ แสดงขนาดพื้นที่)  
> สังเกตุที่ Command line: Select start point on frontage (คลิกที่ตำแหน่งจุดเริ่มต้น ที่ต้องการแบ่งซอยพื้นที่ย่อย บนแนวเส้น Frontage) > ที่ Command line: Select end point on frontage (คลิกที่ตำแหน่งจุดสิ้นสุด ที่ต้องการแบ่งซอยพื้นที่ย่อย บนแนวเส้น Frontage จะพบแนวเส้นแสดงจุดเริ่มต้น-สิ้นสุด ของการแบ่ง Parcel ย่อย) >
> ที่ Command line: Specify angle or [Bearing/aZimuth] คลิกที่ตำแหน่งเริ่มต้นใดๆ บนแนวเส้น Frontage (คลิก 1) > คลิกที่ตำแหน่งสิ้นสุดใดๆ (ในกรณีนี้อาจจะคลิกไปในทิศทางอื่นๆ) โดยการสาธิตนี้คลิกจุดสิ้นสุดในแนวตั้งฉากกับแนวเส้น Frontage (คลิก 2)) >
> กด Enter ทีละครั้ง เพื่องสร้าง Parcel ย่อย ทีละส่วน จนไปถึง Parcel ย่อย สุดท้าย
>> ตัวโปรแกรมจะสร้าง Parcel ย่อยจนครบ โดยในการสาธิตนี้ เป็นการแบ่งพื้นที่ออกเป็นส่วนๆ ส่วนละเท่ากันๆ (แบบหารลงตัว จึงไม่เหลือเศษ)

2. พื้นที่ๆมีลักษณะเป็นรูปทรงหลายเหลี่ยม (Polygon)
Example 1:
Example 2: