สำนวนโบราณ “จากกันสามวันนารีเป็นอื่น” ไม่รู้ปัจจุบันนี้ยังใช้ได้ไหม แต่สำหรับกับความรู้ภาษา Rust ที่ร่ำเรียนมาแบบหน้าดำคร่ำเครียด เพียงแค่หนึ่งเดือนไม่ได้จับ พอมาจับอีกครั้งเกิดอาการลืมเลือนไปอย่างรวดเร็ว วิธีการที่จะทำให้อาการลืมเร็วแล้วฟื้นไว มีวิธีเดียวครับคือขยันเขียนโปรแกรมประจุให้ความรู้เข้าไปในหน่วยความจำของสมองมากที่สุด เวลามาฟื้นทีหลังจะฟื้นไว
ความจริงเครื่องมือช่วยออกแบบเส้นโครงแผนที่ความคลาดเคลื่อนต่ำ (LDP – Low Distortion Projection) นั้นมีอยู่แล้วใน Surveyor Pocket Tools แต่ผมเองในฐานะผู้พัฒนาด้วยภาษาไพทอนยังมองว่าใช้งานยากไปนิด ก็เลยมีความคิดจะแยกโครงการนี้มาทำต่างหาก โดยเน้นไปที่การใช้งานให้ง่ายที่สุด สุดท้ายกลายเป็นโครงการ “LDP Companion” ที่โปรแกรมนี้จะถูกเขียนด้วยภาษา Rust ขึ้นกราฟฟิคติดต่อผู้ใช้ (User Interface) ด้วย Slint
ถ้าใครสนใจการจัดอันดับภาษาโปรแกรมมิ่ง จะเห็นไม่กี่ปีที่ผ่านมาภาษา Rust ได้รับความนิยมและไต่อันดับมาค่อนข้างเร็ว แต่ยังห่างสามอันดับแรกอยู่มาก ที่ภาษา Rust เติบโตได้ไม่รวดเร็วเท่าที่คนคาดหวังเกิดจากความยากของภาษา ที่ว่ากันว่าการศึกษาประมาณว่าต้องไต่หน้าผากันเลยทีเดียว
LDP Companion เพื่อนคู่คิด มิตรคู่ใจ
ผมเริ่มจาก UI ที่เป็นลักษณะเมนูหลักสามารถปัดซ้ายปัดขวาได้ ลักษณะนี้เรียกว่าม้าหมุน (Corousel) ที่เลือกแบบนี้คิดว่าสามารถพอร์ตโปรแกรมไปโทรศัพท์มือถือได้ในอนาคตได้ง่าย ถ้า Slint ที่ใช้อยู่นั้นจะรองรับแอนดรอยด์และไอโอเอสในอนาคต
Calculate K0
การคำนวณหาค่าสเกลแฟคเตอร์ที่จุดศูนย์กลางพื้นที่ (Projection Center) ถือว่าเป็นหัวใจของงานสร้างเส้นโครงแผนที่ความคลาดเคลื่อนต่ำเลยทีเดียว สิ่งที่ต้องรู้คือค่าละติจูดของศูนย์กลางพื้นที่และค่าความสูงเฉลี่ยของพื้นที่ (Ellipsoid Height) ถ้าจะดูสูตรลองค้นหาในบทความเก่าของผมได้
เมื่อคลิกที่ไอคอน Calculate K0 จะเรียกไดอะล๊อกสำหรับป้อนข้อมูลและคำนวณ K0 ได้อย่างง่ายๆตามคลิปตัวอย่างข้างล่าง
เมื่อคำนวณได้แล้วแค่คลิกที่ไอคอน Copy เพื่อก๊อปปี้ค่าไปคลิปบอร์ด นี่เป็นเพียงตัวอย่างนะครับ โปรแกรมจริงๆอาจจะมีการเปลี่ยนแปลงได้ในอนาคต ตอนนี้โปรแกรมยังไม่ได้ดักจับที่ผิดเป็นเรื่องเป็นราว ถ้าป้อนข้อมูลแผลงๆ โปรแกรมอาจจะแครชสวัสดีไปง่ายๆเลยครับ
Create LDP
เมื่อได้ค่า K0 แล้ว ขั้นตอนต่อไปจะมาเลือกชนิดเส้นโครงแผนที่ ซึ่งสามารถเลือกได้สามรูปแบบคือ Transverse Mercator (TM), Lamber Conformal Conic (LCC) และ Obliquied Mercator (OM) ขึ้นกับลักษณะพื้นที่ที่ต้องการสร้าง เช่นถ้าเป็นลักษณะสี่เหลี่ยมผืนผ้าด้านสูงอยู่ในแนวตั้งจะใช้ TM ถ้าเป็นสี่เหลี่ยมผืนผ้าแบบด้านยาวนอนจะใช้ LCC หรือถ้าเฉียงไม่สามารถจัดสี่เหลี่ยมผืนผ้าแบบตั้งและแบบนอนได้พอดี แนะนำ OM ที่เหมือนกับการหมุดสี่เหลี่ยมผืนผ้าไปตามแนวแกนของพื้นที่
ตรงผลลัพธ์จาก Create LDP ในตอนนี้จะสร้างแค่สายอักขระ PROJ เท่านั้น ซึ่งสามารถก๊อปปี้ไปใช้งานในโปรแกรมอื่นได้เช่น QGIS และอนาคตผมจะให้สามารถจัดเก็บในฐานข้อมูลที่จะไปใช้ร่วมกับ Surveyor Pocket Tools ได้
ทูลส์ที่ยังไม่ได้พัฒนา
สำหรับเครื่องมือหรือทูลส์ตัวอื่นที่รอคิวอิมพลีเมนต์เช่น Check Distortion สำหรับการประเมินหาความเพี้ยนหรือความควาดเคลื่อนในตำแหน่งที่ต้องการโดยการป้อนค่าพิกัดเป็นค่าพิกัดภูมิศาสตร์หรือค่าพิกริดกริดยูทีเอ็ม โดยส่วนใหญ่เราจะตั้งเป้าความคลาดเคลื่อนไม่ให้เกิน 20 ppm เครื่องมือตัวนี้สามารถคำนวณออกมาได้ และให้ผู้สร้างได้ประเมินว่าเส้นโครงแผนที่แบบความคลาดเคลื่อนต่ำที่สร้างมานั้นใช้ได้หรือไม่
ทูลส์ตัวต่อไปคือ Check Area ตัวนี้จะสามารถดูพื้นที่ว่า LDP ที่สร้างมานั้นครอบคลุมไปแค่ไหน ผมหนักใจว่า Slint ยังไม่มีความสามารถในด้านแผนที่มากนัก การแสดงแผนที่อาจจะเป็นเรื่องที่ยุ่งยาก
และที่ขาดไม่ได้คือ Transform Coordinates สำหรับแปลงพิกัดระหว่างระบบพิกัดยูทีเอ็มและเส้นโครงแผนที่ความคลาดเคลื่อนต่ำ ความตั้งใจคือจะใช้ไลบรารี Rust Geodesy เป็นหลัก
และท้ายที่สุดทูลส์ LDP Database สามารถเปิดฐานข้อมูล LDP ที่เก็บไว้ได้ ผมตั้งใจว่าจะให้แสดงเป็นตารางและสามารถ Export ไปยัง Excel ได้
หนทางยังอีกยาวไกล
เวลาว่างจากงานหรือวันหยุดจะเป็นเวลาที่ผมมานั่งเขียนและพัฒนาโปรแกรม พร้อมๆกับศึกษาภาษา Rust ไปในตัวด้วยทำให้การพัฒนาโปรแกรมไปได้ล่าช้า และอีกอย่างเนื่องจากวัยที่เป็นสว. ทำให้สมองไม่ได้แล่นปรู๊ดปร๊าดเหมือนกับตอนหนุ่มๆ ยังไงก็ตามถ้าโปรแกรมมีการอัพเดท ผมจะนำมาเขียนลงบนบล็อก โปรดติตตามบทความตอนต่อไปครับ