แนะนำการใช้เส้นโครงแผนที่ความเพี้ยนต่ำ (Low Distortion Projection)

 Low Distortion Projection คืออะไร

เส้นโครงแผนที่ทุกอันจะมีความเพี้ยน (distortion) เป็นความจริงที่ไม่สามารถหลีกเลี่ยงได้ ความเพี้ยนนี้ก็คือระยะทางที่ต่างกันระหว่างวัดจริงๆของจุดสองจุดบนพื้นผิวภูมิประเทศของโลกกับระยะทางที่ได้จากแผนที่ ความเพื้ยนนี้จะมีความสลักสำคัญอย่างมาก ดังตัวอย่างเช่นที่ผมได้กล่าวไปแล้วใน ตอนก่อนหน้านี้ ที่ค่าความเพื้ยนมากถึง ±823 ppm (ระยะทาง 1 กม. จะมีความเพี้ยนถึง 823 มม. หรือ 82.3 ซม.)

ความเพี้ยนนี้อาจนำไปสู่ความคิดที่ว่าระยะทางตัวไหนกันแน่ที่เป็นค่าที่ถูกต้อง ค่าความเพี้ยนนี้ไม่สามารถกำจัดออกไปได้ แต่สามารถทำให้น้อยลงได้ ด้วยวิธีการที่ผมจะนำเสนอต่อไปคือ Low distortion projection (LDP) ถ้าแปลอนุมานได้วา เส้นโครงแผนที่ความเพี้ยนต่ำ ต่อไปผมจะเรียกสั้นๆว่า LDP

LDP คือเส้นโครงแผนที่รักษามุม (Conformal Projection) และนำมาประยุกต์ใช้ในพื้นที่กว้างใหญ่ โดยที่ค่าความเพี้ยนนั้นน้อยจนสามารถที่จะยอมรับได้

ความเป็นมา

แรกเริ่มเดิมทีในอเมริกา ตั้งแต่ทางการได้ประกาศใช้ระบบพิกัด State Place Coordinate System (SPC) มาตั้งแต่ NAD27 จนกระทั่ง NAD83 และตัว NAD83 เองก็มีการปรับแบบ realizationเป็นระยะๆ ปัญหาเรื่องสเกลแฟคเตอร์ ที่บางรัฐมีค่าความเพี้ยนมาก ทำให้ยุ่งยากต่อการปฏิบัติงานในสนามของช่างสำรวจ ในช่วง 20 ปีที่ผ่านมา ได้มีคนนำ LDP มาใช้ ทำให้มีการถกเถียงกันในวงกว้างพอสมควร ว่าอาจจะนำไปสู่่ความไม่มีมาตรฐาน แต่สุดท้ายทางการ National Geodetic Survey (NGS) ได้ออกประกาศแนวทางการนำไปใช้ ทำให้การถกเถียงสิ้นสุดลง มีการนำไปใช้อย่างกว้างขวาง ในการออกแบบสิ่งก่อสร้างโครงการต่างๆ ทำให้งานสำรวจในภาคสนามได้รับความสะดวกมากขึ้น เช่นงานสำรวจเก็บพื้นที่ภูมิประเทศ งานสำรวจวางผัง ที่ไม่ต้องกังวลกับค่าสเกลแฟคเตอร์ และสุดท้ายสามารถแปลงค่าพิกัดบน LDP เหล่านี้ไปหาระบบพิกัดฉากของรัฐ (SPC) ได้ทำให้ไม่มีปญหาสำหรับการแปลงข้อมูลในงาน GIS

ชนิดของความเพี้ยน

ความเพี้ยน (distortion) เป็นผลจากการที่นำลักษณะของวัตถุบนพื้นโลกที่โค้งไปแสดงผลบนระนาบราบบนกระดาษ ไม่สามารถกำจัดได้ แต่ทำให้มันน้อยลงได้ ความเพี้ยนมี 2 ประเภทคือ

  1. ความเพี้ยนเชิงเส้น (Linear distortion)  คือระยะทางที่ต่างกันระหว่างวัดจริงๆของค่าพิกัดของจุดสองจุดบนพื้นผิวภูมิประเทศของโลกกับระยะทางที่ได้จากคำนวณจากค่าพิกัดบนระบบพิกัดฉาก ใช้สัญลักษณ์ δ
    • การแสดงความเพี้ยนจะนิยมใช้อัตราส่วน ppm – part per million คือหนึ่งล้านต่อล้านส่วน ลองมาดูที่ไปที่มา ระยะทาง 1 กม. ถ้าทำเป็นหน่วยมิลลิเมตร จะได้ 1 กม. = 1000 ม. = 1000 x 1000 = 1000000 มิลลิเมตร ดังนั้นถ้า 20 ppm จะหมายถึง 20 มม.ต่อ 1 กม. (ต่อหนึ่งล้านมิลลิเมตร)
    • เครื่องหมาย δ สามารถเป็นได้ทั้งบวกและลบ ถ้าเป็นลบจะหมายถึงว่าระยะทางบนระบบพิกัดฉากจะสั้นกว่าระยะทางจริงบนพื้นโลก ถ้าเครื่องหมายเป็นบวกแสดงว่า ระยะทางบนระบบพิกัดฉากจะยาวกว่าระยะทางจริงๆที่วัดบนพืนโลก
  2. ความเพี้ยนเชิงมุม (Angular distortion) ความเพี้ยนของมุมทิศเหนือของระบบพิกัดฉาก (grid north) กับทิศเหนือจริง (geodetic north) เรียกความต่างของมุมนี้อีกชื่อหนึ่งว่า convergence แทนด้วยสัญลักษณ์ γ
    • มุม convergence จะเป็นศูนย์ถ้าจุดนั้นอยู่บนเส้น central meridian (CM) ของ TM หรือ standard parallel ของ LCC และค่ามุมนี้จะมากขึ้นเรื่อยๆตามระยะทางที่ไกลออกมาจาก CM ความสำคัญของความเพี้ยนเชิงมุมนี้จะไม่สำคัญมากเท่ากับ ความเพี้ยนเชิงเส้น ความเพี้ยนเชิงมุมสามารถจำกัดมันได้ ด้วยจำกัดพื้นที่ของโครงการไม่ให้ใหญ่มากเกินไป (ระยะทางจาก CM ไม่มากเกินไป)

การเลือกเส้นโครงแผนที่

การเลือกเส้นโครงแผนที่สำหรับการทำแผนที่สเกลใหญ่ๆ สำหรับ LDP เท่าที่นิยมกันมากจะมีอยู่ 3 ประเภทเท่านั้นคือ

  1. Transverse Mercator (TM) ใชักันมากเส้นโครงนี้ได้จากการใช้ทรงกระบอกในแนวนอนราบมาครอบทรงรี ที่เราคุ้นกันดีก็คือ UTM พื้นที่ที่เหมาะสมคือประเทศที่มีพื้นที่มีความยาวจากเหนือไปใต้ เช่นประเทศไทยก็เหมาะสมกับแบบนี้
  2. Lambert Conformal Conic (LCC) ใช้กันมากพอสมควรในหลายๆประเทศ โดยเฉพาะอเมริกาและยุโรป ได้จากการใช้ทรงกรวยมาครอบทรงรีในแนวตั้ง เหมาะสมสำหรับประเทศที่มีพื้นที่ที่ยาวจากตะวันตกไปตะวันออก (ระบบพิกัดของเมียนมาร์ก็เคยใช้เส้นโครงนี้ก่อนจะเปลี่ยนมาใช้ UTM ในระบบพิกัด Myanmar Datum 2000 ในปัจจุบัน  ซึ้งพื้นที่ของเมียนมาร์จะยาวจากเหนือลงมาใต้คล้ายของประเทศไทย)
  3. Oblique Mercator (OM) เป็นเส้นโครงแผนที่ที่ได้จากการใช้ทรงกระบอกแบบเอียงเป็นมุม มาครอบทรงรีให้แนวตัดพาดผ่านไปตามพื้นที่ พื้นที่ที่จะเลือกมาใช้เส้นโครงแบบนี้จะเป็นลักษณะยาวเฉียงๆจากตะวันออกเฉียงเหนือลงมาทิศตะวันตกเฉียงใต้ หรือตะวันตกเฉียงเหนือลงมาทิศตะวันออกเฉียงใต้

AcroRd32_2017-03-21_12-54-07

สำหรับ OM ถ้าจินตนาการลำบาก ลองดูรัฐอลาสก้า โซน 1 (Alaska zone 1) ของอเมริกาที่ใช้เส้นโครงแผนที่ OM ลองดูจากรูปด้านล่างเข้าใจได้ง่าย

mappro choice

จะเห็นรอยประ รอยนี้คือที่ทรงกระบอกสัมผัสกับทรงกลม (aposphere) ย้ำว่าทรงกลมไม่ใช่ทรงรี จากนั้นถึง project จากทรงกลมนี้ลงบนทรงรีอีกที สำหรับ OM นั้นซับซ้อนกว่าเส้นโครงแผนที่อื่นเล็กน้อย รอยประ (initial line) นี้ในพารามิเตอร์การแปลงพิกัดจะกำหนดเป็นค่าอะซิมัทเรียกว่า azimuth of initial line และเส้นรอยประนี้จะไปตัดกับศูนย์สูตรของทรงกลม aposphere ที่ natural origin เส้นรอยประนี้จะกำหนดสเกลให้เรียกสเกลนี้ว่า scale factor of initial line  และจะกำหนดจุดใดจุดหนึ่งที่อยู่บนเส้นประนี้เรียกว่า center of projection

มิตรประเทศแถวๆบ้านเรา ก็มีมาเลเซียที่ใช้เส้นโครงแผนที่นี้อยู่ เรียกว่า Malaysia Rectified Skew Orthometric (Malaysia RSO) ประเทศอื่นที่ใช้ได้แก่ สวิตเซอร์แลนด์, มาดากัสการ์, ฮังการี

AcroRd32_2017-03-22_15-44-02

พฤติกรรมความเพี้ยนเชิงเส้นของเส้นโครงแผนที่

ก่อนจะไปถึงการออกแบบและประยุกต์ใช้เส้นโครงความเพี้ยนต่ำ ลองมาศึกษาพฤติกรรมของความเพี้ยนเชิงเส้นว่าขึ้นอยู่กับอะไรบ้าง เมื่อรู้พฤติกรรมนี้แล้วสามารถนำไปประยุกต์ใช้ได้อย่างเหมาะสม

ความเพี้ยนเชิงเส้นเกิดจากตัวแปรสองตัวแปรคือความโค้งของผิวโลกและความสูงเหนือทรงรี มาลองพิจารณาความเพี้ยนที่เกิดจากตัวแปรแรกคือความโค้งของผิวโลก ตารางด้านล่างแสดงความเพี้ยนเชิงเส้นในแนวราบเทียบกับความกว้างของแต่ละโซนของเส้นโครงแผนที่

EXCEL_2017-05-16_15-24-46

จะเห็นว่าถ้าความกว้างของโซนเส้นโครงแผนที่ไม่กว้างมากจะมีค่าความเพี้ยนที่ต่ำ ส่วนความกว้างของโซน UTM ผมคิดที่ latitude 13° พาดผ่านกรุงเทพฯ ความกว้างประมาณ 650 กม. โซน UTM จะกว้างมากที่สุดที่เส้นศูนย์สูตร จากนั้นจะค่อยๆสอบเล็กลงตาม latitude ที่เพิ่มมากขึ้น ตัวอย่างเช่นรัฐทางเหนือของอเมริกาที่ latitude 40° จะมีความกว้างประมาณ 410 กม.

ความเพี้ยนเชิงเส้นอีกตัวแปรหนึ่งจะขี้นอยู่กับค่าระดับความสูงเมื่อเทียบกับทรงรี (Ellipsoidal height) โดยประมาณแล้ว ความสูงที่เปลี่ยนจากเดิม 30 เมตร ค่าความเพี้ยนเชิงเส้นจะเปลี่ยนไปประมาณ ± 4.7 ppm คงที่ พิจารณาจากตารางด้านล่าง

EXCEL_2017-05-16_16-25-07

การประยุกต์และนำไปใช้

สองตัวแปรนี้เวลาคิดความเพี้ยนเชิงเส้นรวมจะเอามาคูนกัน สมมติว่าต้องการออกแบบความกว้างของโซนของเส้นโครงแผนที่ Transverse Mercator กว้าง 81 กิโลเมตร มีค่าความเพี้ยนทางราบ ±10 ppm ยาวขึ้นไปทางเหนือ 100 กม. ถ้าใช้เส้นโครงแผนที่ TM หมายเหตุเหนือ-ใต้ที่ longitude เดียวกันจะมีค่า grid scale factor เท่ากัน ดังนั้นจะยาวมากกว่านี้ก็ได้

ผมกำลังสมมติเล่นๆว่าถ้าต้องการออกแบบและสร้างเส้นโครงแผนที่ สำหรับกรุงเทพมหานคร รวมปริมณฑลเช่นสมุทรปราการ. นนทบุรี, ปทุมธานี จะสามารถทำได้ไหม ค่าระดับบนพื้นดินของกรุงเทพและปริมณฑล ผมไม่มีตัวเลขเป๊ะ แต่ค่าเฉลี่ยสูงต่ำน่าจะไม่เกิน 10 เมตร ซึ่งผมคำนวณค่าความเพี้ยนที่เกิดจากความสูงได้ ±1.6 ppm เมื่อนำความเพื้ยนทั้งสองตัวแปรมาคูนกันจะได้ ±16 ppm ซึ่งไม่เกินตัวเลขในฝันคือไม่ควรเกิน ±20 ppm

สำหรับหนึ่งกม.ระยะทางบนระบบพิกัดฉากกับระยะทางบนพื้นดิน ต่างกันแค่ 16 มม. ถือว่าน้อยมากครับ สมมติว่ามีหมุด GPS หนึ่งคู่ คำนวณระยะทางบนระบบพิกัดฉาก LDP ห่างกัน 100.0 เมตรพอดี  จากนั้นเอากล้อง  total station มาทดสอบวัดระยะทางซึ่งควรจะได้ 100.0016 เมตร ถ้าตัวเลขค่าความเพี้ยนเป็นบวก หรือวัดได้ 99.9984 เมตร ถ้าค่าความเพี้ยนเป็นลบ ต่างกัน 1.6 มม. ผมก็ยังถือว่าน้อยนะครับ

เช่นเดียวกันถ้าเอากล้อง total station มาวางผัง ก็ยังรับกันได้สบายๆ การสำรวจภูมิประเทศก็สามารถทำได้ตามปกติ การเก็บขอบเขตที่ดินก็สามารถทำได้เช่นเดียวกัน และที่สำคัญที่สุดคือระบบพิกัดบน LDP สามารถแปลงไปหาระบบพิกัดฉาก UTM หรือ Geographic ได้ตลอดเวลาที่ต้องการ ส่วนใหญ่ซอฟแวร์ด้าน GIS หรือด้าน CAD ทั้งหลายก็สนับสนุนการใช้ LDP ได้อยู่แล้วในขณะนี้ เพียงแต่ค่าพารามิเตอร์ของ LDP  ต้องไปกำหนดให้ซอฟแวร์เหล่านี้ได้รู้จัก

ตัวอย่างการใช้งาน

ตัวอย่างการใช้งานผมเข้าไปศึกษารัฐโอเรกอนของอเมริกาครับ เข้าไปดูได้ตามลิ๊งค์นี้ Oregon Coordinate Reference System และมีคู่มือกล่าวถึงที่มา การศึกษาออกแบบอ่านได้ตามลิ๊งค์นี้ OCRS Handbook & User Guide ซึ่งรัฐโอเรกอนพื้นที่เล็กกว่าประเทศไทยครึ่งหนึ่ง จำนวน LDP ทั้งหมดในรัฐนี้ 39 เส้นโครงแผนที่ มีครบหมดไม่ว่าจะเป็น Transverse Mercator, Lambert Conformal Conic และ Oblique Mercator ดูตามรูปด้านล่าง

chrome_2017-05-16_20-10-55

เครื่องมือตัวใหม่

Init Design LDP เป็นเครื่องมือตัวใหม่ที่กำลังพัฒนาครับ เนื่องจากการออกแบบ LDP ค่อนข้างจะมีการลองแล้วทดสอบหาค่าความเพี้ยนเปรียบเทียบกัน โดยมีการขยับย้ายแกน central meridian  และสลับกับการเปลี่ยนค่า scale factor (k0) ที่แกน central meridian ด้วย ทำให้โปรแกรมไม่สามารถเขียนได้ลึกซึ้งขนาดนั้น จึงเป็นเครื่องมือที่มาช่วยออกแบบในเบื้องต้น

Create LDP เป็นเครื่องมืออีกตัวที่กำลังพัฒนาเช่นเดียวกัน เมื่อได้พารามิเตอร์ของเส้นโครงแผนที่ต่ำแล้วสามารถนำมาป้อนและจัดเก็บเข้าฐานข้อมูล นอกจากนี้ยังสามารถคำนวณหาค่าความเพี้ยน แปลงพิกัดจากระบบพิกัดมาตรฐานทั่วๆไป มายัง LDP ได้โดยที่ LDP สามารถออกแบบและเก็บไว้ในฐานข้อมูลได้ อนาคตจะนำ LDP นี้ไปรวมกับการแปลงพิกัดทั่วๆไปเช่น Transform Coordinates, File Transform Coordinates หรือ Area

 

ถ้าโปรแกรมทูลส์สองตัวนี้เสร็จก็น่าจะได้นำจะมาลองออกแบบ LDP ดูกันเป็นกรณีศึกษา เริ่มตั้งแต่หาค่าความสูงจาก ellipsoid ซึ่งเป็นตัวแทน (h0) ที่จะว่าง LDP บนระนาบนี้ จากนั้นจะหาจุดศูนย์กลางของพื้นที่เพื่อวาง Central meridian จากนั้นกำหนดค่า scale factor (K0) และที่สำคัญคือการคำนวณหาค่าความเพี้ยนเพื่อเปรียบเทียบ จากนั้นจะมีการปรุงและกลั่น ปรับค่าโดยการขยับ Central Meridian หรือปรับค่า K0 จนความเพี้ยนเฉลี่ยในพื้นที่โครงการมีค่าน้อยที่สุด

แนวทางการออกแบบนี้ผมเดินตามทาง Michael L. Dennis ที่ตัวผมเองนับถือและคิดว่าเขาเป็นเจ้าพ่อในด้านนี้ มีงานเขียนออกมามากมายเพราะเป็นที่ปรึกษาและรับงานออกแบบ LDP ในหลายๆรัฐของอเมริกา ลองค้นชื่อนี้กับคำว่า LDP  ดูจะเห็นลิ๊งค์มากมาย

ส่วนจะมีใครนำ LDP ไปใช้ที่ไหน อย่างไร ก็เป็นเรื่องอนาคตที่ดี ถ้ามีหน่วยงานคล้ายๆของรัฐโอเรกอน มาออกแบบและตั้งเป็นมาตรฐานก็น่าจะดี นอกจากจะสะดวกสำหรับช่างสำรวจทำแผนที่หน้างานหรืองานสำรวจสำหรับวางผัง ไม่ว่าจะเป็นโครงการเล็กๆจนถึงโครงการใหญ่ๆและยาวๆเช่นทางด่วน ถนนมอเตอร์เวย์ ก็ยังสามารถประยุกต์ใช้งานกันได้ดี

พบกันตอนต่อไปครับ ปิดท้ายด้วยวาทะนี้ “เป็นความจริงที่ความเพี้ยนของเส้นโครงแผนที่ไม่สามารถกำจัดได้ แต่สามารถทำให้น้อยลงได้

 

 

เริ่มต้น Python ด้วย PySide2 + Miniconda + PyCharm

ขอนำเสนอวิธีการติดตั้งในเบื้องต้นเพื่อใช้ PySide2 สำหรับผู้ที่เริ่มต้นศึกษาเขียนไพทอน บางครั้งไม่รู้จะเริ่มต้นตรงไหน ผมจะขอแนะนำสามสหายที่จะมาช่วยทำให้ชีวิตง่ายขึ้น

  • PySide2 อยู่ระหว่างการพัฒนาจากเจ้าของ Qt framework เองจึงไม่ต้องห่วงว่าโครงการจะล้มลาเลิกร้างกันก่อน ฟรีและมีสัญญาอนุญาตแบบ LPGL v2 สามารถพัฒนาโปรแกรมเพื่อการค้าได้ รุ่นเสถียรอีกไม่นานนักน่าจะออกมาแล้ว
  • Miniconda3 เป็นส่วนหนึ่งของ Anaconda ซึ่งเป็นเฟรมเวิร์คสำหรับการทำ data science สำหรับภาษาไพทอน ส่วน Miniconda เป็นตัวจัดสภาพแวดล้อมให้ไพทอน เช่นถ้าต้องการพัฒนาโปรแกรมให้สามารถรันได้ทั้ง 32 บิตและ 64  บิต ก็ต้องตัวนี้เลย สามารถเลือกรุ่นของ Python ได้ด้วย อย่างเช่น PySide2 ต้องการไพทอน 3.5 สามารถกำหนดรุ่นของไพทอนได้ทีหลังด้วยการ config ที่ง่ายไม่กี่ขั้นตอน ฟรีแบบมีสัญญาอนุญาตแบบ BSD 3-clause
  • PyCharm สภาพแวดล้อมในการพัฒนาทั้ง editor, debugger ครบครัน ใช้งานสะดวก ง่าย ฟรีสำหรับรุ่น community ครั้งหนึ่งผมเคยชมว่า Eric ดีแต่ตัวนี้ดีกว่ามาก รุ่น community ฟรีมีสัญญาอนุญาตแบบ Apache license

ต่อไปจะลำดับความเรียงว่าต้องติดตั้งตัวไหนก่อนตัวไหนหลัง

ดาวน์โหลดและติดตั้ง Miniconda

ขณะที่เขียนอยู่นี้เวอร์ชั่น 3 ต้องการดาวน์โหลดก็ตามลิ๊งนี้ download miniconda ส่วนตัวผมเลือกรุ่น 64 บิตขนาดประมาณ 60 MB ติดตั้งก็ง่ายๆ เมื่อได้ไฟล์มาแล้วตอนติดตั้ง ช่วงที่ถามว่าจะเอาโปรแกรมไปเก็บไว้ที่ไหนผมขอแนะนำให้ไว้ตรงรากของไดรว์ C จะหาง่ายและสะดวกที่สุดตอนคลิกเข้าไปดูไฟล์

Miniconda3-latest-Windows-x86_64 (1)_2017-04-23_16-57-39

เมื่อติดตั้งเสร็จ เวลาใช้โปรแกรมนี้ใน windows 10 ใช้ปุ่มวินโดส์ (Win) บนคีย์บอร์ดแล้วพิมพ์คำว่า “anaconda” บางทีพิมพ์แค่คำว่า “ana” ก็จะเห็น shortcut “Anaconda Prompt” ขึ้นมาก็ enter เข้าได้เลย จะแสดงพาทที่ติดตั้งไว้ด้วยเครื่องผมคือ “C:\Miniconda3” ลองเรียก python ดูจะเห็นว่าเป็นรุ่น 3.6.0

cmd_2017-04-24_04-54-34

สมมติว่าผมต้องการติดตั้ง python รุ่น 3.5 เพราะว่า Pyside2 ต้องการรุ่นนี้ และผมต้องการพัฒนาโปรแกรมด้วย PySide2 ทั้ง 32 bit และ 64 bit ที่คอมมานด์ พร็อมป์จัดการพิมพ์ตามนี้

set CONDA_FORCE_32BIT=1
conda create -n py35_32 python=3.5

คำสั่งแรกบังคับให้ miniconda อยู่ในโหมด 32 บิต คำสั่งถัดไปสร้างสภาพแวดล้อมชื่อ py35_32 แล้ว Miniconda จะดาวน์โหลดไลบรารีที่เกี่ยวข้องมาติดตั้งให้ทันที โดยในที่นี้ก็คือ Python รุ่น 3.5  เวลาต้องการใช้งานสภาพแวดล้อมนี้ใช้คำสั่งนี้

activate py35_32

จะได้ผลลัพธิ์ดังนี้ จะเห็นตัวหนังสือด้านหน้าจะเปลี่ยนเป็น “py35_32”

cmd_2017-04-23_18-47-30

ต่อไปสร้างสภาวะแวดล้อมเป็นไพทอน 64 บิต คำสั่งแรกปลดล็อคการใช้โหมด 32 บิต และคำสั่งที่สองสร้างสภาวะแวดล้อมชื่อ “py35_64” ระบุไปว่าเราต้องการไพทอนรุ่น 3.5

set CONDA_FORCE_32BIT=
conda create -n py35_64 python=3.5

เวลาใข้งานต้องการจะใช้ในโหมดนี้ ใช้คำสั่ง

activate py35_64

ถ้าดูโฟลเดอร์ของ miniconda จะเห็นว่ามีการสร้างโฟลเดอร์ให้สองโฟลเดอร์ ตามที่เราสร้างด้วยคำสั่ง create

explorer_2017-04-24_04-58-04

ติดตั้งไลบรารีบนสภาพแวดล้อม 32 บิต

ต่อไปจะติดตั้งไลบรารีต่างๆ ซึ่งก็แล้วแต่ละคนที่จำเป็นต้องใช้ ตัวอย่างที่ผมต้องการใช้งานได้แก่ openpyxl, pyproj, geographiclib, pyshp, gmplot, simplekml และที่สำคัญที่สุดคือ pyside2 เนื่องจากไลบรารี openpyxl บางครั้งผมติดตั้งจากคำสั่ง pip และไลบรารีตัวนี้ต้องการ lxml บางครั้งติดตั้งแล้วใช้งานไม่ได้ ต้องไปดาวน์โหลดไฟล์ wheel มาติดตั้งเอง หมายเหตุว่าไฟล์ wheel คุณสมบัติพิเศษของมันคือสามารถแนบไฟล์ที่ต้องการใช้มาได้ด้วยเช่นไฟล์ dll

ต่อไปจะติดตั้งไลบรารีในโหมด 32 บิตก่อน อย่าลืมใช้คำสั่ง

activate py35_32

ติดตั้ง lxml ด้วยการไปดาวน์โหลดไฟล์ wheel ที่เว็บนี้มีเกือบทุกอย่างที่ต้องการ download python extension packages ไปถึงแล้วก็ค้นหาในเว็บหา lxml เจอแล้วก็ดาวน์โหลดมาทั้ง 32 บิตและ 64 บิต และไฟล์ต้องมีคำว่า cp35 ด้วยเป็นการระบุว่าใช้กับ python 3.5

firefox_2017-04-24_14-12-55

pip install lxml‑3.7.3‑cp35‑cp35m‑win32.whl

ต่อไปติดตั้งไลบรารีของไพทอนตัวที่เหลือ

pip install openpyxl

pip install geographiclib

pip install pyshp

pip install pyproj

pip install gmplot

pip install simplekml

ติดตั้ง PySide2 ด้วย wheel

เนื่องจาก PySide2 เวอร์ชั่นจริงยังไม่ได้ออกมา ดังนั้นต้องอาศัยไฟล์ wheel หรืออีกทางหนึ่งก็คือไปดึงไฟล์โค๊ดจาก github มาคอมไพล์เอง แต่ผมทำไม่สำเร็จ เลยต้องอาศัยวิธีนี้ ดาวน์โหลดไฟล์ wheel ได้จากลิ๊งค์นี้ download pyside2

ในตอนนี้จะเห็นไฟล์อยู่สองไฟล์ดังรูปด้านล่าง จะเห็นว่าชื่อไฟล์มีคำว่า cp35 คือระบุว่าต้องการไพทอนรุ่น 3.5 ก็เหมือนที่ผมบอกไปแล้วว่าทำไมเราต้องการไพทอนรุ่น 3.5 ให้ดาวน์โหลดไปทั้งสองไฟล์ครับ

firefox_2017-04-24_07-35-19

ใช้ command prompt ของ miniconda ทำการ cd เข้าไปหาไฟล์ที่เก็บไว้แล้วติดตั้งด้วย pip

pip install  PySide2-2.0.0.dev0-cp35-cp35m-win32.whl

สำหรับเครื่องคอมพิวเตอร์ผม ตอนติดตั้ง PySide2 ดูจากรูปด้านล่าง

cmd_2017-04-24_07-41-40

ติดตั้งไลบรารีบนสภาพแวดล้อม 64 บิต

เหมือนกับติดตั้งให้ 32 บิต เพียงแต่ตอนติดตั้ง PySide2 ใช้ไฟล์ wheel คนละตัว เริ่มด้วยคำสั่งนี้ก่อน

activate py35_64

จากนั้นก็ใส่ยาวเลย

pip install lxml‑3.7.3‑cp35‑cp35m‑win_amd64.whl

pip install openpyxl

pip install geographiclib

pip install pyshp

conda install pyproj

pip install gmplot

pip install simplekml

pip install PySide2-2.0.0.dev0-cp35-cp35m-win_amd64.whl

ลองทดสอบเรียกไพทอน แล้ว import ไลบรารีเหล่านี้ดูกัน

cmd_2017-04-24_07-52-59

ผ่านฉลุยครับไม่มี error เลย

ติดตั้ง PyCharm

ต่อไปจะดาวน์โหลด PyCharm รุ่น Community ได้ตามลิ๊งค์นี้ download pycharm เลือกเอารุ่น community ซึ่งจะฟรี ได้ไฟล์มาแล้วก็ทำการติดตั้งจากไฟล์ installer ที่ดาวน์โหลดมา เมื่อติดตั้งเสร็จแล้ว ที่สำคัญคือจะ config ให้ pycharm รู้จัก python ว่าต้องใช้สภาพแวดล้อมไหนอย่างไร รัน Pycharm ครั้งแรกถ้ายังไม่มีไฟล์ project เลยเรียกเมนู File > New Project… แล้วใส่ชื่อโครงการ และที่สำคัญคือสามารถเลือกสภาวะแวดล้อมได้ ผมเลือก “py35_64”

pycharm64_2017-04-24_08-05-09

เมื่อเข้าไปแล้วโครงการยังว่าง ผมสร้างไฟล์ใหม่ ด้วยคำสั่ง File > New… เลือกเป็น python file จะเห็นหน้าตาโล่งๆ ว่างปล่าว

pycharm64_2017-04-24_08-11-26

แต่ถ้าต้องการเปลี่ยนเป็นสภาวะแวดล้อม “py35_32” ในโหมด 32 บิต จะต้องไปที่เมนู File > Settings… จะเห็นไดอะล็อกที่สามารถเปลี่ยนได้ที่ Project Intepreter

pycharm64_2017-04-24_08-12-59

โปรแกรมตัวอย่างทดสอบ PySide2

มาลอง PySide2 กันครับ ตรงหน้าว่างๆของ test.py ลองพิมพ์ตัวอย่างนี้เข้าไป หรือ copy & paste ไปก็ได้ แต่มือใหม่ควรจะหัดพิมพ์ สำหรับโปรแกรมมิ่งจะไม่อธิบายนะครับ แต่ผมแนะนำว่าให้หาอ่านจาก PyQt5 ดีกว่าเพราะ tutorial เยอะมาก

class=”code”># -*- coding: utf-8 -*-

import sys
from PySide2.QtWidgets import QApplication, QWidget

if __name__ == ‘__main__’:

app = QApplication(sys.argv)

w = QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle(‘Simple’)
w.show()

sys.exit(app.exec_())

จะทำการรันดู ที่เมนู Run > Run… เลือกไฟล์ test.py  จะได้ผลลัพธ์คือ error ไม่มีอะไรครับ PyCharm  หาไลบรารีของ PySide2 ไม่เจอ

pycharm64_2017-04-24_08-23-45

มีวิธีหลายวิธีตั้งแต่ environment variables  ให้วินโดส์ วิธีแรกที่จะแนะนำนั้นง่ายเพิ่มโค๊ดประมาณ 5 บรรทัด

# -*- coding: utf-8 -*-
import sys
import os
import PySide2

dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', '')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path

from PySide2.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Hello world')
    w.show()

    sys.exit(app.exec_())

โดยเฉพาะบรรทัดที่ dirname = os.path.dirname(PySide2.__file__) จะเป็นการดึงเอาที่อยู่ของไดเรคทอรีหรือโฟลเดอร์ของ PySide2 ที่่เราใช้งานอยู่ ไม่ว่าเรากำลังใช้ 32 บิตหรือ 64 บิต ก็ไม่มีปัญหา ลองรันดูที่นี้ผ่านครับ

pycharm64_2017-04-24_14-39-17

วิธีที่สองใช้วิธีเขียน Environment Variables ที่คีย์บอร์ดกดคีย์ win  ค้างไว้กด x (Win + x) จะมีเมนูของวินโดส์เลือก System แล้วเลือก Advance system settings จากนั้นจะมีไดอะล็อกอีกตัวขึ้นมา คลิกเลือก Environment Variables

SystemPropertiesAdvanced_2017-04-24_17-19-09

คลิก New… ที่ System Variables ถ้าเครื่องผมป้อนดังรูปด้านล่าง สำหรับสภาพแวดล้อม 64 บิต ถ้า 32 บิต แก้ตัวหนังสือ py35_64 เป็น py35_32

SystemPropertiesAdvanced_2017-04-24_17-21-36

วิธีนี้อานุภาพรุนแรงครับ เพราะว่าโปรแกรมบางโปรแกรมที่เขียนด้วย PyQt5 หรือ Qt5 ที่ติดตั้งไว้บนเครื่องคอมพิวเตอร์จะพร้อมใจกัน error เพราะหาไลบรารีของ  Qt5 ไม่เจอ เพราะ system variable ตัวนี้ QT_QPA_PLATFORM_PLUGIN_PATH สิทธิ์จะมากที่สุด ปกติโปรแกรมที่พัฒนาด้วย Qt จะเขียนไฟล์ qt.conf ไว้เพื่อระบุว่าไฟล์ไลบรารีของ Qt อยู่ที่ไหน โดยที่ไฟล์ qt.conf ก็วางที่เดียวกับ execute file แต่ถ้าเจอ system variable ตัวนี้จะไม่อ่านไฟล์ qt.conf ก่อน แต่จะวิ่งมาที่พาธที่เราตั้งนี้

เวลาจะเขียนโปรแกรมด้วย PyCharm ผมจะมาตั้งก่อน เสียเวลานิดหน่อย เวลาไม่ได้เขียนก็ลบออก โปรแกรมอื่นๆจะทำงานได้ตามปกติ แต่ตอนที่ผมยังใช้ PyQt5 ไม่มีปัญหาครับ ไม่ต้องมานั่งใส่ใหม่และลบออก ชีวิตยุ่งขึ้นมานิด แต่แลกเอาสัญญาอนุญาตของ PySide2 ที่เปิดกว้างกว่าครับ พบกันตอนหน้าครับ

ปลดพันธนาการ PyQt5 ด้วย PySide2

ตอนนี้ถือว่ามาเล่าสู่กันฟังจากประสบการณ์ เป็นเรื่องโปรแกรมมิ่ง ถ้าไม่สนใจเรื่องโปรแกรมมิ่งก็ผ่านไปได้ครับ

PyQt5 กับลิขสิทธิ์แบบ GPL v3

ผมเขียนไพทอนด้วยการใช้ PyQt5 มาได้สักระยะเวลาหนึ่ง น่าจะสองปีกว่าได้ ยอมรับว่าชอบมากๆ ก็ไม่ได้ระแวดระวังเรื่องกฎหมายลิขสิทธิ์เท่าไหร่นัก ลิขสิทธิ์ของ PyQt5 เป็นแบบ GPL v3 ซึ่งสาระโดยรวมๆสามารถเอาไปใช้ได้สองกรณีคือ พัฒนาโปรแกรมแบบเปิดโค๊ด (open source) และแจกจ่ายฟรีพร้อมโค๊ด กรณีนี้ไม่จำเป็นต้องเสียเงินค่าลิขสิทธิ์ แต่ถ้าเป็นกรณีที่สองคือการพัฒนาโปรแกรมเพื่อการค้าและปิดโค๊ด จะต้องเสียค่าลิขสิทธิ์ประมาณ 500US$ ต่อปี ซึ่งไม่น่าจะมากมายนัก ผมเองเอา PyQt5 มาใช้และแจกจ่ายโปรแกรมของผมให้ฟรีก็จริงแต่ปิดโค๊ด ยังไม่พร้อมที่จะเปิดโค๊ดและจ่ายค่าลิขสิทธิ์เนื่องจากไม่ได้หารายได้จากโปรแกรมที่แจกจ่ายไป

ทางสองแพร่ง

ผมลองมองหาเครื่องมือพัฒนาตัวอื่นๆที่มีลิขสิทธิ์เอื้อแบบปิดโค๊ดแต่ยังสามารถใช้ได้ฟรี ที่อ่านๆมาแล้วอยู่ในใจคือ Kivy Platform

  • Kivy framework Platform รองรับภาษาไพทอน ข้อดีหลายอย่างคือ  cross platform  เขียนโปรแกรมครั้งเดียวสามารถนำไปคอมไพล์ บิวด์ได้บน Linux, Mac OS หรือสามารถพอร์ตลงไปหามือถือ Android, IOS ก็ได้ ที่สำคัญคือเป็นโครงการเปิดโค๊ด มีลิขสิทธิ์แบบ MIT License ซึ่งนอกจากจะเปิดโค๊ดแล้ว ยังอิสระเสรีมาก ซอฟแวร์ที่ใช้ลิขสิทธิ์แบบนี้ ผู้ใช้สามารถเอาไปทำอะไรก็ได้ตั้งแต่ก๊อปปี้ แก้ไข รวม แจกจ่ายหรือกระทั่งนำไปขายก็ได้ สุดท้ายถ้าใช้ Kivy พัฒนาก็ยังสามารถนำโปรแกรมไปทำการค้าได้
  • แต่ปัญหาของผมคือ โปรแกรมที่เขียนมีขนาดค่อนข้างใหญ่แล้ว การพอร์ตจากโค๊ดของ PyQt5 ไปยัง Kivy ไม่ใช่่จะทำได้ง่ายๆ เนื่องจาก Kivy มีรูปแบบ GUI ของตัวเอง ไม่ง่ายครับต้องใช้เวลามาก

PySide2 ผู้มาช่วยชีวิต

ในขณะที่กำลังจะจมน้ำอยู่นั้น นึกถึง PySide รุ่นแรกซึ่งรองรับและใช้ได้แค่ Qt4 ไม่ใช่ Qt5 ที่ผมตกร่องปล่องชิ้นไปแล้ว การจะ downgrade กลับหลังหันไปใช้ Qt4 ผ่าน PySide รุ่นหนึ่งไม่ได้ง่ายต้องรื้อโค๊ดพอสมควร เผลอๆอาจจะยากกว่าการกลับไปขอคืนดีกับแฟนเก่า 🙂 ส่วนเรื่องลิขสิทธิ์เท่าที่ทราบมาคือ PySide ใช้ลิขสิทธิ์แบบ LGPL v2.1 คือสามารถนำไปใช้พัฒนาโปรแกรมสำหรับปิดหรือเปิดโค๊ดได้ ทั้งแจกจ่ายฟรีและขายได้ เพียงแต่ไปเอาไลบรารีตัวไหนที่เป็น LPGL มาใช้จะต้องคงความเป็น LGPL ไว้คือต้องเปิดโค๊ตไลบรารีตัวนั้นไปให้ผู้ใช้ด้วย  ข่าวร้ายของ PySide รุ่นหนึ่งคือโครงการตาย ไม่ขยับมาแล้วสามปีกว่า ผมลองค้นเข้าไปลึกๆ ปรากฎว่าโครงการนี้ตอนแรกๆ ได้มีนักพัฒนาอิสระ fork โครงการมาบน Github กลุ่มเล็กๆต่อมาได้ย้ายและไปพัฒนาต่อเป็นทางการจาก Qt Company เจ้าของ Qt framework ตัวจริงเสียงจริง เหมือนฟ้ามาโปรด แต่ยังไม่แน่ใจว่าโค๊ดเดิม PyQt5 ของผมจะ compatible กับ PySide2 แค่ไหน

ในขณะที่ไม่รู้จะทำอะไรก็เลยไปดาวน์โหลดหยิบเอา PySide ตอนนี้เป็นรุ่น PySide2 ที่กำลังพัฒนาอยู่ เป็นไฟล์ wheel ครับที่ทีมงานได้คอมไพล์และบิวท์มาให้ลองใช้ก่อน รุ่นที่ผมหยิบมาใช้ในขณะนี้ บิวท์นานมาแล้วประมาณหกเดือนกว่า รุ่นล่ากว่านี้ยังไม่มี

PySide2 ใช้ลิขสิทธิ์แบบ LGPL v2 เหมือนกันกับ PySide รุ่นหนึ่ง เมื่อดาวนโหลดมาแล้วก็ติดตั้ง มาลองดูว่าพอไปได้ไหม ผมใช้เวลาว่างๆตอนเลิกงานลองไปหก เจ็ดวัน สำเร็จครับ ส่วนใหญ่ใช้ได้กับโค๊ดเดิม แค่ตอน import ไลบรารีเปลี่ยนแค่หัวจาก PyQt5 มาเป็น PySide2 มีส่วนนิดเดียวผมแก้ไขโค๊ดใหม่ให้เข้ากับ PySide2 แต่น้อยมาก และที่เจออีกหนักอีกหน่อยคือ ระบบรายงานผลการแสดงภาพบนจอมอนิเตอร์คือ Screen ยังไม่เสร็จ ทำให้ผมไม่สามารถตรวจได้ว่าผู้ใช้ใช้จอที่ resolution เท่าไหร่ มี dot pixel  ratio เท่าไหร่ อันนี้สำคัญเพราะว่าจอ HiDPI เช่นจอ 4K ทั้งหลาย ตอนนี้ใช้กันมากแล้ว เมื่อ PySide2 ไม่มีให้ ต้องไปหาโค๊ดมาช่วย ใช้ Windows API ไปพลางๆก่อน พอเสร็จเมื่อไหร่ ค่อยกลับมาใช้โค๊ดของ PySide2 ที่เสร็จแล้วต่อ

ผมพูดได้ว่าตอนนี้โปรแกรมของผม เกือบจะ 99.9% ใช้ของเดิม มาปรับแต่งเองเพียง 0.1% มันง่ายหรือเพราะโปรแกรมผมไม่ได้ใช้เขียนอะไรพิศดารหรือปล่าวเช่นระบบกราฟฟิคที่เลิศหรู แต่เอาละต้องขอบคุณทีมงาน PySide2 มา ณ ที่นี้ด้วยครับ

ข้อจำกัด PySide2 รุ่นพัฒนา

ข้อจำกัดของ PySide2 รุ่นพัฒนายังมีอยู่มากครับ บางครั้งผมรันโปรแกรมผ่านบรรทัดที่ผิด ไม่มีการนับแปดครับ โดนน๊อคกลางอากาศค้างไปดื้อๆ ก็น่าจะอีกสักพักครับ ที่ทีมงานของ Qt จะบิวท์มาให้ใช้กันใหม่ เพราะของเก่าผ่านมาหกเดือนกว่าแล้ว ตัวใหม่น่าจะเสถียรกว่า ดีกว่า

แปลงเป็นไฟล์ Execute ให้รันได้ นรกของโปรแกรมเมอร์ไพทอน

ปกติผมใช้ PyInstaller  สำหรับแปลงโค๊ดไพทอนเป็น execute file (exe) ที่สามารถนำไปรันได้ ทั้งที่ข้อดีของไพทอนคือเขียนง่าย อ่านง่าย ทรงพลัง และไลบรารีที่มีให้เลือกให้ใช้มากมายมหาศาล แต่เป็นที่รู้กันว่างานแปลงไฟล์จากโค๊ดไปเป็นไฟล์ exe ที่รันใช้งานได้ มันเป็นงานสุดหินสุดโหด ตอนผมเริ่มต้นใหม่ๆ ผมก็ไม่รู้ว่าไลบรารีตัวไหน ต้องการขนเอาไฟล์อะไรไปบ้างเพื่อให้สามารถรันได้ บางตัวขนกันไปเป็นโฟลเดอร์ คือแบบเรือพ่วงลากกันไปเป็นพวงๆ ตอนหลังมารู้ว่า มีไฟล์ hooks ที่ PyInstaller  อ่านมาเพื่อตัดสินใจว่าจะขนอะไรไปให้ โฟลเดอร์ไหน ก็ง่ายขึ้น ไฟล์ hooks ส่วนใหญ่มากับ PyInstaller  ถ้าไม่มีก็ไปค้นหาดาวน์โหลดมาได้

ตอนนี้ PySide2 ยังมีนักพัฒนาเอาไปใช้ในวงจำกัดอยู่ จึงไม่มีไฟล์ hooks ปล่อยมา นรกกลับมาเริ่มต้นกับผมอีกครั้ง ต้องลองทดสอบว่า PySide2 เอาอะไรไปใช้บ้าง ตอนนี้ขณะเขียนบทความนี้ ยังไม่สำเร็จครับ กำลังลองผิดลองถูก ไม่เป็นไรชีวิตย่อมมีหนทางเสมอ ผมใช้เวลาในวันอาทิตย์เกือบค่อนวันก็สำเร็จ สามารถนำไฟล์ exe ไปรันได้ตามปกติ สาเหตุที่ไม่ผ่านในตอนแรก ตัว PyInstaller มีปัญหากับโมดูลระบบชื่อ requests ต้องเอา requests รุ่นที่ไม่มีปัญหากันมาใส่แทน

เมื่อไฟล์ exe รันแล้วไม่ติดขัด ก็จะเป็นขั้นตอนต่อไปคือใช้โปรแกรมจำพวก installer มาใช้เช่น Inno Setup ขวัญใจมหาชนเจ้าประจำผมใช้อยู่ ขั้นตอนนี้ง่ายครับ เตรียมไฟล์ exe ให้พร้อม ไฟล์ไลบรารีทั้งหลาย โฟลเดอร์ที่จำเป็นต้องใช้ จากนั้นทำการ build ก็ได้โปรแกรมติดตั้ง ที่สามารถนำไปติดตั้งใช้งานได้

ดาวน์โหลด (Download)

ไปดาวน์โหลดโปรแกรมรุ่นที่บิวท์ด้วย PySide2  เป็นรุ่น V0.70 build 513 ได้แล้วที่หน้า Download ใครที่ใช้รุ่นก่อนหน้านี้ขอความกรุณาช่วย uninstall และมาดาวน์โหลดรุ่นใหม่ไปใช้ด้วย

python_2017-04-22_18-37-32
Surveyor Pocket Tools ในฉบับของ PySide2 เหมือนเดิมเพราะ engine คือตัว Qt framework เดียวกัน
python_2017-04-22_18-49-45

ตัวอย่างหน้าตาของ Transform Coordinates

ความเป็นมาของ Qt framework

เล่าเรื่อง PyQt5 vs. PySide2 ผู้อ่านบางท่านอาจจะงง ถีงที่มาที่ไป PyQt และ PySide คือเครื่องมือสำหรับพัฒนาโปรแกรมประยุกต์ ที่มีพื้นฐานมาจาก Qt framework ที่พัฒนาด้วย C++ ผู้สร้าง Qt คือบริษัท Trolltech บริษัทเล็กๆนอรเวย์ จากนั้นถูกซื้อไปในปี 2008 โดยโนเกีย (Nokia) ยักษ์ใหญ่ในตอนนั้นจากฟินแลนด์ (ย้อนหลังไป 15-25 ปีที่แล้ว คงไม่มีใครไม่รู้จักโนเกียเพราะเป็นเจ้าพ่อแห่งวงการมือถือ ยุคก่อน IPhone OS และ Android) ทำให้ลิขสิทธิ์ของ Qt ตกมาอยู่กับโนเกีย และโนเกียพยายามจะพัฒนาให้ Qt สามารถใช้กับมือถือได้ (แต่ก็ไม่ทัน ไอโอเอสและแอนดรอยด์ จนแพ้สงครามนี้ในที่สุด) ช่วงที่ Qt อยู่กับโนเกีย ในขณะนั้น Riverbank Computing บริษัทจากอังกฤษได้พัฒนา PyQt  แต่ตอนหลังมีปัญหากัน เพราะ Riverbank ไม่ยอมเปลี่่ยนลิขสิทธิ์ของ PyQt ที่ใช้แบบ GPL ส่วน Qt ใช้ลิขสิทธิ์แบบ LGPL ซึ่งยืดหยุ่นกว่า โนเกียก็ได้พัฒนา PySide ขึ้นมาเพื่อให้มีลิขสิทธิ์แบบเดียวกันกับ Qt แต่สถาณการณ์ของโนเกียตอนนั้นกำลังย่ำแย่มากๆ เพราะมือถือจากไอโอเอสของแอปเปิ้ลกับแอนด์ดรอยของกูเกิ้ลได้ครองตลาดเบ็ดเสร็จแล้ว

ในปี 2011 โนเกียขาย Qt ให้บริษัท Digia จากฟินแลนด์ หลังจากนั้นฉากสุดท้ายแล้วก็เป็นที่ทราบกันดีว่าโนเกียถูกซื้อเสนอซื้อโดยไมโครซอฟท์ในปี 2013 เฉพาะส่วนที่เกี่ยวกับมือถือสมาร์ทโฟนจบการดีลการซื้อขายในปี 2014 และจบตำนานโนเกียในที่สุด สะท้อนของสัจธรรมที่ว่าในโลกนี้ไม่มีอะไรเที่ยงแท้แน่นอน หลังจาก Digia ได้ Qt ไปในปี 2014 ได้ก่อตั้งบริษัท Qt Company และเป็นผู้พัฒนา Qt จนถึงปัจจุบัน และตามที่ผมกล่าวมาแล้ว Qt Company ได้ดึงโครงการ PySide มาสานต่อเป็นโครงการ PySide2 ซึ่งถ้าเปิดใช้เป็นทางการเมื่อไหร่ ผมก็เป็นคนหนึ่งที่ตั้งหน้าตั้งตารอคอย

โครงการในอนาคต

ก็เป็นโครงการที่วาดฝันครับ คือพอร์ตโปรแกรม Surveyor Pocket Tools ลงบนมือถือด้วย Kivy framework คงแยกแต่ละ tool ไปเป็นแต่ละ app ซึ่งก็มีฟรีบ้างขายบ้าง ก็เป็นเรื่องอนาคตไม่ได้ตั้งความหวังอะไรมากมาย ปัจจุบันคือพัฒนาและปรับปรุงโปรแกรมทั้งหลายบน Desktop ให้ใช้งานกันต่อไป และยังยืนยันว่าฟรีเหมือนเดิม และความคิดก็ยังเหมือนเดิมครับ “โลกนี้จะน่าอยู่ ถ้าทุกคนแบ่งปัน ถ้อยทีถ้อยอาศัยกัน

ทิ้งท้ายกันนิดหนึ่งจากหัวข้อ “ปลดพันธนาการ” ก็ดูจะโหดร้ายไป ตั้งให้น่าสนใจแค่นั้นครับ PyQt5 นั้นเป็นเครื่องมือพัฒนาโปรแกรมที่ดีมาก มี document ให้อ่านเยอะแยะ ติดขัดตรงไหน Stackoverflow ช่วยได้ สำหรับคนใช้เครื่องมือเพื่อการค้า ก็อุดหนุนซื้อกันไป แต่ถ้าพัฒนาโปรแกรมแบบเปิดโค๊ดก็ตัวนี้เลย ไม่ผิดหวัง สำหรับผมขอเลือก PySide2 ด้วยเหตุผลที่กล่าวมาข้างต้นทั้งหมด พบกันตอนต่อไปครับ

Surveyor Pocket Tools – ทดสอบโปรแกรมการแปลงพิกัดบน State Plane Coordinate System (SPC)

ในฐานะช่างสำรวจในย่าน AEC บ้านเรา ส่วนใหญ่จะคุ้นเคยกับระบบพิกัดที่ส่วนใหญ่ใช้เส้นโครงแผนที่ Transverse Mercator กันส่วนใหญ่ แต่มาเลเซียนั้นต่างออกไปเนื่องจากมีพื้นที่ที่ยาวเฉียงๆ ทั้งสองพื้นที่คั่นด้วยทะเลจีนใต้ พื้นที่แรกอยู่บนเกาะบอร์เนียวอีกพื้นที่หนึ่งติดกับประเทศไทย ทางมาเลเซียใช้เส้นโครงแผนที่ Oblique Mercator ซึ่งเป็นเส้นโครงแผนที่ค่อนข้างซับซ้อนกว่าอันอื่น

เรามาลองไปทัศนศึกษาที่หรัฐอเมริกาดูกัน สหรัฐอเมริกาเป็นประเทศใหญ่ มีระบบพิกัดและเส้นโครงแผนที่ที่หลากหลายมาก ในฐานะช่างสำรวจพอจะเป็นความรู้ประดับบ่ากันไว้นิดๆหน่อยๆ ไม่ถือว่าเหลือบ่ากว่าแรงจนต้องแบกหาม มาทัศนาผ่านทางโปรแกรมแปลงพิกัด Transform Coordinate ที่อยู่ในชุด Surveyor Pocket Tools

State Plane Coordinate System (SPC)

  • คือกลุ่มระบบพิกัดของสหรัฐอเมริกาที่รวบรวมระบบพิกัดที่ใช้ในแต่ละพื้นที่หรือรัฐทั้งหมด 124 โซน โดยที่รัฐที่มีพื้นที่ติดกันจำนวน 110 โซน และอื่นๆที่เหลือได้แกเช่นอลาสก้า ฮาวาย เปอร์โตริโก้และหมู่เกาะยูเอสเวอร์จิน
  • State Plane Coordinate System (SPC) ปัจจุบันคือ North America Datum 1983 (NAD83) ใช้ทรงรี GRS80 ต่างจากของเดิมคือ NAD27 ที่ใช้ทรงรี Clark 1866

AcroRd32_2017-03-22_08-20-10.jpg

  • เส้นโครงแผนที่ (Map projection) ใช้อยู่ 3 ประเภทคือ
    1. Transverse Mercator (TM) สามารถรักษา scale factor คงที่ได้ในแนวแกนเหนือ-ใต้ จึงนิยมใช้สำหรับพื้นที่ที่ยาวจากเหนือไปใต้
    2. Lambert Conformal Conic (LCC) เนื่องจากสามารถรักษา scale factor ให้คงที่ได้ในแนวแกนตะวันออก-ตะวันตก จึงนิยมใช้กับพื้นที่มีความยาวจากตะวันออกไปตะวันตก
    3. Oblique Mercator (OM) นิยมใช้กับพื้นที่ที่ยาวเฉียงแบบทะแยง ใช้อยู่รัฐเดียวคืออลาสก้า

โปรแกรมแปลงพิกัด Transform Coordinate

  • ถ้าจะดาวน์โหลดก็ดูที่ช่องยาวๆด้านขวาของ blog ในขณะที่เขียนบทความนี้ เป็นรุ่น 0.66 build 501 ดาวน์โหลดแล้วก็ติดตั้ง เมื่อคลิกโปรแกรมและรันจะเห็นไดอะล๊อกหน้าแรกรวมโปรแกรมชุดของ Surveyor Pocket Tools ตามรูปด้านล่างที่ไฮไลต์ไว้คือ “Transform Coordinates” 

Surveyor Pocket Tools_2017-03-21_20-45-41

  • มาดูหน้าโปรแกรม ผม update ข้างในไปมาก ทั้งๆที่ตอนแรกตั้งใจจะเขียนให้ใช้งานได้เฉพาะเส้นโครงแผนที่ Transverse Mercator ไปๆมาๆ ก็ไปไกลเกินกว่าที่ตั้งใจไว้ตอนแรก หน้าตาก็เรียบง่ายแต่เพิ่มเครื่องมือจัดเก็บค่าพิกัดและเรียกใช้ค่าพิกัด รวมถึงเครื่องมือปักหมุดบน google maps & google earth

ทดสอบการแปลงพิกัดบนเส้นโครงแผนที่ Oblique Mercator (OM)

  • จะทดสอบการแปลงพิกัดจากค่าแลตติจูดและลองจิจูด จากทรงรี GRS80 ไปยังระบบพิกัดฉาก NAD83 สำหรับ Alaska zone 1 นี้ใช้ Oblique Mercator ซึ่งพารามิเตอร์ของเส้นโครงแผนที่ OM ตามตารางด้านล่าง
    •  Alazka zone 1 – NAD83
    • Scale factor at the projection’s center = 0.9999
    • Longitude of the projection’s center = 133º 40′ W
    • Latitude of the projection’s center = 57º 0′ N
    • Azimuth at the projection’s center = 323º07’48.3685″
    • Angle from Rectified to Skew Grid =  323º07’48.3685″
    • False Easting (meters) = 5000000
    • False Northing (meters) = -5000000

AcroRd32_2017-03-22_15-44-02

ข้อมูลทดสอบโปรแกรม

  • ข้อมูลทดสอบผมจะใช้หมุดของทางการ ที่สะดวกมากสามารถจะดูหมุดที่ไหนก็ได้ ข้อมูลแต่ละหมุดจะเรียกว่า data sheet เข้าไปดูได้ที่เว็บไซต์ของ NGS ตาม ลิ๊งค์ นี้ครับ
  • อันดับแรกเลือกรัฐก่อน เลือก “Alaska” ต่อจากนั้นเลือก county ให้เลือก “AK|103|KETCHIKAN GATEWAY BOROUGH” จากนั้นคลิกที่ปุ่ม “submit” แล้วจะเห็นหมุดถูกลิสต์ออกมามากพอสมควร ลองเรียงหมุดดูตาม latitude ผมคลิกเลือก “Latitude” แล้วคลิกที่ปุ่ม “Re-Sort-By” ตอนนี้จะเลือกหมุดที่มีหมายเลข PID = UV5754 เลือกแล้วคลิกที่ปุ่ม “Get data sheets” จะได้ data sheet ออกมา
  • ลองดู data sheet  ของหมุด  UV5754 ด้านล่าง

chrome_2017-03-22_08-52-04

  • ที่ผมลากสี่เหลี่ยมไว้ด้านบนคือค่าพิกัดในระบบ geographic ของ NAD83 จะใช้ค่านี้มาทดสอบ เลือกระบบพิกัดและป้อนข้อมูลเข้าไปดังรูป Latitude = 55° 6′ 45.20173″N Longitude = 131° 43′ 58.97516″W

Surveyor Pocket Tools_2017-03-22_09-02-26

  • ด้านขวาปลายทางเลือก Group = “Projected Coordinate System” เลือก Datum = “NAD83 (National Spatial Reference System 2007)” จากนั้นเลือก System = “NAD83(NSRS2007) / Alaska zone 1” พร้อมแล้วคลิกลูกศรขวาเพื่อทำคำนวณ

Surveyor Pocket Tools_2017-03-22_09-07-59

  • จะได้ค่า North = 366701.8435, East = 942069.8596, Grid scale factor = 0.9999085667,  Convergence = 1°36’31.76352″ ซึ่งผลลัพธ์ตรงกันกับ data sheet

ทดสอบการแปลงพิกัดบน Lambert Conformal Conic (LCC)

  • สำหรับเส้นโครงแผนที่ Lambert Conformal Conic (LCC) ส่วนใหญ่จะเป็นแบบรอยตัดสองรอย (secant) บนทรงรี มากกว่าจะเป็นแบบสัมผัส ดังนั้นจะมี Latitude of parallel อยู่ตรงสองรอยตัดด้านบนและด้านล่าง สำหรับข้อมูลทดสอบจะเลือกรัฐ “Oregon” โซนด้านเหนือ พารามิเตอร์สำหรับการแปลงพิกัดมีดังนี้
    • Oregon North Zone (Designation 3601)
      • Oregon State Plane North – NAD 1983
      • Lambert Conformal Conic Two Standard Parallel Projection (Secant)
      • Central Meridian: -120° 30′ W
      • Latitude of Origin: 43° 40′ N
      • Standard Parallel (South): 44° 20′ N
      • Standard Parallel (North): 46° N
      • False Northing: 0.000 m
      • False Easting: 2 500 000.000 m

ข้อมูลทดสอบ

  • ข้อมูลทดสอบจะเข้าไปที่เว็บไซต์ของ NGS แต่ครั้งนี้จะเข้าไปใช้ interactive map แล้วค้นหาชื่อหมุด ตาม ลิ๊งค์ นี้ ด้านซ้ายมือจะมีระบบค้นหาเลือกค้นหาด้วย “PID” ป้อนชื่อหมุด “AJ8179” เมื่อเจอแล้วคลิกที่หมุดในแผนที่แล้ว แล้วคลิก “data sheet” จะได้รายละเอียดมาดังรูป

chrome_2017-03-22_17-16-10

  • ป้อนค่าพิกัดฉากของหมุด AJ8179 เข้าไปดังรูป คลิกที่รูปลูกศรขวา เพื่อจะแปลงพิกัดจาก LCC ไป geographic แต่ในขณะเดียวกันโปรแกรมจะคำนวณค่า grid scale factor และ convergence มาให้ด้วย

Surveyor Pocket Tools_2017-03-22_17-15-44

  • ได้ผลลัพธ์ดังนี้ ตรวจดูกับ data sheet จะได้ค่า grid scale factor และ convergence ตรงกัน ส่วนค่าพิกัดค่าลองจิจูดตรงกัน แต่ค่าแลตติจูดต่างกันเล็กน้อยมากที่ทศนิยมที่ 5

Surveyor Pocket Tools_2017-03-22_17-29-22

ข้อจำกัดของโปรแกรม

  • ในตอนนี้ยังไม่สนับสนุนหน่วยฟุต
  • สนับสนุนการคำนวณ grid scale factor และ convergence ให้เฉพาะเส้นโครงแผนที่ Transverse Mercator, Lambert Conformal และ Oblique Mercator ส่วนเส้นโครงแผนที่อื่นๆคำนวณให้เฉพาะการแปลงค่าพิกัดเท่านั้น เนื่องจากระบบพิกัดในโลกนี้หลากหลายมากมาย ทำให้การทดสอบข้อมูลต้องทยอยทำไปเรื่อยๆ
  • ยังไม่ได้ทดสอบข้อมูลระบบพิกัดของยุโรป European Terrestrial Reference System (ETRS)
  • มาถึงตอนนี้คงพอหอมปากหอมคอ สังเกตว่าผมไม่ได้ทดสอบเส้นโครงแผนที่ TM เนื่องจากบ้านเราใช้กันอยู่และคุ้นเคยกันดีอยู่แล้ว พบกันตอนต่อไปครับ

Surveyor Pocket Tools – Update เพิ่มโปรแกรมคำนวณสเกลแฟคเตอร์ (Line Scale Factor)

Today, GPS has thrust surveyors into the thick of geodesy, which is no longer the exclusive realm of distant experts. Thankfully, in the age of the microcomputer, the computational drudgery can be handled with software packages. Nevertheless, it is unwise to venture into GPS believing that knowledge of the basics of geodesy is, therefore, unnecessary. It is true that GPS would be impossible without computers, but blind reliance on the data they generate eventually leads to disaster.” วาทะของ  Jan Van Sickle (หนังสือ “GPS and GNSS for Geospatial Professionals, ปี 2001, หน้า 126) ผมถอดความคร่าวๆได้ว่า “ปัจจุบัน GPS ได้ผลักดันให้ช่างสำรวจเข้าไปอยู่ในความหนาแน่นของเรื่องจีโอเดซี ซึ่งไม่ใช่่เรื่องสำหรับผู้เชี่ยวชาญแต่เพียงผู้เดียวอีกต่อไป ต้องขอบคุณสำหรับยุคคอมพิวเตอร์ขนาดเล็ก งานคำนวณหนักสามารถจัดการได้ด้วยโปรแกรมประยุกต์ แต่อย่างไรก็ตาม เป็นการไม่ฉลาดที่จะคิดว่าการศึกษาพื้นฐานด้าน GPS จะไม่จำเป็น และก็เป็นจริงที่ว่าการคำนวณของอุปกรณ์ GPS เป็นไปไม่ได้เลยที่จะไม่ใช้คอมพิวเตอร์ แต่ความเชื่อมั่นอย่างมืดบอดในข้อมูลที่ (GPS) สร้างขึ้นมาจะนำไปสู่ความหายนะได้

โปรแกรม Line Scale Factor

  • เราทราบกันมาดีว่าแผนที่ในระบบพิกัดฉากเราไม่สามารถจะหลีกเลี่ยงความเพื้ยน (distortion) ไปได้ เนื่องจากที่เราพยายามแสดงลักษณะทางกายภาพของสิ่งของที่อยู่บนผิวโค้งบนทรงรีไปยังแผ่นระนาบแบบกระดาษ จำต้องใช้สเกลแฟคเตอร์ที่ไม่คงที่และแปรผันเป็นระบบมาช่วยในการแปลงเหล่านี้ ดังนั้นเราต้องมีวิธีการจัดการและใช้งานที่เหมาะสม โดยที่ไม่ทำให้ค่า error เกินกว่าที่จะยอมรับได้
  • Line Scale Factor คือโปรแกรมที่คำนวณค่าสเกลแฟคเตอร์เฉลี่ยโดยใช้ค่าระดับและค่าพิกัดของจุดเริ่มต้นและจุดปลาย กระบวนการคำนวณจะประกอบไปด้วยสองขั้นตอน
    1. ค่าเฉลี่ยของ Elevation scale factor (ESF) – จะคำนวณ ESF  ที่จุดเริ่มต้นและจุดปลาย รวมถึงคำนวณ ESF ที่จุดกึ่งกลางเส้นด้วย โดยใช้ค่าระดับเฉลี่ย การคำนวณหาค่าเฉลี่ยของ ESF จะเป็นการคำนวณในลักษณะเชิงเส้น (linear)
    2. ค่าเฉลี่ยของ Grid scale factor (GSF) – หลักการพิจารณาว่าจะใช้ค่าเฉลี่ยแบบใดให้ถือหลักการดังนี้
      • ถ้าเส้นยาวน้อยกว่า 1 กม. ใช้ Point scale factor ได้เลย (ใช้โปรแกรม “Point Scale Factor” ของผมที่ลงบทความมาก่อนหน้านั้นนี้ อ่านได้ที่ ลิ๊งค์ นี้)
      • ถ้าเส้นยาวมากกว่า 1 กม. แต่น้อยกว่า 4 กม. แนะนำให้หาค่าเฉลี่ย(หารสอง)จาก Point scale factor ที่จุดต้นทางและปลายทาง
      • ถ้าเส้นยาวมากกว่าหรือเท่ากับ 4 กม. แนะนำให้ใช้สูตรของ Simpson 1/6 มาช่วยหาค่าเฉลี่ย เพราะว่าไม่เป็นเชิงเส้น คือเส้นตรงระหว่างจุดสองจุดบนระนาบพิกัดฉาก เมื่อย้อนเอาไปเขียนลงบนทรงรีจะเป็นเส้นโค้งจีโอเดสิค (geodesic) ดังนั้นการคำนวณค่าเฉลี่ยจะให้น้ำหนักตรงกลางเส้นมากที่สุด (เพราะโค้งมากที่สุด) ลองดูสูตรด้านล่างจะเห็นว่าจุดต้นและจุดปลายให้น้ำหนักแค่หนึ่งส่วนในหกส่วน ส่วนตรงกลางให้ถึงสี่ส่วนในหกส่วน

average_scale_factor.png

ดาวน์โหลดและติดตั้ง

  • จะทำการดาวน์โหลดให้มองที่ด้านขวาดูตรงส่วน “ดาวน์โหลด (Download)” มองหา “Surveyor Pocket Tools” แนะนำให้ดาวน์โหลด build 480 ขึ้นไปเนื่องจากมีการแก้ไขบั๊กไปหลายจุด เมื่อดาวน์โหลดมาแล้วจะได้ไฟล์ zip แล้ว unzip ออกมาจะได้ไฟล์ setup นำไปติดตั้งได้ง่ายๆไม่กี่คลิก
  • หลังจากติดตั้งแล้วก็ให้เปิดโปรแกรม “Surveyor Pocket Tools” มองหาไอคอน “Line Scale Factor” แล้วดับเบิ้ลคลิกเพื่อเรียกโปรแกรมมารัน

python_2017-02-25_10-01-27

Surveyor Pocket Tools_2017-02-25_15-26-52.png

  • จุดมุ่งหมายของโปรแกรมนี้ เพื่อให้หาสเกลแฟคเตอร์ของเส้นตรงทำได้ง่าย แค่ป้อนค่าพิกัดและค่าระดับของจุดที่ 1 และจุดที่ 2 โปรแกรมจะคำนวณมาให้ทันที การประยุกต์ใช้สามารถนำตัวเลขนี้ไปใช้ในงานสนามได้ในกรณีที่งานอยู่บนระบบพิกัดฉาก UTM
  • หน้าตาของโปรแกรมถอดแบบมาจาก “Point Scale Factor” แต่ในที่นี้มีสองจุดคือจุดต้นทางและจุดปลายทาง ให้ป้อนค่าพิกัดและค่าความสูงของจุด ความสูงเลือกได้ว่าเทียบกับจีออยด์ (รทก.) หรือความสูงเมื่อเทียบกับทรงรี

โครงสร้างและส่วนประกอบ

  • ถ้ามองเผินๆเหมือนรกหูรกตา แต่จริงๆแล้วก็ไม่มีอะไร เริ่มจากตั้งระบบพิกัดให้ตรงก่อน แล้วกรอกข้อมูลจุดที่ 1 เข้าไปและตามด้วยจุดที่ 2 จากนั้นทำการคำนวณ อาจจะปักหมุดดูที่ google maps หรือไม่ก็ที่ google earth หรือถ้าต้องการเก็บค่าพิกัดก็คลิกได้ที่ไอคอนรูปหมุดเครื่องหมายบวกสีแดง

introduction_lsf.png

วิธีการใช้งาน

  • จุดพิกัดที่ยกมาเป็นตัวอย่างถือว่าเป็นกรณีศึกษา พื้นที่เป็นงานก่อสร้างมอเตอร์เวย์ช่วงใกล้ถนนบายพาสของนครราชสีมา เนื่องจากสเกลแฟคเตอร์มีค่าสูงมาก (มากขนาดกล้อง Total Station ยี่ห้อหนึ่งที่อั้นตัวเลข scale factor ไว้ที่ช่วง 0.9996 – 1.000400  คือไม่ยอมให้ป้อนเกินค่านี้ ก็ไม่ทราบว่าเหตุผลว่าทำไมต้องจำกัดตัวเลขไว้แค่นี้ )
  • จุดที่ 1 ชื่อ “MTW-01” N=1657451.026, E = 808709.698, Elevation = 222.461 m. (รทก.) จุดที่ 2 ชื่อ “MTW-02” N=1658811.819, E=828396.322, Elevation=247.844 m. (รทก.) ป้อนเข้าโปรแกรมดังรูปด้านล่าง เนื่องจาก Vertical Reference เป็นความสูง Orthometric height จึงไม่จำเป็นต้องเปลี่ยน

Surveyor Pocket Tools_2017-02-25_16-03-14.png

  • คลิกคำนวณที่ไอคอนรูปลูกศรชี้ลง ได้ผลลัพธ์ดังนี้

  • ตัวเลขสามชุดที่เขียนวงด้วยสี่เหลี่ยมด้านล่างๆคือ
    • ค่าสเกลแฟคเตอร์ที่จุดที่ 1 ESF = 0.9999695936, GSF = 1.0007788866
    • จุดกึ่งกลาง ESF = 0.9999675791, GSF = 1.0008552790 จุดกึ่งกลางนี้ ESF ใช้ค่าระดับเฉลี่ยของจุด 1 และจุดที่ 2 มคำนวณ ส่วนค่า GSF ได้จากพิกัดกึ่งกลาง N = (1657451.026 + 1658811.819) / 2 = 1658131.423, E = (808709.698 + 828396.322) / 2 = 818553.010
    • และจุดที่ 2 ESF = 0.9999655645, GSF = 1.0009340710

  • ค่าเฉลี่ย ESF หาได้ง่ายๆเพราะมัน linear จับบวกกันแล้วหารด้วยสาม = (0.9999695936 + 0.9999675791 +0.9999655645) / 3 = 0.9999675791
  • ค่าเฉลี่ย GSF ต้องใช้สูตร Simpsons มาช่วยหาค่าเฉลี่ย = (1.0007788866 + 4*1.0008552790 + 1.0009340710) / 6 = 1.0008556789
  • ค่าเฉลี่ย Combined Scale Factor (CSF) = 0.9999675791 *  1.0008556789 = 1.0008232302 เราต้องการนั่นเอง สังเกตว่าค่าสูงมากๆ 1 กม. ระยะทางบนแผนที่จะเพื้ยนจากระยะทางราบบนพื้นโลก 0.823 เมตรหรือ 82.3 ซม.

 

ปักหมุดลงบน Google Earth

  • ลองปักหมุดดูกัน

 

  • เรื่องสเกลแฟคเตอร์ในงานสำรวจขนาดใหญ่ ที่แบบ drawing ออกแบบบนระบบพิกัดฉาก UTM เป็นเรื่องที่หลีกเลี่ยงไม่ใช่ไม่ได้ เพราะจะทำให้ตำแหน่งสิ่งปลูกสร้างผิดเพี้ยนไปจากแบบ drawing การใช้สเกลแฟคเตอร์ถึงจะยุ่งยากไปบ้าง แต่ถ้าเข้าใจก็สามารถประยุกต์ใช้ได้อย่างเหมาะสมกับครื่องมือสมัยใหม่เช่น GPS และเครื่องมือรุ่นเดิมๆเช่นกล้อง Total station

Low Distortion Projection

  • ถ้าไม่ใช่สเกลแฟคเตอร์ละ มีทางออกไหม มีครับ ซึ่งวิธีการจะเรียกว่า Low Distortion Projection (LDP) คือสร้างระบบพิกัดฉากขึ้นมาเฉพาะสำหรับพื้นที่ แล้วพยายามคุมให้ความเพี้ยนไม่เกินค่าที่กำหนด เช่น ±20 ppm  แต่ถ้าพื้นที่โครงการไม่ใหญ่มากเช่น 56 กม. x 56 กม. พอจะคุมให้ไม่ให้ความเพี้ยนเกิน ±5 ppm คือระยะทาง 1000 ม. ความเพี้ยนของระยะทางไม่ให้เกิน 5 mm ถ้าระยะทาง 100 เมตร ก็เพื้ยนได้ 0.5 มม. ซึ่งถ้าตั้งกล้อง total station สำหรับให้ตำแหน่งเสาเข็ม ในระยะทางไม่เกิน 100 เมตร สามารถให้ได้เลยเพราะความเพี้ยนครึ่งมิลมิเมตร ถือว่าน้อยมาก จนไม่ต้องนำมาคิด (บางครั้งตอนตั้งเป้าให้ตำแหน่งเสาเข็ม เป้าปริซึมยังโยกไปไม่ตั้งฉาก ยังมากกว่านี้) ทำให้หน้างานสนาม ทำงานได้สะดวก ไม่ต้องตั้งสเกลแฟคเตอร์ให้กล้อง สามารถวางผังได้เลย สำรวจเก็บรายละเอียดก็ทำได้ทันที
  • เรื่องนี้ไม่ใช่เรื่องใหม่ เป็นเรื่องเก่านานพอสมควร ในอเมริกาเองก็นำมาใช้กันนานแล้ว ลองค้นหาในเน็ตด้วยคึย์เวิร์ดคำว่า “low distortion projection ldp” จะเห็นผลลัพธ์เกี่ยวกับเรื่องนี้ออกมากมายครับ ตอนหน้าผมจะนำเสนอการใช้วิธีนี้กันดูและผมพยายาม implement ด้วยการเขียนโปรแกรมมาช่วย แต่พบว่ามันมีอะไรที่มากกว่าที่คิด ติดตามกันต่อไปครับ

Surveyor Pocket Tools – Update เพิ่มโปรแกรมคำนวณสเกลแฟคเตอร์ (Point Scale Factor) – ตอนที่ 2 (ตอนจบ)

ทดสอบตัวอย่างที่ 2 บนพื้นหลักฐาน Indian 1975

  • ตัวอย่างนี้จะดึงจากตารางฐานข้อมูลที่ผมเตรียมไว้ หมายเหตุว่าตารางฐานข้อมูลผมบูรณาการใหม่ จากเดิมที่เคยเก็บค่าพิกัดในระบบพิกัดฉากกับระบบภูมิศาสตร์แยกกัน ตอนนี้จับมารวมอยู่ด้วยกัน พร้อมมีฟิลด์ที่เก็บระบบพิกัดด้วย เวลาต้องการใช้งานก็ลากมาคำนวณได้เลย จากรูปด้านล่างคลิกที่ไอคอนรูปหมุด

psf_display_db

  • จะได้ตารางข้อมูลที่เก็บค่าพิกัดและค่าระดับ(ถ้ามี) พร้อมทั้งระบบพิกัด เมื่อเปิดมาแล้วผมลากเปลียนขนาดให้ดูใหญ่ว่าแต่ละคอลัมน์มีอะไรบ้าง และเลื่อนตารางไปท้ายสุด ดูบรรทัดที่ไฮไลท์เป็นสีน้ำเงินไว้ เราจะทดสอบโดยใช้ข้อมูลนี้ ระบบพิกัดของจุดนี้อยู่บนพื้นหลักฐาน “Indian 1975” บน UTM zone 48N ดูคอลัมน์ “Point Group” จะเห็นว่าจุดนี้เป็น “Projected Coordinate System” คือเป็นค่าพิกัดในระบบพิกัดฉากนั่นเอง

Surveyor Pocket Tools_2017-02-22_14-37-18

  • จากนั้นให้คลิกเมาส์กดแล้วลากจุดค่าพิกัดนี้ไปทิ้งที่ช่องป้อนข้อมูล ผมทำสัญลักษณ์ตอนลากให้ดูง่ายๆ ว่ากำลังลากจุดที่มีค่าพิกัด

Surveyor Pocket Tools_2017-02-22_14-43-24.png

  • เมื่อวางแล้วจะได้ค่าพิกัดและระบบพิกัดจะเปลี่ยนแปลงไปให้ตามจุดข้อมูล สังเกตว่าโซนยูทีเอ็มเดิม 47N จะเปลี่ยนไปให้ตามหมุดกลายเป็น 48N

Surveyor Pocket Tools_2017-02-22_14-46-39.png

  • คลิกที่ปุ่มลูกศรเพื่อทำคำนวณสเกลแฟคเตอร์ จะได้ผลลัพธ์

Surveyor Pocket Tools_2017-02-22_14-48-49

  • จบแล้วง่ายไหมครับ ก่อนหน้านี้ผมคำนวณ Elevation Scale Factor คำนวณด้วยมือ ส่วน Grid scale factor ใช้โปรแกรมอื่น ไม่ค่อยสะดวกเท่าไหร่ สุดท้ายก็มาเขียนโปรแกรมใช้เอง ได้ตรงกับใจที่ต้องการ

เบื้องหลังการคำนวณ

  • เบื้องหลังการคำนวณจะเริ่มจากแปลงพิกัดของ “Indian 1975” ไปเป็นค่าพิกัดภูมิศาสตร์บนพื้นฐาน “WGS84” เพื่อเอาค่าพิกัด latitude/longitude ไปดึงเอาค่าความสูงจีออยด์ (N)
  • มาลองย้อนรอยดูครับ ผมจะแปลงพิกัดโดยใช้โปรแกรม “Transform Coordinate” แล้วจากตารางฐานข้อมูลตัวเดิมผมจะลากจุดตัวนี้เข้าโปรแกรม

Surveyor Pocket Tools_2017-02-22_15-12-11.png

  • โปรแกรมจะใส่ค่าพิกัดและจัดระบบพิกัดให้ตรงกับข้อมูล แล้วด้านซ้ายมือตั้งให้เป็นพื้นหลักฐาน WGS84 / UTM zone 48N แล้วคลิกลูกศรชี้ไปด้านซ้ายเพื่อทำการคำนวณจากขวามาซ้าย

Surveyor Pocket Tools_2017-02-22_15-10-19.png

  • จะได้ค่าพิกัด “WGS84” ออกมา latitude = 14.1353282778, longitude = 102.8941568333 และจะเห็นค่าแลตติจูดบน “Indian 1975” latitude = 14.1336620802, longitude = 102.8977353234

 

  • เปิดโปรแกรม “EGM” ทำการคำนวณค่าความสูงจีออยด์ ได้ค่า = -24.3452 m แทนค่าในสูตร h = H + N = 92.274 – 24.345 = 67.929 m  อย่าลืม ความสูงนี้เทียบกับทรงรี WGS84

  • ขั้นตอนต่อไปหาความสูงทรงรีของ “Everest 1830” ของพื้นหลักฐาน “Indian 1975” ด้วยไลบรารี Proj4 สูตรในโปรแกรมคอมพิวเตอร์ก็ประมาณดังที่แสดงไว้ด้านล่าง

x2, y2, z2 = transform(proj1, proj2, x1, y1, z1)
x2, y2, z2 = transform(proj1, proj2,  102.8941568333,  14.1353282778,  67.929)

  • เราต้องการค่าพิกัด x2, y2, z2 จาก Proj1 ไปยัง Proj2 โดยที่ Proj1 = “WGS84 / Geographic” และ Proj2 = “Indian 1975 / Geographic” คำนวณแล้วได้ค่า z2 = 97.891 m ตัวนี้คือความสูงเมื่อเทียบกับทรงรี “Everest 1830”
  • คำนวณหารัศมีทรงรี R – Mean Radius of Curvature จากสูตร เตรียมค่าสำหรับทรงรี “Everest 1830a = 6377276.345, f = 1/300.8017, e² = 2f – f² = 0.00663784663, e’² = e²/(1-e²) = 0.00668220206 แลตติจูด (θ) = 14.1336620802

  • R = 6377276.345 x √(1 – 0.00663784663) / (1 – 0.00663784663 x sin² (14.1336620802)) = 6358592.078
  • Elevation Scale Factor(ESF) = R / (R + h) = 6358592.078 / (6358592.078 + 97.891) = 0.9999846052 ตรงกับที่คำนวณด้วยโปรแกรม “Point Scale Factor” ข้างต้น
  •  คำนวณ GSF ด้วยสูตร ɸ = 14.1336620802, ƛ = 102.8977353234, ƛ0 = 105

  • การคำนวณด้วยมือ ผมใช้เครื่องคิดเลข

T = tan²(14.1336620802) = 0.06340692275
C = 0.00668220206 x cos²(14.1336620802) = 0.00628376769
A = (102.8977353234 – 105) x 3.141592654/180 x cos(14.1336620802) = -0.03558074351
e’² = 0.00668220206
แทนค่า T,C,A,e’2 ในสูตร จะได้ค่า k =  = 1.00023704

  • ดังนั้น Grid Scale Factor (GSF) = 1.00023704 ซึ่งตรงกับที่โปรแกรม “Point Scale Factor” คำนวณมาได้ข้างต้น

คำนวณค่า Combined Scale Factor (CSF)

  • Combined Scale Factor = ESF x GSF = 0.9999846052 x  1.0002370396 = 1.0002216411
  • ลองมาแปลงเป็น ppm (part per million) เพื่อดูว่าระยะทางหนึ่งกม.จะเพี้ยน (distortion) เท่าไหร่ นำตัวเลขมาลบด้วย 1 จะได้ 1.0002216411 – 1 = 0.0002216411 ทำให้เป็นตัวเลขหารด้วยหนึ่งล้าน(คือสิบยกกำลังหก) = 221.64 / 10 = 221.64 ppm
  • แสดงว่าระยะทาง 1 กม. ระยะบนพิกัดฉากจะต่างกับระยะทางจริงๆบนพื้นโลก  221.6 mm.  = 22.1 cm. ซึ่งไม่ถือว่าน้อย ถ้าวัดบนพื้นโลกได้ 1000 m จะวัดระยะทางบนระบบพิกัดฉากได้ 1000.222 m

soffice.bin_2017-02-23_14-55-36

  • ก็ขอจบตอนแค่นี้ ตอนหน้ามาว่าเรื่อง “Line Scale Factor” คำนวณหาค่า CSF แบบเฉลี่ย ที่จะนำไปใช้งานกันจริงๆ

Surveyor Pocket Tools – Update เพิ่มโปรแกรมคำนวณสเกลแฟคเตอร์ (Point Scale Factor) – ตอนที่ 1

  •  โปรแกรมนี้มาตามสัญญาที่ผมเคยว่าไว้ จากบทความที่ผมเคยเขียนเรื่องการคำนวณหาพื้นที่บนระบบพิกัดกริด (grid based area)  แล้วแปลงพื้นที่บนระบบกริดขึ้นมาบนทรงรี (Ellipsoidal area) แล้วจากพื้นที่บนทรงรีทอนขึ้นไปบนผิวโลก (Surfaced area) ถึงจะได้พื้นที่จริงๆ อ่านได้ตามลิ๊งค์นี้ เนื่องจากสูตรที่คำนวณเกี่ยวพันกับวิชา geodesy อยู่ทำให้การคำนวณซับซ้อนขึ้นมาพอประมาณ ผมเลยจัดทำโปรแกรมคำนวณหาสเกลแฟคเตอร์ให้ใช้งานได้สะดวก

ทบทวนเรื่อง Scale Factor

  • รายละเอียดอ่านได้ตามลิ๊งค์ที่ผมเกริ่นไว้ข้างต้น ตอนนี้จะขอรวบรัด เพื่อดูวิธีการใช้งานโปรแกรม
Scale factor
  • เป็นที่ทราบกันดีว่าแผนที่บนระบบพิกัดฉากนั้นจะมีค่า scale factor แต่ละที่ไม่เท่ากัน ค่าเปลี่ยนแปลงแปรผันเป็นระบบ การวัดระยะทางบนแผนที่เมื่อนำไปวางผังบนพื้นที่จริง (setting out) จะต้องมีการหารด้วยสเกลแฟคเตอร์ ในทางกลับกันเมื่อวัดระยะจริงๆบนพื้นโลกจะต้องนำมาคูนกับค่าสเกลแฟคเตอร์เพื่อให้ทอนระยะลงบนระบบพิกัดฉากได้ถูกต้อง ซึ่งสเกลแฟคเตอร์ (scale factor) จะมีอยู่สองอย่างคือ
    1. Elevation Scale Factor (ESF) คือสเกลแฟคเตอร์ที่ใช้ทอนระยะราบบนผิวโลกลงมาเป็นระยะทางบนทรงรี
    2. Grid Scale Factor (GSF) คือสเกลแฟคเตอร์ที่ใช้ทอนระยะทางบนทรงรีลงมาบนระนาบระบบพิกัดฉาก
  • แต่เมื่อนำค่าสเกลแฟคเตอร์  ESF คูนกับ GSF ผลที่ได้เรียกว่า Combined Scale Factor (CSF) ค่านี้เอาไว้ทอนระยะทางรวดเดียวจากระยะราบบนพื้นโลกลงมาเป็นระยะราบบนระบบพิกัดฉาก

ดาวน์โหลดและติดตั้ง

  • ดาวน์โหลดได้จากลิ๊งค์ด้านขวามือ มองหา Surveyor Pocket Tools มีให้เลือก 32 บิตและ 64 บิต และต้อง build 475 ขึ้นไป ขนาดประมาณเกือบ 120 MB ที่ใหญ่เพราะมีไฟล์ข้อมูลสำหรับงานคำนวณความสูงจีออยด์ (Geoid height) ของ EGM2008 ส่วนตัวโปรแกรมและไลบรารีจริงๆแล้วขนาดนิดเดียว สำหรับ 120 MB ไม่ถือว่าใหญ่เนื่องจากความเร็วอินเทอร์เน็ตเกินพอในปัจจุบัน
  • เมื่อได้ไฟล์ zip ก็ unzip แล้วทำการติดตั้งได้แค่ไม่กี่คลิก

วิธีการใช้โปรแกรม

  • เปิดโปรแกรมมาจะเห็น Surveyor Pocket Tools ดังนี้

  • ถ้าผู้อ่านใช้โปรแกรมรุ่นก่อนๆจะเห็นว่าในรุ่นนี้มีโปรแกรมเพิ่มมาสองโปรแกรมคือ Point Scale Factor และ Line Scale Factor ในตอนนี้เราจะว่ากล่าวเฉพาะ Point Scale Factor ก่อน ส่วน Line Scale Factor ยกยอดไปตอนหน้า
  • ทำการรันโปรแกรมด้วยการดับเบิ้ลคลิกที่ไอคอนโปรแกรม จะเห็นโปรแกรม Point Scale Factor ขึ้นมาดังรูปด้านล่าง จะมี 3 ส่วน ส่วนแรกด้านบนเป็นการเลือกระบบพิกัด (Coordinate Reference System) ส่วนตรงกลางเป็นการป้อนค่าพิกัดและค่าระดับของจุดที่ต้องการคำนวณ และส่วนที่สามอยู่ด้านล่างคือผลลัพธ์การคำนวณ

python_2017-02-20_19-01-41

  • มีเครื่องมือเล็กๆเสริมคือเก็บค่าพิกัดเข้าเก็บในฐานข้อมูลโปรแกรมพร้อมเครื่องมือปักหมุดลงบน Google Maps และบน  Google Earth

โครงสร้างและส่วนประกอบ

introducttion_pointscalefactor

สูตรคำนวณ Elevation Scale Factor (ESF)

  • ถ้าเคยใช้โปรแกรมในชุดนี้มาก่อน ผู้อ่านน่าจะคุ้นกับกับเลือกระบบพิกัด ผมไม่ขออธิบายในนี้ ข้ามมาที่การเลือกระบบความสูงอ้างอิง (Vertical Reference) จะมีให้เลือก 2 อย่างคือ
    1. Orthometic Height(H) คือความสูงอ้างอิงกับระดับน้ำทะเล หรือลึกกว่านั้นคืออ้างอิงกับพื้นผิว Geoid นั่นเอง ถ้าผู้ใช้เลือกแบบนี้ โปรแกรมจะแปลงค่าระดับไปยังค่าระดับที่เทียบกับทรงรีคือ Ellipsoidal Height (h) ด้วยการคำนวณหาความสูงจีออยด์ (N – Geoid Height หรือ  Geoid Separation) สูตรก็ง่ายๆคือ h = H + N
    2. Ellipsoidal Height (h) คือความสูงอ้างอิงกับทรงรี แบบนี้ไม่ต้องคำนวณหาอะไรต่อ
  • สูตรการหา Elevation Scale Factor คือ ESF = R / (R+h) R-เป็นรัศมีทรงรีในตำแหน่งที่ต้องการหาสเกลแฟคเตอร์ ส่วน h คือความสูงเทียบกับทรงรี ค่า R นี้โปรแกรมคำนวณหาให้จากค่าพิกัดที่ผู้ใช้ป้อนเข้ามา

soffice.bin_2017-02-21_11-45-39

  • แต่มีประเด็นถ้าต้องการหา ESF บนพื้นหลักฐาน (datum) อื่นที่ไม่ใช่ WGS84 จะทำได้อย่างไร เพราะว่า EGM2008 ค่าพิกัดผูกอยู่กับพื้นหลักฐาน “WGS84” พูดให้ใกล้ก็คือผูกอยู่กับทรงรี “WGS84”  ส่วนพื้นหลักฐาน อื่นเช่น Indian 1975  ที่ใช้ทรงรี “Everest 1830” จะคำนวณหาความสูงบนทรงรีเหล่านี้ได้อย่างไร
  • การคำนวณนี้ไม่มีปัญหาเพราะว่าไลบรารี Proj4 ผ่่านทาง pyproj ที่ผมใช้สนับสนุนการคำนวณการแปลงพิกัด (3D-Transformation) อยู่แล้วจึงสามารถหาความสูงต่างบนทรงรีระหว่างพื้นหลักฐานได้

สูตรคำนวณ Grid Scale Factor (GSF)

  • สำหรับสูตรการหา GSF  จะซับซ้อนขึ้นมานิดหนึ่ง ในสูตรที่โปรแกรมผมใช้คำนวณจะรองรับทุกทรงรี ที่แต่ละระบบพิกัดนั้นๆใช้ แต่ในรุ่นนี้ขอจำกัดแค่เส้นโครงแผนที่ Transverse Mercator (TM) ก่อน สำหรับเส้นโครงแผนที่แต่ละอันก็จะมีสูตรคำนวณแตกต่างกันไป ผมกำลัง implement เส้นโครงแผนที่ Lambert Conical Conformal สักพักใหญ่ๆน่าจะเสร็จ แต่ในทวีปเอเชียเรามีประเทศไหนใช้เส้นโครงแผนที่แบบกรวยบ้าง
  • สำหรับสูตรการหาสเกลแฟคเตอร์จากเส้นโครงแผนที่ TM มีดังนี้

soffice-bin_2016-12-24_09-21-50

soffice-bin_2016-12-26_07-52-18
soffice-bin_2016-12-24_11-09-00

ทดสอบตัวอย่างที่ 1

  • หมุดชื่อ “A102707” อยู่บนพื้นหลักฐาน “WGS84” เส้นโครงแผนที่ UTM โซน 47N มีค่าพิกัด N = 1499662.173, E=683068.285, ค่าระดับ = 0.791 m จากระดับน้ำทะเลปานกลาง (Orthometric Height) ป้อนข้อมูลไปดังรูป เสร็จแล้วคลิกที่ปุ่มลูกศรชี้ลงล่าง เพื่อทำการคำนวณpsf_input1
  • ได้ผลลัพธ์ดังรูปด้านล่าง

Surveyor Pocket Tools_2017-02-22_12-54-24

  • จากผลลัพธ์ได้ค่าความสูงจีออยด์ (Geoid height) = -30.567 m ได้ค่าเป็นลบแสดงว่าพื้นผิวจีออยด์อยู่ใต้พื้นผิวทรงรี คำนวณหาความสูงบนทรงรีจากสูตร h = H + N = 0.791 – 30.567 = -29.776 m ค่าเป็นลบแสดงว่าจุดตรงนั้นอยู่ใต้พื้นผิวทรงรี

เบื้องหลังการคำนวณ

  • ก่อนจะไปต่อ ลองมาดูเบื้องหลังการคำนวณ ย้อนรอยดูกัน อันดับแรกโปรแกรมจะทำการแปลงค่าพิกัดจากระบบพิกัดฉากไปยังระบบพิกัดภูมิศาสตร์ เพื่อคำนวณค่าพิกัด แลตติจูด/ลองจิจูด เรียกโปรแกรม “UTM-Geographic Converter” ป้อนค่าพิกัด Northin/Easting เข้าไปจะได้ค่า latitude = 13.5596652278, longitude = 100.6918290694

Surveyor Pocket Tools_2017-02-22_13-29-43.png

  • เมื่อได้ค่าพิกัดในรูปแบบแลตติจูดและลองจิจูดแล้ว ทำการคำนวณหาค่าความสูงจีออยด์ด้วย “EGM

Surveyor Pocket Tools_2017-02-22_13-09-34

  • ได้ค่า N = -30.567 m มา คำนวณหา h ได้ h = 0.791 – 30.567 = -29.776 m
  • หารัศมีทรงรี (R) ณ ตำแหน่งค่าพิกัดนี้ (ย้อนไปดูสูตรที่เตรียมไว้ให้ดูตอนต้นๆบนทความ) เตรียมค่า latitude(θ) = 13.5596652278 และค่าพารามิเตอร์ทรงรี a=6378137, f = 1/298.257223563, e² = 2f -f² = 0.00669437999, e’²=e²/(1-e²) = 0.00673949674
  • R = 6378137 x √(1 – 0.00669437999) / (1 – 0.00669437999 x sin² (13.5596652278) = 6359092.417 m
  • ESF = R / (R + h) = 6359092.417 / (6359092.417 – 29.776) = 1.000004682 ตรงกับโปรแกรมที่เราคำนวณมาก่อนหน้านี้ ผมใช้เครื่องคิดเลข FX 5800P ตรวจสอบ ซึ่งเครื่องคิดเลขคำนวณความละเอียดได้แค่ระดับ float ไม่ถึง double แต่แค่นี้เพียงพอไปทำมาหากินได้
  • ส่วนการคำนวณ grid scale factor จะลองคำนวณดูตามสูตรด้านบน เตรียมค่า latitude(θ) = 13.5596652278, longitude(ƛ) = 100.6918290694, ƛ0 = 99

T = tan²(13.5596652278) = 0.05816796436
C = 0.00673949674 x cos²(13.5596652278) = 0.0063690236
A = (100.6918290694 – 99) x 3.141592654/180 x cos(13.5596652278) = -0.02870493355
แทนค่า T,C,A,e’² ในสูตร จะได้ค่า k =  = 1.000014582

คำนวณค่า Combined Scale Factor (CSF)

  • Combined Scale Factor = ESF x GSF =  1.000004682 x  1.0000145818 = 1.0000192644
  • ลองมาแปลงเป็น ppm (part per million) เพื่อดูว่าระยะทางหนึ่งกม.จะเพี้ยน (distortion) เท่าไหร่ นำตัวเลขมาลบด้วย 1 จะได้  1.0000192644 – 1 = 0.0000192644 ทำให้เป็นตัวเลขหารด้วยหนึ่งล้าน(คือสิบยกกำลังหก) = 19.2644 / 10 = 19.2644 ppm
  • แสดงว่าระยะทาง 1 กม. ระยะบนพิกัดฉากจะต่างกับระยะทางจริงๆบนพื้นโลก แค่ 19.3 mm. ถึอว่าน้อยมาก ถ้าวัดบนพื้นโลกได้ 1000 m จะวัดระยะทางบนระบบพิกัดฉากได้ 1000.0193 m

soffice.bin_2017-02-23_14-46-45

 

  • พบกันตอนที่ 2 ซึ่งจะลองทดสอบคำนวณดูบนพื้นหลักฐานอื่น ติดตามกันต่อไปครับ

Surveyor Pocket Tools – Update เพิ่มพื้นหลักฐาน Myanmar Datum 2000 (MMD 2000)

  • Surveyor Pocket Tools ก่อนหน้านี้ได้เพิ่มพื้นหลักฐาน (Datum) ของเพื่อนบ้าน AEC ของเราไปแล้วคือ สปป.ลาว (Lao National Datum 1997) กับเวียดนาม (VN-2000) มาตอนนี้มาอัพเดทของเมียนมา (Myanma Dtum 2000) ประเทศเพื่อนบ้านของเรา
  • รู้สึกว่าปี 2000 ที่ผ่านมาเข้าสหัสวรรษใหม่ จะมีระบบพิกัดของบางประเทศที่ประกาศใช้ในปีนั้น เลขสวยและขลัง 🙂 ถึงแม้ในบ้านเราจะพยายามปรับมาใช้พื้นหลักฐาน WGS84 กันมาก แต่เพื่อนบ้านเราก็ยังใช้ระบบพิกัดของประเทศตัวเองอยู่พอสมควร เนื่องจากแผนที่พื้นฐานหรือฐานข้อมูลยังอ้างอิงกับระบบนี้อยู่
  • ผมไปค้นหาระบบพิกัด Myanmar Datum 2000 ในเสิร์ชเอนจิ้น แต่ก็ต้องผิดหวังเพราะไม่มีในสารบบ ผมคิดว่าช่วงเมียนมาร์ ประกาศใช้ช่วงนั้นยังเป็นรัฐบาลทหารหรือกระไร ถึงไม่มีการตอบรับ ดังนั้นหมายเลขพื้นหลักฐาน หมายเลขเส้นโครงแผนที่ UTM จะไม่มีในฐานข้อมูลของ EPSG แม้แต่น้อย
  • Myanmar Datum 2000 จะพารามิเตอร์ในการแปลงพิกัดเพียงสามพารามิเตอร์คือ Translation DX,DY,DZ เท่านั้น

ข้อกำหนดของ Myanmar Datum 2000

  • ใช้ทรงรี Everest 1830 
    • Semi major axis (a) = 6377276.345 m
    • Semi minor axis(b) = 6356075.434 m
    • Flattening = 1 / 300.8017
  • ค่าพารามิเตอร์สำหรับการแปลงพิกัด (Transformation Parameters) จาก MMD2000 ไปยัง WGS84 :
    • DX = 246.632; DY = 784.833; DZ = 276.923
  • ใช้เส้นโครงแผนที่ UTM ซึ่งจะมีสองโซนคือ
    • UTM zone 46N มี CM = 93°; False Easting = 500000; False Northing = 0; K0 = 0.9996
    • UTM zone 47N มี CM = 99°; False Easting = 500000; False Northing = 0; K0 = 0.9996

เพิ่มพื้นหลักฐาน MMD2000 บน Surveyor Pocket Tools

  • สามารถใช้ได้บนโปรแกรมที่ Build 451 ขึ้นไป รูปด้านล่างเป็น “Transform Coordinate” แปลงพิกัดทีละจุด
Surveyor Pocket Tools support “Myanmar Datum 2000”
  • ถ้าต้องการแปลงค่าพิกัดแบบอ่านจากไฟล์ก็ใช้ “File Transform Coordinates” ก็รองรับและใช้ได้
Surveyor Pocket Tools support “Myanmar Datum 2000”
  • Proj.4 string  ที่ใช้สำหรับการแปลงพิกัดที่ส่งไปให้ไลบรารี pyproj เป็นดังนี้

+proj=utm +zone=47 +a=6377276.345 +b=6356075.41314023 +towgs84=246.632,784.833,276.923,0,0,0,0 +units=m +no_defs

  • พบกันตอนใหม่ครับผู้อ่านทุกท่าน

Surveyor Pocket Tools – Update เพิ่มพื้นหลักฐาน VN-2000 (Vietnam)

Vietnam 2000 Datum (VN-2000)

  • ผมมีโอกาสได้จับงานเอกสารงานในกรุงโฮจิมินท์ของเวียดนาม (แต่ยังไม่ได้ไปทำหรอกครับ) ซึ่งในงานนั้นมีงานสำรวจอ้างอิงถึงระบบพิกัดของเวียดนามคือ VN-2000 ที่งานนี้จะต้องใช้อ้างอิงระบบพิกัดนี้ ก็เลยไปค้นหาในอินเตอร์เน็ตก็ได้พบใบประกาศใช้ระบบพิกัดนี้ ของทางราชการของเวียดนามคือ Ministry of Natural Resources and Environment (MONRE) ผมดาวน์โหลดมาแต่กลับไปค้นหาลิ๊งค์ต้นฉบับไม่เจอ ถ้าต้องการดูก็ตามลิ๊งค์นี้ครับ
  • ผมเห็นบทความของของอาจารย์ในมหาวิทยาลัยของเวียดนามท่านนี้ได้พูดถึงระบบพิกัด VN-2000 ของเวียดนามกับ EGM2008 ว่าระบบพิกัดของเวียดนามที่ประกาศใช้ ตามที่ผมได้กล่าวไปแล้วข้างต้นจาก MONRE  นอกจากจะมีการเลื่อน (Translation) แกน DX,DY,DZ แล้วยังมีการหมุน (Rotation) รอบแกน RX,RY,RZ และยังมี scale ด้วย ใช้พารามิเตอร์ครบทั้งเจ็ดตัวในการ Transformation การแปลงพิกัดแบบเจ็ดพารามิเตอร์เพื่อดึงค่าความสูงจีออยด์ (Geoid separation) จาก EGM2008 มาใช้ก็ดูจะยุ่งยาก ผมจับใจความได้ว่า แค่แปลงพิกัด VN-2000 ไป WGS-84 ใช้พารามิเตอร์แค่การเลื่อน DX,DY,DZ สามพารามิเตอร์ก็น่าจะเพียงพอ ผมก็เห็นด้วยเพราะ EGM2008 แบบละเอียดสุดคือ ขนาดกริด 1 min x 1 min ประมาณ 1.8 กม. x 1.8 กม. การแปลงพิกัดใช้สามพารามิเตอร์ได้ค่าพิกัดที่คลาดเคลื่อนบวกลบ สัก 10-20 เมตร คงไม่ใช่ปัญหา
  • แต่ถ้าสำหรับงานรังวัด GNSS เนื่องจากเป็นงาน Precise Surveying ค่าพารามิเตอร์ต้องครบเจ็ดตัว ถึงจะได้ค่าพิกัดที่ละเอียดในระดับมิลลิเมตร

ข้อกำหนดของ VN-2000 Datum

  • ใช้ทรงรี (Ellipsoid) : WGS84
  • หมายเลข EPSG พื้นหลักฐาน VN-2000 : 6756
  • ค่าพารามิเตอร์สำหรับการแปลงพิกัด (Transformation Parameters) จาก VN-2000 ไปยัง WGS84 :
    • Translation Dx = –191.90441429; DY = –39.30318279; DZ = –111.45032835
    • Rotation RX = –0.00928836; RY = 0.01975479; RZ = –0.00427372 (หน่วยมุมสำหรับการหมุนนี้เป็นหน่วยฟิลิปดา (second)
    • สเกล (scale) ต้องระวังนิดหนึ่งเพราะหน่วยเป็น ppm (หนึ่งส่วนต่อหนึ่งล้าน) ถ้าเขียนไว้ว่า k = 1.000000252906278 แสดงว่าเขียนไว้เต็มๆ ไม่ใช่ ppm เขียนใหม่ได้ = 1 + 0.252906278 / 10 สังเกตชุดหลังหารด้วยด้วยหนึ่งล้าน ตัวเลขที่เอาไปป้อนในโปรแกรมแปลงพิกัดคือตัวเลข Δs = 0.252906278 (ppm)
  • ใช้เส้นโครงแผนที่ UTM ซึ่งจะมีสองโซนคือ
    • UTM zone 48N มี CM = 105°; False Easting = 500000; False Northing = 0; K0 = 0.9996 หมายเลขของ EPSG = 3405
    • UTM zone 49N มี CM = 111°; False Easting = 500000; False Northing = 0; K0 = 0.9996 หมายเลขของ EPSG = 3406

เพิ่มพื้นหลักฐาน VN-2000 บน Surveyor Pocket Tools

  • ที่เพิ่มพื้นหลักฐานของ VN-2000 ใช้ได้บนโปรแกรมที่ Build 451 เป็นต้นไป ถ้าผู้อ่านดาวน์โหลดโปรแกรมรุ่นก่อนหน้านี้ก็มาดาวน์โหลดกันใหม่

  • Proj.4 string ที่ผมใช้ในการแปลงพิกัดสำหรับโซน 48N เขียนได้ดังนี้

+proj=utm +zone=48 +ellps=WGS84 +towgs84=-191.90441429,-39.30318279,-111.45032835,-0.00928836,0.01975479,-0.00427372,0.252906278 +units=m +no_defs

  • ตอนนี้โปรแกรมในรุ่นนี้ผมเขียนสถานะการใช้ระบบพิกัดไว้ในไฟล์ xml เล็กๆ เพื่อที่เวลาปิดโปรแกรมไป เวลาเปิดมาใช้งานใหม่จะได้เอาระบบพิกัดที่เคยใช้มาแสดง ไม่ต้องเลือกใหม่ให้เสียเวลา
  • ในส่วน “File Transform Coordinate” ก็อัพเดทเหมือนกัน

  • พบกันตอนหน้าครับ

Surveyor Pocket Tools – เปิดตัวโปรแกรมแปลงไฟล์พิกัดข้ามพื้นหลักฐาน File Transform Coordinates

File Transform Coordinates

  • โปรแกรมแปลงพิกัดข้ามพื้นหลักฐาน Transform Coordinates ที่ผมนำเสนอมาก่อนนั้น แปลงพิกัดได้ทีละจุด อาจจะไม่สะดวกถ้าผู้อ่านมีจุดตั้งแต่ 5-10 จุดขึ้นไป ทางออกผมเลยเขียนโปรแกรมเพิ่มอีกตัวเข้ามา โดยอ่านไฟล์พิกัดที่ต้องการแปลง โดยที่ไฟล์นั้นจะเก็บไว้ในรูปแบบ CSV ที่มีตัวคั่นเป็นเครื่องหมายคอมม่า
  • ขอตั้งชื่อโปรแกรมเป็น File Transform Coordinates โดยใส่คำว่า File นำหน้าชื่อโปรแกรมตัวเดิม เพื่อให้สื่อความหมาย ว่าแปลงพิกัดจากไฟล์

ดาวน์โหลดและติดตั้ง Surveyor Pocket Tools

  • ตอนนี้รุ่นโปรแกรม Surveyor Pocket Tools ที่มีโปรแกรมย่อย File Transform Coordinates มาด้วยนั้น ต้อง build 447 ขึ้นไป ให้ดูด้านขวาที่ช่องดาวน์โหลด (Download) คลิกและก็ดาวน์โหลดมา unzip และทำการติดตั้งได้ง่ายๆ ไม่กี่คลิก
  • เมื่อติดตั้งแล้วจะได้ไอคอน Surveyor Pocket Tools ออกมา เรียกใช้งานก็ดับเบิ้ลคลิกมาได้จะได้ดังรูปด้านล่าง จะสังเกตว่าโปรแกรมในรุ่นนี้มีโปรแกรมย่อยคือ “File Transform Coordinates

โฟลเดอร์ข้อมูลตัวอย่างทดสอบ

  • ก่อนจะไปต่อผมขอเกริ่นถึงโฟลเดอร์สำหรับข้อมูลตัวอย่างที่จะนำมาทดสอบในโปรแกรม ผมทำไอคอน “Example folder” ไว้ดังรูป

  • เมื่อดับเบิ้ลคลิกเข้าไป ข้อมูลนี้เมื่อโปรแกรมถูกติดตั้งแล้วจะไปอยู่โฟลเดอร์ที่ซ่อนของวินโดส์ “C:\Users\ชื่อผู้ใช้\Appdata\Roaming\Surveyor Pocket Tools” และจะเห็นโฟลเดอร์ “example folder” ให้ดับเบิ้ลคลิกเข้าไปจะได้ดังรูปด้านล่าง

วิธีการใช้งานโปรแกรม File Transfer Coordinates ในเบื้องต้น

  • เปิดโปรแกรม  File Transfer Coordinates แล้วจะเห็นหน้าตาโปรแกรมดังรูปด้านล่าง

  • หน้าต่างไดอะล็อกจะประกอบไปด้วยพาเนลด้านซ้ายและพาเนลด้านขวา ด้านซ้ายสำหรับนำไฟล์ข้อมูลเข้า (input) และด้านขวาสำหรับแสดงผลลัพธ์ (output) ที่ได้จากการแปลงพิกัด ผมทำตารางข้อมูลสไตล์ลายม้าลายให้ดูสวยงามและอ่านง่าย ด้านซ้ายจัดเป็นสี navy blue  ด้านขวาสีโทนเขียวๆ
  • แต่ละด้านจะประกอบไปด้วย ช่องเลือกระบบพิกัดเลือกกรุ๊ป (Group) ก่อนว่าเป็นพิกัดบนเส้นโครงแผนที่หรือพิกัดภูมิศาสตร์บนทรงรี จากนั้นจะเลือกพื้นหลักฐาน (Datum) ตามมา และสุดท้ายจะระบบพิกัด (System)
  • ส่วนการอ่านไฟล์ข้อมูลค่าพิกัดที่ต้องการแปลงจากไฟล์ CSV จะอ่านมาก่อน แล้วค่อยมากำหนดว่าคอลัมน์ไหนเป็นค่า Northing/Latitude หรือว่า Easting/Longitude ทีหลัง
  • และรูปแบบของมุม ว่าเป็นดีกรี (Degree) หรือ รูปมุมแยกมีทศนิยมที่ฟิลิปดา (DD MM SS.SSSS) หรือมุมแยกแบบทศนิยมที่ลิปดา (DD MM.MMMM)
  • ล่างสุดเป็นตารางสำหรับแสดงไฟล์นำเข้า CSV

  • ส่วน button มีปุ่มไอคอนเปิดไฟล์ข้อมูล ด้านบนขวามือ มีปุ่มสำหรับคำนวณรูปลูกศรชี้ไปทางขวา และปุ่มไอคอนรูปโลโก้ excel สำหรับ export จัดเก็บผลลัพธ์ออกเป็นไฟล์ในรูปแบบ Microsoft Excel

เปิดไฟล์ข้อมูลตัวอย่างเพื่อทดสอบ

  • สถานที่ของโฟลเดอร์ที่เด็บข้อมูลตามที่ผมเกริ่นไปตอนต้นบทความ ที่โปรแกรม File Transform Coordinates คลิกทีไอคอนรูปโฟลเดอร์ด้านบนขวา จะเห็นไดอะล็อกเลือกไฟล์ ให้เลือกปลายทางมาที่โฟลเดอร์ดังกล่าว

  • เลือกไฟล์ “boundary2-utm47n-indian1975.csv” เมื่อเปิดแล้วจะเห็นไออะล็อก แสดงว่าในไฟล์มีอะไรอยู่บ้างดังรูปด้านล่าง จะเห็น header “Name,Northing,Easting” ซึ่งผมในฐานะคนเขียนโปรแกรม แนะนำว่าการมี Header นั้นมาจะใช้งานโปรแกรมได้สะดวกที่สุด แต่การไม่ใส่ก็ไม่ได้ผิดอะไรครับ แต่ต้องคลิกมากกว่าเดิมเมื่อเปิดไฟล์มาแล้ว

แปลงค่าพิกัดจากพื้นหลักฐาน Indian 1975 ไปยังพื้นหลักฐาน WGS84

  • ค่าพิกัดในไฟล์ชุดนี้เป็นค่าพิกัดฉากในระบบ “UTM Zone 47N” อยู่บนพื้นหลักฐาน “Indian 1975”  ต้องการแปลงไประบบพิกัดฉาก “UTM Zone 47N” ของพื้นหลักฐาน “WGS84

  • ขั้นตอนต่อไปก็มาดูข้อมูลเมื่อเขียนลงตารางม้าลายแล้วจะเป็นอย่างไร ด้านซ้ายจะเขียนลงตารางให้ทั้งหมด ถ้ามี header โปรแกรมจะจัดคอลัมน์ให้ แต่ใน Header อย่างเช่นค่าพิกัด “Y” ต้องมีข้อความแบบนี้ “Northing/North/Latitude” ส่วนตารางด้านขวาจะลอกตารางด้านซ้ายมาทั้งหมด แต่มีคอลัมน์ว่าง ที่จะรอการแปลงพิกัดมาใส่ ดูรูปด้านล่าง

ปรับระบบพิกัดต้นทางและปลายทาง

  • จะเห็นว่าตอนนี้ไฟล์ข้อมูลเป็นค่าพิกัดฉาก UTM ตามที่ผมกล่าวไปแล้ว แต่ในโปรแกรมยังเป็น “Geographic Coordinate System” แบบค่าพิกัดเป็น “Latitude/Longitude” อยู่ ดังนั้นเราจะมาเปลี่ยนระบบพิกัดเป็น
    • Group “Projected Coordinate System
    • System “UTM Zone 47N
    • Datum “Indian 1975

พิมพ์ค้นหาระบบพิกัดสะดวกรวดเร็ว

  • ก่อนหน้านี้เวลาค้นหาพื้นหลักฐาน Datum หรือว่า Projection เช่นพื้นหลักฐาน WGS84 ค่อนข้างจะใช้เวลาเพราะมีตัวย่อยๆเยอะมาก ต้องใช้เมาส์สกรอลล์ สลับกับการใช้คีย์บอร์ดกดตัวหน้าช่วย ตอนนี้ผมปรับปรุงเพิ่มตัวช่วย ขอแค่รู้คำก็ให้พิมพ์ลงไป ที่ด้านล่างตรง Datum ผมพิมพ์คำว่า Indian จะมีพื้นหลักฐานที่เกี่ยวข้องกันมาโผล่สามอย่างคือ “Indian 1960” , “Indian 1954”, “Indian 1975” ให้คลิกเลือกที่ “Indian 1975

  • เลือก Group ซึ่งจะมีแค่สองอย่าง ไม่ต้องพิมพ์ใช้เมาส์คลิกไปที่ “Projected Coordinate System” จากนั้นมาดูที่ System ซึ่ง Indian 1975 จะมี UTM แค่สองโซนคือ 47N กับ 48N ดังนั้นใช้เมาส์คลิกเลือก “Indian 1975 / UTM zone 47N

  • มาดูปลายทางด้นขวาบ้าง จะเปลี่ยนระบบพิกัดเช่นเดียวกัน ดังนี้
    • Group “Projected Coordinate System
    • System “UTM Zone 47N
    • Datum “WGS84
  • ที่ชอง Datum ผมพิมพ์ world จะเห็นมีสามรายการที่เกี่ยวข้องขึ้นมาดังรูป เราเลือก “World Geodetic System 1984

  • จะได้ผลลัพธ์ดังนี้

  • ต่อไปจะเลือกเส้นโครงแผนที่ ที่ช่อง System ผมพิมพ์ 47N จะเห็นมีรายการที่เกี่ยวข้องขึ้นมาสองรายการ รายการแรกที่เราต้องการคือ “WGS84 / UTM zone 47N” ส่วนรายการที่สองเป็นระบบพิกัดของเมียนมา ที่ใช้กับงานขุดเจาะแก๊สในอ่าวเมาะตะมะ ชื่อเต็มๆคือ “Moattama 92 / UTM zone 47N”

  • ต่อไปเลือกคอลัมน์ที่จะให้ผลลัพธ์ไปออกที่ตาราง จะเห็นคอลัมน์ว่างๆมารออยู่ 4 คอลัมน์ ส่วนชื่อเรียกเป็นหมายเลขคือ Col4, Col5, Col6 และ Col7 เรียงกันไป ตัวนี้โปรแกรมเลือกมาให้เป็นค่าปริยายครับ
  • ความหมายคือต้องการให้ค่า Northing ไปเขียนที่  คอลัมน์ที่ 4 (Col4) ต้องการให้ค่า Easting ไปเขียนที่ คอลัมน์ 5 (Col5) เป็นต้น แต่ถ้าผู้ใช้จะสลับก็ได้นะครับ

  • การตั้งรูปแบบมุมไม่มีครับ เพราะต้องการแปลงค่าพิกัดแค่ระบบพิกัดฉากเท่านั้น

คำนวณ Grid Scale Factor & Convergence

  • ผมได้เพิ่มรายการคำนวณ Grid Scale Factor (GSF) & Convergence สูตรคำนวณสองอย่างนี้ไม่มีไลบรารีตัวไหนทำให้ ต้องมาเขียนเอง เปรียบเทียบค่า Grid Scale Factor แล้วกับโปรแกรม Blue marble “Geographic Calculator” และ Trimble “Coordinates Calculator” ค่าใกล้เคียงกันมาก แตกต่างกันที่ทศนิยมที่ 9 
  • แต่กับ Convergence ทำให้ผมแปลกใจเนื่องจาก สองโปรแกรม Geographic Calculator & Coordinates Calculator และที่ผมคำนวณมา  ให้ค่าที่ต่างกันที่ทศยิมที่ 4 ทำไมเป็นอย่างนั้น ทำให้ผมไม่มั่นใจ ทั้งๆที่สูตรมีแค่บรรทัดเดียวเท่านั้น
  • เพิ่มเติมอีกนิดว่า Convergence เป็นมุมต่างระหว่างทิศเหนือจริงกับทิศเหนือในระบบพิกัดฉาก สมัยเมื่อ 20 กว่าปีที่แล้ว ที่ยังไม่มี GPS/GNSS ผมเคยไปรังวัดอะซิมัทภาคทิศจากดาวและดวงอาทิตย์ จำได้ว่าใช้มุม convergence ที่คำนวณด้วยมือสมัยนั้น แล้วเอาค่าอะซิมัทที่รังวัดมาได้มาลบออกด้วยมุม convergence จะได้อะซิมัทบนระบบพิกัดฉาก แล้วสมัยนี้เอาไปใช้อะไรกันบ้าง นึกไม่ออกครับ

คำนวณและแสดงผล

  • ตอนนี้ตั้งค่าทุกอย่างพร้อมแล้วจะทำการคำนวณ ก็คลิกที่ไอคอนรูปลูกศร คำนวณแปลงพิกัดจากซ้ายไปขวา ได้ผลลัพธ์ดังรูปด้านล่าง จะได้ค่าพิกัดฉาก UTM บน WGS84 พร้อมคำนวณ Grid Scale Factor และ Convergence

จัดเก็บไฟล์ผลลัพธ์ในรูปแบบ Excel

  • เมื่อคำนวณแล้ว สิ่งที่ต้องการก็คือไฟล์ที่เก็บข้อมูลค่าพิกัดที่ได้จากการแปลงพิกัดในรูปแบบ Excel ซึ่งเป็นโปรแกรมสามัญประจำเครืองคอม คลิกที่ไอคอนรูป Excel + ลูกศรสีเหลือง โปรแกรมจะแสดงไดอะล็อก เพื่อถามที่จัดเก็บไฟล์ ป้อนชื่อไฟล์
  • มาเปิดดูไฟล์ผลลัพธ์กัน ผมใช้ LibreOffice Calc เพื่อเปิดไฟล์ผลลัพธ์ดังกล่าว  (LibreOffice โปรแกรมเปิดซอร์สเดี๋ยวนี้เก่งกว่าแต่ก่อนมาก)

  • ถ้าก็จัดความกว้างคอลัมน์อีกนิดหน่อย ก็ไจะได้ังรูปด้านบน พร้อมจะนำไปใช้งานอื่นต่อ สองระบบพิกัดผมแยกด้วยโทนสี สไตล์ของตารางเป็นแบบลายม้าลาย ทำให้อ่านง่าย

ตัวอย่างที่ 2

  • จะแปลงพิกัดจากระบบพิกัดฉาก UTM zone 48N ของ Lao National Datum 1997 ไปยังค่าพิกัดภูมิศาสตร์ บน WGS84
  • เปิดไฟล์ข้อมูลอีกครั้งที่โฟลเดอร์ไฟล์ตัวอย่างข้อมูล “example folder” เลือกไฟล์ “coordinates-lao 1997-utm 48n.csv

  • ในไฟล์นี้ผมใส่  header ไว้ด้วย

  • เลือกระบบพิกัดผมพิมพ์คำว่า lao โปรแกรมจะเลือกที่เกี่ยวข้องมาให้ดังรูป จะเห็นมีไอเท็ม “Lao 1993” และ “Lao National Datum 1997” เลือกอย่างหลังครับ

  • เลือกระบบพิกัดให้ได้ตามรูปด้านล่าง และรูปแบบของมุมเลือก DD MM SS.SSSS

  • คลิกที่ไอคอนรูปลูกศรเพื่อทำการคำนวณ จะได้ค่าพิกัดภูมิศาสตร์ บน WGS84

  • จัดเก็บเข้าไฟล์ excel แล้วเปิดดูที่ไฟล์ จะเห็นที่คอลัมน์ “Latitude”, “Longitude” ที่โปรแกรมคำนวณมาให้

  • ฟีเจอร์คำนวณ Scale Factor และ Convergence ได้เพิ่มไปในโปรแกรม Transform Coordinates ที่คำนวณจุดต่อจุด และการพิมพ์เพื่อเลือกระบบพิกัดก็ทำได้เช่นเดียวกัน

  • โปรแกรมในชุดแปลงพิกัดยังมีฟีเจอร์ที่จะปรับปรุงเพิ่มเติมในอนาคตพอสมควร จะเพิ่มเติมพื้นหลักฐานและครอบคลุมเส้นโครงแผนที่ให้มากกว่านี้
  • พบกันตอนต่อไปครับ