Tag: จีออยด์

Update : โปรแกรม Surveyor Pocket Tools คำนวณความสูงจีออยด์ จากไฟล์ค่าพิกัดภูมิศาสตร์

ในกรณีที่ต้องการค่าความสูงจีออยด์จากจุดที่มีจำนวนมากตัวอย่างเช่นเป็นสิบจุดขึ้นไป การมานั่งคำนวณทีละจุดคงไม่ใช่เรื่องที่สะดวกนัก ผมปรับปรุงโปรแกรมให้สามารถอ่านไฟล์ค่าพิกัดภูมิศาสตร์ (ละติจูดและลองจิจูด) ในรูปแบบ CSV ที่ใช้ตัวแบ่งด้วยเครื่องหมายคอมมา “,” ค่าพิกัดละติจูดและลองจิจูด ต้องเป็นรูปแบบทศนิยม (degree) เท่านั้น การจัดเรียงค่าพิกัดของให้ขึ้นต้นด้วยค่าลองจิจูดตามด้วยเครื่องหมายคอมม่าและค่าละติจูด

ไฟล์ทดสอบ

ไฟล์ที่จะมาทดสอบโปรแกรม ผมสร้างจากโค้ดภาษาไพทอน ให้สุ่มจำนวนจุดค่าพิกัดขึ้นมา 10000 จุด โดยให้ค่าพิกัดที่สุ่มอยู่ในกรอบสี่เหลี่ยมนี้คือ ละติจูด เริ่มที่ 3 องศา ไปสุดที่ 22.9833333333333 องศา ค่าลองจิจูดเริ่มที่ 95 องศา ไปสิ้นสุดที่ 107.9833333333 องศา

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

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

Surveyor Pocket Tools V1.03 build 651

เมื่อเปิดโปรแกรมมาแล้ว ลองไปดูว่าไฟล์ทดสอบอยู่ตรงไหน ที่เมนูหลักให้เปิด “Example folder”

เปิดโฟลเดอร์ตัวอย่างไฟล์

จะเป็นการเปิด Windows Explorer คลิกเข้าไปใน “example data” จะเห็นไฟล์ทดสอบชื่อ “tgm2017_test_points.csv” ดังรูปด้านล่าง

ไฟล์ทดสอบ tgm2017_test_points.csv

ผมลองเปิดไฟล์นี้ดูด้วย Notepad ++ เลื่อนไปที่บรรทัดสุดท้าย จะเห็นว่ามีค่าพิกัดสุ่มทั้งหมด 10000 จุด

ไฟล์ทดสอบมีจำนวนจุด 10000 จุด

ทดสอบคำนวณความสูงจีออยด์จากไฟล์แบบลากแล้ววาง

ที่เมนูหลักเปิดทูลส์ “Geoid Height” และเปิด Windows Explorer เพื่อจะลากไฟล์ทดสอบไปวางบนทูลส์ และไม่ลืมในการทดสอบนี้ผมต้องการลอง “TGM2017” ดังนั้นที่ทูลส์อย่าลืมเลือก EGM Model เป็น “TGM2017

ลากไฟล์ทดสอบไปวางบนทูลส์ “Geoid Height”
เปิด EGM Model เป็น “TGM2017” แล้วลากไฟล์ทดสอบมาวาง

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

ไฟล์ผลลัพธ์ชื่อ ” tgm2017_test_points_out.csv

ทดสอบการคำนวณจากการเปิดไฟล์

อีกวิธีถ้าไม่ใช้การลากแล้ววางสามารถคลิกที่ไอคอนของทูลส์ได้เพื่อเปิดไฟล์ทดสอบ

จะเห็นไดอะล็อกดังรูปด้านล่าง

คลิกที่ปุ่ม “Browse…” เพื่อเปิดไฟล์ CSV เปิดไฟล์ทดสอบชื่อ “tgm2017_test_points.csv”

คลิกชื่อไฟล์แล้วคลิกที่ปุ่ม “Open” จะเห็นเนื้อในไฟล์

คลิกที่ปุ่ม “Calculate” เพื่อทำการคำนวณหาความสูงจีออยด์ สุดท้ายทูลส์ “Geoid Height” จะสร้างไฟล์ชื่อ “tgm2017_test_points_out.csv” เมื่อเปิดไฟล์มาดูจะเห็นว่ามีคอลัมน์ ความสูงจีออยด์เพิ่มมาอีกคอลัมน์

ทดสอบกับไฟล์ขนาดใหญ่

สำหรับไลบรารี Proj4 ที่ผมนำมาใช้งานอยู่นี้ การคำนวณหาความสูงจีออยด์หรือจาก Vertical Datum ตัวหนึ่งไปอีก Vertical Datum แบบในอเมริกาที่มี Vertical Datum อยู่หลายตัวหลายรุ่น ไลบรารีนี้จึงถูกพัฒนาเพื่อให้คำนวณในเรื่องนี้ โดยเฉพาะการคำนวณจากไฟล์ไลดาร์ (Point cloud) ที่มีขนาดใหญ่ หลายสิบล้านจุด จากความสูงทรงรีมาเป็น Orthometric height (หรือระดับน้ำทะเลปานกลางในประเทศไทยเรา) ผมลองทดสอบกับไฟล์ขนาดที่มีจำนวนจุด หนึ่งแสนจุด, หนึ่งล้านจุดและสิบล้านจุดตามลำดับ และผมจับเวลาไว้ (เครื่องผม CPU Xeon E-2176M) ไฟล์ทดสอบนี้ผมสร้างจากไฟล์สุ่มเช่นเดียวกัน

จำนวนจุดเวลาประมวลผล (วินาที)
100,0001
1,000,0006
10,000,00084

จะเห็นว่าเวลาประมวลผล สิบล้านจุด ใช้เวลา 1 นาที 24 วินาที ผมดูว่าใช้เวลามากไปนิด ทั้งที่ก่อนหน้านี้ สิบล้านจุด ใช้เวลาสิบนาทีกว่าๆ ผมต้องกลับมาออปติไมซ์โค้ดอีกครั้งจนได้เวลาหนึ่งนาทีกว่าๆ อย่างที่เห็น ถ้าจะเอาเร็วกว่านี้คงต้องใช้ภาษา C/C++ แล้วครับ

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

Update : โปรแกรม Surveyor Pocket Tools คำนวณความสูงจีออยด์ TGM2017

Update : โปรแกรม Surveyor Pocket Tools คำนวณความสูงจีออยด์ TGM2017

มาตามสัญญาที่ผมบอกว่าจะอัพเดท Surveyor Pocket Tools โปรแกรมช่างสำรวจฉบับกระเป๋า ให้สามารถใช้งานคำนวณความสูงจีออยด์ TGM2017 (Thailand Precise Geoid Model 2017) ดั้งเดิมสามารถคำนวณบนโมเดล EGM96 และ EGM2008 เพียงเท่านั้น

เปลี่ยนวีธีการคำนวณโดยใช้ไลบรารี Proj4

ดั้งเดิมตอนคำนวณหาความสูงจีออยด์บน EGM96 และ EGM2008 ผมพัฒนาโค้ดโปรแกรมมาจากการดัดแปลงของโค้ดดั้งเดิมภาษาซีของผู้พัฒนาท่านอื่นมาเป็นภาษาไพทอน ขณะนี้ได้ยกเลิกโค้ดชุดนี้หันมาใช้ไลบรารี Proj4 คำนวณให้ทั้งหมดเพราะสะดวกมาก และไลบรารี Proj4 สามารถจัดการเมมโมรีได้ดีกว่าของผมมาก สังเกตก่อนหน้านี้ถ้าใครเข้าไปดูใน Task Manager ของวินโดส์อาจจะตกใจที่โปรแกรม Surveyor Pocket Tools ของผมเขมือบเมมโมรีมหาศาล เพราะผมใช้วิธีอ่านไฟล์ของโมเดล EGM96 และ EGM2008 มาเก็บไว้ในเมมโมรีตอนเปิดโปรแกรม ถ้าใครใช้เครื่องคอมเก่าๆ อาจจะรำคาญตอนเปิดโปรแกรมเพราะรอนานมาก ขณะนี้ปัญหาเหล่านั้นได้หมดไป

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

ตอนนี้ผมได้ปรับมาเป็นรุ่น 1.02 build 632 ก็ไปดาวน์โหลดกันได้ที่ลิ๊งค์นี้ มีทั้งสองเวอร์ชั่นให้เลือกคือ Windows 32 บิตและ Windows 64 บิต

Surveyor Pocket Tools V1.02 build 632

ตอนคำนวณความสูงจีออยด์ ไลบรารี Proj4 จะเปิดไฟล์โมเดลมาอ่านคำนวณหาความสูงจีออยด์ ซึ่งทำได้รวดเร็วมาก และโปรแกรม Surveyor Pocket Tools ในปัจจุบันก็กินเมมโมรีลงน้อยมาก ขณะเปิดโปรแกรมมายังไม่ได้คำนวณอะไรกินเมมโมรีประมาณ 95 MB ตอนคำนวณความสูงจีออยด์กินไปประมาณ 250 MB ก็ไม่มากมาย

โมเดล EGM96, EGM2008 และ TGM2017 ถ้าสังเกตุตอนติดตั้งโปรแกรมจะเห็นชื่อไฟล์คือ egm96_15.gtx, egm08_25.gtx และ tgm2017.gtx ไฟล์หลังสุดนี้ผมดัดแปลงจากไฟล์แอสกี้ของกรมแผนที่ทหารเป็นรูปแบบมาตรฐานของ NOAA ที่ไลบรารีต้องการ

ไฟล์โมเดลของจีออยด์หลังจากติดตั้งโปรแกรม

คำนวณความสูงจีออยด์

คลิกที่โปรแกรมย่อย “Geoid Height” จะเห็นไดอะล็อกหน้าตาดังรูปด้านล่าง เลือก “EGM Model” เป็น TGM2017

Geoid Model “TGM2017”

ป้อนค่า latitude, longitude ไปดังรูป คลิกลูกศรเพื่อทำการคำนวณจะได้ความสูงจีออยด์

ทดสอบคำนวณความสูงจีออยด์จุดที่ 1

ลองปักหมุด Google Maps ดู

ปักหมุดบน Google Maps

มาทดสอบจุดที่ 2 กันต่อ ป้อน latitude, longitude เข้าไปดังนี้

ทดสอบคำนวณจุดที่ 2

สิ่งที่จะพัฒนาต่อไป

ตอนนี้คำนวณแบบแมนวลจุดต่อจุด อนาคตผมจะให้สามารถเปิดไฟล์มาคำนวณได้เพื่อความสะดวก ส่วนโปรแกรมย่อยอื่นที่ใช้คำนวณหาความสูงจีออยด์เช่น Point Scale Factor, Line Scale Factor ยังใช้จีออยด์ EGM2008 เป็นค่าปริยาย ผมจะออกแบบพัฒนาโปรแกรมให้ผู้ใช้สามารถเลือกโมเดลจีออยด์ได้ ติดตามกันต่อไปครับ

ทดสอบคำนวณหาความสูงจีออยด์ TGM2017 ด้วยไลบรารี Proj.4

ทดสอบคำนวณหาความสูงจีออยด์ TGM2017 ด้วยไลบรารี Proj.4

ไม่นานมานี้มีผมดาวน์โหลดไฟล์โปรแกรมและข้อมูลของ TGM2017 เรียกเต็มๆคือ Thailand Geoid Model 2017 ที่เป็นโครงการร่วมมือจากหลายๆฝ่ายของทางราชการ ผมยังไม่มีโอกาสได้นำไปใช้งาน โดยเฉพาะจะนำมาประยุกต์ใช้ในงานรังวัด GNSS ถือว่าเป็นสิ่งที่พวกเรารอคอยมานานที่จะได้มี local geoid model มาใช้งานกัน

โดยเฉพาะงานรังวัด GNSS เมื่อคำนวณแล้วจะได้ค่าพิกัดทางราบ และทางดิ่งจะได้ความสูง (h – Ellipsoid height) ที่เทียบกับทรงรี WGS84 ถ้าเรามีแบบจำลองความสูงจีออยด์สามารถคำนวณหาความสูง (H – Orthometric height) หรือระดับน้ำทะเลปานกลางได้ จากสูตร h = H + N โดยที่ไม่ต้องมีการเดินระดับไปหาจุดที่รังวัด GNSS แต่อย่างใด โดยที่โปรแกรมคำนวณหาค่าความสูงจีออยด์ (N – Geoid Height หรือ Geoid Separation) ที่ผมจะมาลองเขียนโปรแกรมเล็กๆเพื่อหาค่า N นี้ด้วยภาษาไพทอนในลำดับต่อไป

ในตอนนี้ผมจะใช้ไลบรารี Proj.4 เรียกไลบรารีในเวอร์ชั่นภาษาไพทอนนี้ว่า PyProj ตัวไลบรารี Proj.4 เองก็เพิ่งสนับสนุนการคำนวณ Vertical Datum ไปไม่นานนี้เอง สมมติว่าถ้าไม่ได้ใช้ไลบรารีตัวนี้เป็นตัวช่วยคงเป็นงานหนักหนาสาหัสเหมือนกัน

แปลงรูปแบบไฟล์ของแบบจำลองความสูงจีออยด์ TGM2017

ไฟล์แบบจำลองความสูงจีออยด์ TGM2017 ที่ผมดาวน์โหลดได้มานั้นเป็นแอสกี้ (Text file) ขนาดประมาณ 10.7 MB และมีโปรแกรมคำนวณมาด้วยชื่อไฟล์ execute คือ “TGM2017.EXE” สำหรับไฟล์แอสกี้ในคู่มือแสดงรายละเอียดดังนี้

  • ค่าละติจูด (Latitude) เริ่มต้น : 3 องศา
  • ค่าลองจิจูด (Longitude) เริ่มต้น : 95 องศา
  • ความละเอียดเชิงพื้นที่ : 1 ลิปดา
  • จานวนหลัก (Column) : 780 หลัก
  • จานวนแถว (Row) : 1200 แถว
TGM2017 layout

สำหรับไลบรารี PyProj นั้นถ้าต้องการคำนวณ Vertical Datum ต้องการไฟล์ในรูปแบบ gtx ที่กำหนดมาตรฐานโดย NOAA เพื่อให้การใช้งานมีประสิทธิภาพมาก ทางนี้แนะนำให้ใช้ไฟล์ไบนารีเพื่อประหยัดเมมโมรี สำหรับรูปแบบไฟล์ gtx นั้นไม่มีอะไรมาก กำหนดให้มีไฟล์ header เพื่อบอกจุดเริ่มต้นขอบเขตการใช้งาน ระยะห่างของละติจูดและลองจิจูดของแต่ละจุดในแนวตั้งและแนวนอน จำนวนแถวและจำนวนคอลัมน์ ที่เหลือจะเป็นความสูงจีออยด์ในแต่ละจุดมีขนาดเท่ากับ จำนวณแถวคูณจำนวนคอลัมน์ ตัวหัวไฟล์ผมสามารถเขียนได้ดังนี้

3.0 95.0 0.01666666666 0.01666666666 1200 780

อธิบาย : ละติจูดของมุมล่างซ้าย ลองจิจูดของมุมล่างซ้าย ระยะห่างของจุดในแนวละติจูด ระยะห่างของจุดในแนวลองจิจูด จำนวนแถว จำนวนคอลัมน์

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

ตัวอย่างโปรแกรมไพทอนสำหรับแปลงไฟล์แบบจำลองความสูงจีออยด์

ผมเขียนสคริปต์ภาษาไพทอน เผื่อมีใครสนใจ ผมตึ้งชื่อไฟล์ว่า “rtsd2gtx.py” โปรแกรมมีขนาดเล็กมากๆ ไม่กี่บรรทัด หลักการคืออ่านไฟล์แอสกี้ “tgm2017.asc” มาแล้วเขียนไฟล์ไบนารีในรูปแบบ gtx ข้อควรระวังคือไฟล์ไบนารี ต้องเป็นแบบ Big Endian ในโมดูล struct ผมจึงใส่เครื่องหมาย “>” ไปด้วย

ตัวอย่างเขียนขนิดข้อมูลเป็น double ใช้คำสั่ง f.write(struct.pack(“>d”, 3.0))
เขียนข้อมูลเป็น integer ใช้คำสั่ง f.write(struct.pack(“>i”, 1200))

<import struct
def readRTSDAsciiFile():
    geoid = []
    with open('tgm2017.asc', 'r') as f:
        geoid = [[float(n) for n in line.split()] for line in f] #2D list, one list contain one row.
    #TGM2017 was organized already from lowest row (min latitude) to highest row (max latitude).
    #No need to reverse.	
    return geoid

def writeGTXBinaryFile(geoid):
    with open('tgm2017.gtx', 'wb') as f:
        # pack with ">" for big endian.
		# write Header of file
        f.write(struct.pack(">d", 3.0))  #lower left Latitude
        f.write(struct.pack(">d", 95.0)) #lower left Longtitude		
        f.write(struct.pack(">d", 1.0/60.0)) #delta Latitude = 1 second
        f.write(struct.pack(">d", 1.0/60.0)) #delta Longitude = 1 second	
        f.write(struct.pack(">i", 1200)) #number of rows
        f.write(struct.pack(">i", 780))	#number of columns
		# write height values.
        for row in geoid:
            for c in row:
                f.write(struct.pack(">f", c))

# main program	
g = readRTSDAsciiFile()
writeGTXBinaryFile(g)

ณ ตอนนี้ผมสร้างโฟลเดอร์ เอาไฟล์ tgm2017.asc มาวางไว้ และมีโปรแกรมสคริปต์ “rtsd2gtx.py” อยู่ในโฟลเดอร์เดียวกัน

โฟลเดอร์ที่เก็บไฟล์

จากนั้นทำการรันโปรแกรมด้วยคำสั่งที่คอมมานด์ไลน์ python rtsd2gtx.py รอแป๊ปหนึ่งไฟล์ gtx ที่เก็บแบบจำลองความสูงจีออยด์จะถูกสร้าง และมีขนาดเล็กลงจากไฟล์แอสกี้ดั้งเดิมประมาณ 3 เท่า

ไฟล์ tgm2017.gtx ขนาดประมาณ 3.57 MB

ตัวอย่างโปรแกรมไพทอนสำหรับคำนวณหาความสูงจีออยด์

ต่อไปโปรแกรมไพทอนที่จะนำมาทดสอบคำนวณหาความสูงจีออยด์ ผมตั้งชื่อง่ายๆว่า “test.py” ถ้าจะลองรันโปรแกรมนี้เพื่อทดสอบต้องติดตั้งไลบรารี pyproj ให้เรียบร้อยก่อน

โค้ดโปรแกรมเริ่มต้นจากสร้าง projection ต้นทาง (ตัวแปร wgs84 egm) โดยที่กำหนด +geoidgrids=tgm2017.gtx และสร้าง projection ปลายทาง (ตัวแปร wgs84) โดยที่เว้นไม่ใส่แบบจำลองความสูงจีออยด์

import pyproj # Import the pyproj module
# Define source coordinate system with TGM2017.
wgs84egm = pyproj.Proj("+init=EPSG:4326 +geoidgrids=tgm2017.gtx") 
# Define target coordinate system without geoid model.
wgs84 = pyproj.Proj("+init=EPSG:4326")

lat, lon = 18.3353398540, 99.371215293000
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("1) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 7.75906518100, 98.303594340000
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("2) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 9.18558870000, 99.843706600000
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("3) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 6.96243169, 99.77398865
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("4) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 7.20852844, 99.72353542
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("5) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 7.35631365, 100.12797020
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("6) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 7.23806984, 100.55255020
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("7) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 7.09316728, 100.56368280
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("8) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 6.99643503, 100.43034140
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("9) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

lat, lon = 13.0+42.0/60+38.64/3600, 100+29.0/60+13.02/3600
x, y, z = pyproj.transform(wgs84egm, wgs84, lon, lat, 0.0)
print("10) Latitude = %.8f, Longitude = %.8f, Geoid Height = %.5f" % (y, x, z))

เมื่อจัดเก็บไฟล์เรียบร้อย ในตอนนี้ ถ้าดูที่โฟล์เดอร์จะเห็นไฟล์ดังนี้

จุดทดสอบ

ถ้าดูในโค้ดจะเห็นจุดทดสอบทั้งหมด 10 จุด โดยที่ 9 จุดแรกผมนำมาจากไฟล์ INPUT.DAT ที่ติดมากับโปรแกรม TGM2017.EXE ถ้าเปิดดูด้วย Notepad จะเห็นดังนี้

จุดทดสอบ

ส่วนจุดที่ 10 ได้มาจากสไลด์ ชื่อ BM11SP Latitude = 13° 42′ 38.64″ N Longitude = 100° 29′ 13.02″E

คำนวณ

จากนั้นทำการรันโปรแกรมบนคอมมานด์ไลน์ ใช้้คำสั่ง python test.py จะได้ผลลัพธ์ดังนี้

คำนวณหาความสูงจีออยด์

ผมนำผลลัพธ์มาเปรียบเทียบกับที่คำนวณด้วย TGM2017.EXE พบว่ามีความต่างกันเล็กน้อยที่หลักมิลลิเมตร สาเหตุน่าจะเกิดตอน interpolation โดยการนำจุดรอบๆจากแบบจำลองความสูงจีออยด์ ซึ่งโปรแกรมอาจจะเลือกใช้แบบ BiCubic หรือ BiLinear ผมไม่แน่ใจว่า Proj.4 ใช้แบบไหน ตอนนี้ยังไม่มีโอกาสไปดูโค้ดต้นฉบับ

เปรียบเทียบผลลัพธ์การคำนวณ

การพัฒนาโปรแกรมสำหรับการใช้งานในอนาคต

ผมวางแผนว่าจะนำแบบจำลองความสูงจีออยด์ TGM2017 ไปคำนวณในโปรแกรมรวมเครื่องมือฉบับกระเปาสำหรับช่างสำรวจ Surveyor Pocket Tools ได้แก่การคำนวณความสูงจีออยด์ การคำนวณหาสเกลแฟคเตอร์

สรุป

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

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 8 โปรแกรมคำนวณสเกลแฟคเตอร์ (Scale Factor)

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 8 โปรแกรมคำนวณสเกลแฟคเตอร์ (Scale Factor)

โปรแกรมคำนวณสเกลแฟคเตอร์ (Scale Factor) สำหรับเครื่องคิดเลข Casio fx-9860 G

ช่วงนี้อยู่ในชุดซีรี่ย์โปรแกรมเครื่องคิดเลข Casio fx-9860G  ต่อไปขอนำเสนอโปรแกรมคำนวณสเกลแฟคเตอร์ (Scale Factor) ตัวโปรแกรมพัฒนาด้วยภาษาซี  ใช้เป็นโปรแกรม AddIn ดังรูปด้านล่าง

ปัญหาการคำนวณสเกลแฟคเตอร์

สเกลแฟคเตอร์ในที่นี้ผมจะขอหมายถึง Elevation Scale Factor (ESF), Grid Scale Factor (GSF) ตลอดจน Combined Scale Factor (CSF) สามารถอ่านได้จาก blog ก่อนหน้านี้ของผมได้ที่ใช้โปรแกรม Surveyor Pocket Tools มาช่วยคำนวณ ผู้อ่านอาจจะเคยสังเกตว่าจะไม่เคยเห็นโปรแกรมคำนวณสเกลแฟคเตอร์ในเครื่องคิดเลขเท่าใดนัก ในกรณีนี้คือพวกเราใช้ค่าระดับที่อิงระดับน้ำทะเลปานกลาง (แทนด้วยสัญลักษณ์ตัว “H“) กันเป็นหลัก น้ำทะเลปานกลางนี้สามารถใช้พื้นผิวจีออยด์ (Geoid) แทนได้ แต่การคำนวณหา Elevation Scale Factor เราจะต้องทราบค่าระดับที่อ้างอิงกับ Ellipsoid (แทนด้วยสัญลักษณ์ตัว “h“) ไม่ใช่เทียบกับระดับน้ำทะเลปานกลาง ความต่างระหว่างพื้นผิวจีออยด์และพื้นผิวทรงรี เราเรียกว่า Geoid Separation (แทนด้วยสัญลักษณ์ตัว “N“) ความสัมพันธ์ระหว่างสามสิ่งนี้คือ h = H + N

การหา Geoid Separation (N) จะต้องใช้ Earth Gravity Model ซึ่งก่อนหน้านี้ใช้ EGM96 ปัจจุบันใช้ EGM2008 ที่มีความละเอียดถูกต้องมากกว่า ซึ่งโมเดลต่างๆเหล่านี้จะเป็นไฟล์ที่มีขนาดค่อนข้างใหญ่จนใหญ่มาก ทำให้ไม่สามารถนำมาใช้กับเครื่องคิดเลขในระดับนี้ได้ และถ้าเขียนโปรแกรมด้วย Casio Basic ก็คงหมดสิทธิ์ครับเพราะไม่มีคำสั่งในการอ่านเขียนไฟล์

ปัญหาและทางออก

ผมพยายามใช้โค้ดภาษาซีในการอ่านไฟล์โมเดล EGM96  ด้วย egm96-f477.c โปรแกรมสามารถคอมไพล์และบิวท์ผ่าน แต่ตอนประมวลผลอ่านไฟล์ เนื่องจากต้องใช้เมโมรีเครื่องคิดเลขมาอ่านไฟล์เข้าไปเก็บในหน่วยความจำพบว่า เมโมรีไม่พอ พยายาม optimize ด้วยตัวเองหลายๆทางแต่ไม่สำเร็จ จนมาพบโดยบังเอิญในเว็ปไซต์ ตามลิ๊งค์นี้ จุดประสงค์ทางผู้พัฒนาไลบรานี้เพื่อเขียนแอพลงบนโทรศัพท์มือถือแอนดรอยด์ วิธีการคือเขาได้ Normalize ค่า geoid separation จาก EGM2008 ขนาดเต็มลงมาเหลือขนาดแถวคอลัมน์ 181 x 91 ความถูกต้องจะถูกลดทอนลง ผมสนใจเลยเอามาคอมไพล์บน Casio SDK พบว่าทำงานได้ ใช้เมโมรีเครื่องคิดเลขที่มีอยู่เพียงพอ แต่ก็จวนเจียนจะใช้หมดเหมือนกัน เอาละความคิดที่เคยจะเขียนโปรแกรมคำนวณสเกลแฟคเตอร์บเครื่องคิดเลขก็มาเป็นจริง อาจจะได้ค่าสเกลแฟคเตอร์ที่ไม่ละเอียดเท่าคำนวณจากคอมพิวเตอร์แต่ในระดับทศนิยมหกตำแหน่ง ถือว่าได้ครับ

เครดิตผู้พัฒนาไลบรารี Geoid

ต้องขอบคุณผู้พัฒนาคือ Stefan Röttger (stefan@stereofx.org) มา ณ ที่นี้ ติดตามผลงานได้ที่เว็บไซต์ http://www.open-terrain.org/index.php ไลบรานี้ใช้สัญญาอนุญาตแบบ New BSD License

เตือนสติเรื่องสเกลแฟคเตอร์

ผมชอบวาทะของอ.ดีบุญ เมธากุลชาติ ก็ขออนุญาตเอาจากสไลด์มาแสดง ณ ที่นี้ด้วย อ.ดีบุญเรียก Grid Scale Factor ว่าตัวประกอบมาตราส่วน ส่วน Elevation Scale Factor เรียกว่าตัวประกอบความสูง ได้ใจความครบถ้วนดีครับ และก็เตือนสติคนใช้แผนที่ดังนี้

Grid Scale Factor เมื่อคูณกับ Elevation Scale Factor จะได้ Combined Scale Factor ตัวประกอบตัวนี้คือตัวสำคัญที่จะนำไปคูนกับระยะทางที่วัดบนพื้นผิวโลกเพื่อทอนลงมาบนระนาบราบของแผนที่ (Grid Distance)

ใช้ไลบรารีแปลงพิกัด MGRS

เนื่องจากโปรแกรมนี้ต้องแปลงค่าพิกัดจากระบบพิกัดฉาก  UTM  บนดาตั้ม WGS84 ไปยังค่าพิกัดภูมิศาสตร์ เพื่อส่งไปให้ฟังก์ชั่นคำนวณหาค่าสเกลแฟคเตอร์ที่ต้องการทราบค่าละติจูด ดังนั้นผมใช้ไลบรารี mrgs พัฒนาโดย Howard Butler ไลบรานี้ใช้สัญญาอนุญาตแบบ MIT License

สิ่งที่โปรแกรมต้องการ

โปรแกรมสามารถคำนวณได้ 2 แบบคือแบบ Point Scale Factor คือแบบจุดเดี่ยวๆ สามารถคำนวณมาใช้แทนพื้นที่เล็กๆประมาณ 1 กม. x 1 กม. ได้ดี และรูปแบบที่ 2 คือ Line Scale Factor ใช้สำหรับพื้นที่ที่ใหญ่ขึ้นมา ใช้ค่าพิกัด 2 จุดหัวและท้าย โปรแกรมจะต้องการทราบค่าดังนี้

  1. เลือกโซนของยูทีเอ็ม (UTM  Zone) ตั้งแต่โซน 1 ถึง 60 และเลือกซีกโลก (Hemisphere)  เลือกได้สองอย่างคือเหนือหรือใต้เส้นศูนย์สูตร
  2. ค่าพิกัดและค่าระดับของจุดที่ต้องการทราบค่าสเกลแฟคเตอร์ ต้องการค่าพิกัดเหนือใต้ในระบบยูทีเอ็มและค่าระดับที่อ้างอิงเหนือระดับน้ำทะเลปานกลาง (Orthometric Height above Meas sea level)

ในการคำนวณตัวประกอบความสูง (Elevation Scale Factor) โปรแกรมจะนำค่าความสูงเหนือระดับน้ำทะเลปานกลางมาคำนวณเป็นค่าระดับความสูงเทียบกับระดับทรงรี (Ellipsoid Height) ที่เราไม่สามารถนำค่าระดับความสูงเหนือระดับน้ำทะเลปานกลางมาใช้คำนวณเพราะว่า ตัวอย่างเข่นในประเทศไทย ค่าระดับน้ำทะเลปานกลางจะอยู่ใต้ทรงรีประมาณ 6-42 เมตร ถ้านำไปคำนวณจะได้ค่าตัวประกอบความสูงที่ไม่ถูกต้อง

ดาวน์โหลดโปรแกรม

ไปที่หน้าดาวน์โหลด Download มองหาโปรแกรม Scale Factor สำหรับเครื่องคิดเลข Casio fx-9860 G II SD ดาวน์โหลดไฟล์โปรแกรมชื่อ SFACTOR.G1A ติดตั้งลงเครื่องคิดเลข

เริ่มต้นใช้งาน

เมื่อเมนูหลัก (Main Menu) เมื่อเลื่อนลูกศรมาที่ไอคอนโปรแกรมกดคีย์ “EXE” จะเข้ามาในโปรแกรมดังรูปด้านล่าง จะเห็นเมนูด้านล่างเรียงรายกันไป ได้แก่

Sett- Setting (ตั้งค่าโซนยูทีเอ็มและเลือกซีกโลก)

PSF – Point Scale Factor ( คำนวณหาค่าสเกลแฟคเตอร์ของจุดเดี่ยว

LSF – Line Scale Factor (คำนวณหาค่าสเกลแฟคเตอร์เฉลี่ยจากจุดสองจุด)

Info – Information (แสดงไลบรารีที่ผมใช้งานอยู่ ให้เครดิตแก่พัฒนา)

Exit – Exit Program (ออกจากโปรแกรม)

ตั้งค่ายูทีเอ็ม (UTM Settings)

ทีเมนูหลักกดคีย์ F1 – Sett จะเห็นหน้าตาจอภาพเครื่องคิดเลขดังนี้

เนื่องจากโปรแกรมบนเครื่องคิดเลขมีข้อจำกัดมากๆ ผมไม่สามารถใส่ระบบพิกัดได้มากเหมือน Surveyor Pocket Tools จึงจำกัดแค่ datum “WGS84” เท่านั้น สำหรับประเทศไทยก็เลือกโซนได้สองโซนคือ 47 และ 48 ตัวอย่างที่จะแสดงต่อไปเลือกเป็นโซน 47 ส่วนซีกโลก (Hemisphere) เลือกเป็น “North” กดคีย์ F6 – OK

 

คำนวณ Point Scale Factor

ตัวอย่างที่คำนวณต่อไปจะยกมาจากตัวอย่างที่แสดงในบล็อกของ Surveyor Pocket Tools เพื่อเปรียบ

เทียบผลลัพธ์กันได้ กลับมาที่เมนูหลักกดคีย์ F1-Sett ป้อนค่าพิกัด N=1499662.173, E=683068.285, H=0.791 

เสร็จแล้วกดคีย์ F1 – Calc เพื่อคำนวณสเกลแฟคเตอร์ของจุดนี้

ผลลัพธ์จะแสดงออกมาดังรูปด้านล่าง โปรแกรมจะแสดงค่าพิกัดและค่าระดับมาให้ จากนั้นแสดงค่าละติจูดและลองจิจูด แสดงความสูงเทียบกับทรงรี = -29.598 m กดคีย์ F2-PgDn เพื่อเลื่อนไปดูหน้าต่อไป

จะเห็นค่า Geoid Separation หรือ Geoid Height = -30.389 m และได้ค่า Elevation Scale Factor = 1.00000465, Grid Scale Factor = 1.00001458 สุดท้ายค่า Combine Scale Factor = 1.00001924 ลองเทียบกับค่าที่คำนวณด้วย Surveyor Pocket Tools ดังนี้

ค่า Combined Scale Factor  = 1.0000192644 ต่างกันที่ทศนิยมแปด ผมถือว่าใช้ได้เพราะเราใช้แค่ทศนิยมที่หกก็เพียงพอแล้ว ความต่างที่แตกต่างจากที่ผมเคยบอกไปแล้วคือมาจากค่า Ellipsoid height ที่คำนวณจากโปรแกรมเครื่องคิดเลขได้ -29.598 เมตร ส่วนค่าความสูงทรงรีที่ได้จาก Surveyor Pocket Tools ได้ค่า -29.776 เมตร ต่างกันประมาณ 20 ซม.

คำนวณหาค่า Line Scale Factor

จะแสดงไดอะแกรมของการคำนวณค่าสเกลแฟคเตอร์เฉลี่ยดังรูปด้านล่าง

ที่โปรแกรมเครื่องคิดเลขกลับมาที่เมนูหลัก

กดคีย์ F3-LSF จะเห็นหน้าตาโปรแกรมดังรูปด้านล่าง ป้อนค่าพิกัดจุดที่ 1 และกดคีย์ F2-Next เพื่อไปป้อนจุดที่ 2

พร้อมแล้วกดคีย์ F1-Calc ต่อไปจะได้ผลลัพธ์ดังนี้ เลื่อนลงไปดูหน้าต่อไปก็กดคีย์ F2-PgDn

สรุปแล้วจะได้ค่าเฉลี่ย Combined Scale Factor = 1.00082320

เปรียบเทียบกับค่าที่ได้จาก Surveyor Pocket Tools เท่ากับ 1.0008232302 เช่นเคยค่าต่างกันที่ทศนิยมแปด สามารถนำไปใช้งานได้

จัดเก็บข้อมูลและเรียกมาใช้ภายหลัง

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

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

จากนั้นนำ SDCard มาเสียบบนเครื่องคิดเลขอีกครั้ง เมื่อนำไปใช้งานได้สักพักถ้าเอามาเปิดอีกครั้งจะเห็นไฟล์หลายๆไฟล์ มีนามสกุลเป็น “CFG”  หมายถึง config ตัวอย่างถ้าใช้โปรแกรมคำนวณหาสเกลแฟคเตอร์นี้ไฟล์ที่จัดเก็บข้อมุลคือ “SFACTOR.CFG

เครดิตไลบรารี

ที่เมนูหลักกดคีย์ F5-Info จะเห็นเครดิตดังรูปด้านล่าง

โปรแกรมนี้มีขนาดใหญ่กว่าโปรแกรมอื่นๆก่อนเกือบสองเท่าเพราะว่าใช้ไลบรารีอื่นๆสามไลบรารีด้วยกัน ก็ติดตามชุดโปรแกรมเครื่องคิดเลข Casio fx-9860 G กันต่อไปครับ

Surveyor Pocket Tools โปรแกรมรวมเครื่องมือฉบับกระเป๋าสำหรับช่างสำรวจ (แจกฟรี) – ตอนที่ 4 (ตอนจบ)

  • ผ่านไปแล้วสามโปรแกรมย่อยๆ นี่คือโปรแกรมที่สี่ โปรแกรม  EGM คำนวณหาค่า Geoid Separation ไม่ใช่โปรแกรมสุดท้ายนะครับ เพราะ Surveyor Pocket Tools จะเพิ่มโปรแกรมพื้นฐานสำหรับช่างสำรวจต่อไปเรื่อยๆ

intro-surveyor-pokcet-tools

  • โปรแกรมนี้ผมเคยเขียนมาแล้วชุดใหญ่ใช้ชื่อว่า Geoid Height Pro  ลองดูด้านขวามือตรง Download เป็นโปรแกรมที่มีกราฟฟิคให้ดูด้วยเมื่อป้อนค่าพิกัด Latitude/Longitude เข้าไปสามารถโหลดไฟล์ CSV มาคำนวณได้ สนใจชุดใหญ่ก็โปรแกรม Geoid Height Pro ครับ ถ้าชุดเล็กๆแบบพกไปในกระเป๋าติดตามต่อไป

geoidheight_2016-11-17_19-27-51

ทำไมต้องคำนวณ Geoid Separation

  • เนื่องจาก GPS ที่เราใช้งานในปัจจุบัน ระบบพิกัดผูกอยู่กับพื้นหลักฐาน World Geodetic System 1984 ใช้ทรงรี WGS84 สำหรับค่าพิกัดแลตติจูดและลองจิจูดแล้วไม่มีปัญหาครับ ปัญหาคือค่าระดับในแนวดิ่ง ที่อ้างอิงกับทรงรีเรียกความสูงนี้ว่า Ellipsoidal Height(h) แต่ความสูงที่นำมาใช้งานด้านแผนที่รวมทั้งงานก่อสร้างสาธารณูปโภคทั้งหลาย กลับอ้างอิงกับระดับน้ำทะเลปานกลาง Mean Sea Level (MSL) ที่เราคุ้นเคยกันดี แล้วความสูงสองระบบนี่มันเกี่ยวข้องกันอย่างไร
  • ความสูงเทียบกับระดับน้ำทะเลปานกลางหรือที่เรียกกันอย่างหนึ่งว่า Orthometric Height (H) ความสูงตัวนี้กลับไปอ้างอิงกับรูปทรงจีออยด์ ที่ถือกันว่าเป็นรูปทรงทางคณิตศาสตร์ของโลกตามแรงดึงดูด รูปทรงประมาณแล้วเป็นผิวที่ทับกันสนิทกับผิวเฉลี่ยของมหาสมุทรหรือระดับน้ำทะเลปานกลางนั่นเอง ระหว่างทรงรีกับรูปทรงจีออยด์ ทั่วทั้งโลกนี้มีความสูงต่างกันไม่เกิน ±100 เมตรเท่านั้นเอง
  • ความสัมพันธ์ความสูงสองระบบนี้ก็ง่ายๆครับ H = h – N โดยที่ N คือค่า Geoid Height หรือ Geoid Separation  นั่นเอง โปรแกรมนี้คือโปรแกรมที่เขียนขึ้นมาเพื่อคำนวณหาค่า N โดยเฉพาะ
  • ดังนั้นเมื่อเรารู้พิกัดแล็ตติจูดลองจิจูด เราสามารถคำนวณหา N ได้เอาไปลบจาก Ellipsoidal Height (h) ก็จะกลายเป็นความสูงเทียบกับระดับน้ำทะเลปานกลางที่เราสามารถนำมาใช้ได้

geoid2_lg
ภาพจาก esri.com

โมเดลที่ใช้ในการคำนวณ

  • มีสองโมเดล ตามอายุที่ออกมาใช้ครับ EGM96 ออกในปี 1996 ง่ายๆเขาแบ่งตามขนาดกริด 30’x30′ ประมาณ 55 กม.  x 55 กม. จะมีหนึ่งค่าเมื่อขยับไปกริดช่องต่อไปค่า N ก็จะเปลี่ยน โมเดลจะเก็บไว้ในไฟล์ เวลาติดตั้งโปรแกรมจะไปด้วย เมื่อผู้ใช้ป้อนค่าพิกัดโปรแกรมจะไปอ่านไฟล์ดึงค่ามาคำนวณค่า N ให้
  • โมเดลที่สองคือ EGM2008 ออกมาในปี 2008 รุ่นนี้แบ่งเป็นสองขนาดย่อยละเอียดสุดคือช่องกริดแบ่งไว้ประมาณ 1′ x 1′ หรือประมาณ 1.8 กม. x 1.8 กม. ขนาดที่สองละเอียดน้อยลงมานิดหนึ่งใช่ช่องกริดขนาด 2.5′ x 2.5′ หรือประมาณ 4.6 กม. x 4.6 กม. โปรแกรมนี้ใช้กริดขนาด 2.5′ x 2.5′ ครับ  เวลาติดตั้งจะขนไฟล์ขนาดมากกว่า 100 MB ที่เก็บกริดนี้ไปด้วย ทำให้ดูเหมือนโปรแกรมใหญ่โต แต่ที่โตเพราะข้อมูลนี้ครับ
  • ถ้าใช้โมเดลแบบละเอียด 1’x1′ จะต้องใช้ไฟล์ข้อมูลเกือบกิกะไบต์เลย ผมเลยไม่ได้เขียนในส่วนนี้ ความละเอียดเท่าที่ทดสอบดูจากโปรแกรมอื่นๆ ค่าแทบไม่แตกต่างกันเลย แตกต่างกันน้อยมาก บางจุดน้อยกว่าเศษของมิลลิเมตร

ความถูกต้อง

  • ไม่มีอะไรสมบูรณ์พูนผลไปทั้งหมด โมเดล EGM96 กับ EGM2008 ก็เหมือนกัน งานรังวัด GPS แบบ Static หรือ Fast Static ที่ให้ค่าละเอียดระดับมิลลิเมตร ดีทั้ง x, y, z เมื่ออ้างอิงกับทรงรี (ย้ำทรงรี) การจะได้ค่าระดับเทียบกับระดับน้ำทะเลปานกลาง จะเรียกใช้โมเดล EGM96 หรือล่าสุดกว่าก็ EGM2008 เพื่อแปลงค่าความสูงจาก Ellipsoidal Height เป็น Orthometric Height แต่เนื่องจากโมเดลไม่ได้สมบูรณ์ ดังนั้นค่าระดับที่ได้เทียบเท่างานระดับชั้นสาม แต่ไม่ยืนยัน ส่วนใหญ่งานก่อสร้างที่มีค่าระดับ Grade มาเกี่ยวข้อง จึงต้องเดินระดับแบบแยกมาต่างหากจากงานรังวัด GPS ครับยกตัวอย่างเช่นงานสร้างทางรถไฟ งานสร้างถนนสายหลัก
  • ประสบการณ์ที่ผ่านมา งานรังวัด GPS ค่าระดับเมื่อแปลงเป็นระดับน้ำทะลปานกลางแล้ว พอใช้ได้ครับ ไม่เคยเจอตรงไหนที่เพี้ยนจนรับไม่ได้ งานที่ไม่ได้กังวลเรื่องค่าระดับมากนักจะนำค่าระดับที่แปลงค่ามาแล้วใช้งานได้เลย

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

  • มาดูวิธีการใช้ คลิกที่โปรแกรม EGM ตามรูป

spt_egm_01
โปรแกรม EGM

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

spt_egm_02

  • ลองป้อนจุดดังนี้ ชื่อ “GPS-KBM” Latitude = 14.6109419444 Longitude= 98.0315881139 รูปแบบมุมเป็น degree คลิกที่ไอคอนลูกศรเพืือคำนวณได้ค่า -38.9148 m. บนโมเดล EGM2008

surveyor-pocket-tools_2016-11-18_13-34-28

  • ลองเปลี่ยนโมเดลเป็น EGM96

surveyor-pocket-tools_2016-11-18_13-35-42

  • มาลองจุดอื่นๆดูบ้างครับ ชื่อ “Caia” latitude= 17d 49′ 55.917″S longitude= 35d 20′ 10.706″E ป้อนแล้วคำนวณดู จากนั้นทำการเก็บค่าพิกัดด้วยการคลิกไอคอนรูปหมุดที่มีเครื่องหมายบวกสีแดง แล้วก็ลองปักหมุดที่ google maps เป็นขั้นตอนสุดท้าย

spt_egm_04

  • ปักหมุดแล้ว

firefox_2016-11-18_14-36-56

  • ก็ขอจบตอนสุดท้ายเพียงเท่านี้ครับ

 

แนะนำโปรแกรมคำนวณความสูงจีออยด์ (Geoid Height Pro) บน EGM96 และ EGM2008 (แจกให้ใช้ฟรี)

เปลี่ยนชื่อโปรแกรม

  • สำหรับโปรแกรม Geoid Height Pro ชื่อเดิมคือ Geoid Height Calculator เนื่องจากชื่อเดิมไปพ้องกับโปรแกรมทางฝั่งอเมริกา เกรงจะมีปัญหาด้านลิขสิทธิ์ ก็ขอเปลี่ยนชื่อตามนี้ครับ

ทำไมต้องคำนวณความสูงจีออยด์

  • เป็นที่ทราบกันว่าความสูงเมื่อวัดด้วย GPS จะเป็นความสูงที่อยู่บนทรงรีของ WGS84 เรียกว่า Ellipsoidal Height แต่ในชีวิตจริงของคนเราความสูงที่เราต้องการคือความสูงที่เทียบกับระดับน้ำทะเลปานกลาง (Mean Sea Level)  โดยเฉลี่ยแล้วพื้นผิวจีออยด์จะทับกันสนิทได้กับระดับน้ำทะเลปานกลาง ดังนั้นถ้าทราบความสูงจีออยด์ในตำแหน่งนั้น เราก็สามารถคำนวณหาความสูงจาก GPS เทียบกับระดับน้ำทะเลปานกลางได้ และความสูงเมื่อเทียบกับระดับน้ำทะเลปานกลาง เรียกอีกอย่างได้ว่า Orthometric Height

geoid2_lg

geoid undulation

Geoid Height Pro

  • ตั้งแต่ปี 2008 รูปทรงของสนามแรงดึงดูดของโลก (Earth Gravitational Model)  เรียกชื่อว่า EGM2008 ได้ถูกเปิดตัวโดย NGA  (National Geospatial Intelligence Agency) และก็ได้ปรับปรุงมาหลายรุ่นแล้ว ปัจจุบัน นำมาใช้งานแทนที่ EGM96 กันมากแล้ว ผมใช้เวลาว่างๆ เขียนโปรแกรมมาคำนวณความสูงจีออยด์ จากที่เขียนเล่นๆในตอนแรก หลังๆมาเพิ่มนู่นนิดเพิ่มนี่หน่อย ก็กลายมาอย่างที่เห็น

geoid height calculator

ส่วนประกอบของโปรแกรม

  • ถ้าติดตั้งโปรแกรมจะเห็นโฟลเดอร์ย่อยชื่อ geoids จะมีไฟล์ “corrcoef” และ “egm96” สองไฟล์นี้เป็นไฟล์ ascii สำหรับคำนวณความสูงจีออยด์บนโมเดล EGM96 ส่วนอีกไฟล์ที่ขนาดใหญ่ประมาณ 150 MB เป็นไฟล์ไบนารี ชื่อไฟล์ “Und_min2.5×2.5_egm2008_WGS84_TideFree_reformatted” สำหรับคำนวณความสูงจีออยด์บน EGM2008 ในที่นี้จะขอเน้นเฉพาะ EGM2008
  • ไฟล์ “Und_min2.5×2.5_egm2008_WGS84_TideFree_reformatted” ไม่ใช่ไฟล์ต้นฉบับ แต่เป็นไฟล์ที่ถูกรีฟอร์แม็ต เปลี่ยนรูปใหม่สำหรับโปรแกรมเปิดโค๊ด Geotrans ในไฟล์นี้บรรจุความสูงจีออยด์ทุกๆที่ของโลกนี้ ลักษณะไฟล์เป็นกริด แต่ละกริดมีขนาด 2.5’x2.5′ หรือประมาณ 4.5 กม. x 4.5 กม.
  • ถ้าใช้โปรแกรมจำพวก Hex editor มาเปิดปรับโหมดเป็น Big Endian ปรับให้ดูเป็นเลขฐานสิบจะเห็น ตัวเลข 4321 (ไบต์ที่ 5-8) และตัวเลข 8640 (ไบต์ที่ 9-12) ตัวเลขนี้แสดงขนาดของกริด= 4321×8640 จำนวนคอลัมน์(แกน x หรือตามแกนของ longitude) คือ 8640 จำนวนแถว (แกน y หรือตามแกนของ latitude) คือ 4321und_geoid_file_hex
  • ปรับโปรแกรมให้ดูเป็นเลขฐาน 16 ถัดไปไบต์ที่ 13-20 ขนาด 8 ไบต์เป็นขนาด double แสดงระยะห่างระหว่างจุดของกริดในแนวแกน x อ่านมาได้ 3fa55555 55555555 แปลงเป็นตัวเลขได้ 0.04166666666 หน่วยเป็นองศา คูณด้วย 60 เข้าไปเป็น ลิปดาก็ได้ 2.5′ (ตรงกับที่ระบุไว้ตั้งแต่แรกว่าขนาดของแต่ละกริด 2.5’x2.5′)und_geoid_file_hex_griddist
  • ถัดไปไบต์ที่ 21-28 เป็นระยะห่างระหว่างจุดของกริดในแนวแกน y ซึ่งก็เท่ากัน
  • ต่อไปทุกๆ 4 ไบต์จะเป็นตัวเลขลักษณะเป็น float แสดงความสูงของจีออยด์ลักษณะเป็นจุดๆ จนครบทั้งหมด 4321×8640 จุด

und_geoid_file_hex_float

  • โปรแกรมของผมก็จะอ่านไฟล์นี้ในลักษณะนี้มาทั้งหมดมาเก็บเป็น array เรียกว่า Cahce All ซึ่งโปรแกรมจะกินเมมโมรีพอสมควรประมาณ 500 MB ซึ่งเครื่องพีซีหรือโน๊ตบุ๊คสมัยปัจจุบัน คงไม่ใช่เรื่องเหลือบ่ากว่าแรง

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

  • โปรแกรมเขียนด้วย FPC/Lazarus ทำไฟล์ติดตั้งด้วย Inno Setup ดาวน์โหลดโปรแกรมได้ที่ “ดาวน์โหลด (Download)” ด้านขวามีทั้ง 32 บิตและ 64 บิต
  • ทำการติดตั้ง ผมทดสอบติดตั้งบนวินโดส์ 7/8 รันแล้วไม่มีปัญหา เมื่อเปิดโปรแกรมจะเห็นหน้าตาแรกเข้าดังรูปด้านล่าง ลักษณะ user inteface ก็เน้นเรียบง่าย มีอยู่หน้าเดียว เลือกโมเดลได้ว่าจะใช้ EGM96 หรือ EGM2008 2.5’x2.5′ ถัดไปจะเป็นช่องให้ป้อนพิกัด Latitude/Longitude ในระบบพิกัด WGS84 ถ้ามีความสูงที่ได้จาก GPS หรือรังวัดจาก GPS ก็ป้อนที่ Ellipsoidal Height ได้
  • เมื่อป้อน latitude/longitude แล้วก็คลิก “Compute” โปรแกรมจะคำนวณนำไปเขียนให้ที่ช่าง Geoid Height หรือถ้าป้อนความสูง Ellipsoidal Heigtht  มาด้วยโปรแกรมจะทำการคำนวณ Orthometric Height มาให้ด้วย

geoidheight-first

  • ถัดลงมาด้านซ้ายเป็นตารางกริด จะถูกใช้เมื่อเปิดไฟล์ที่เก็บค่า Latitude/Longitude หลายๆจุด ในกรณีที่ต้องการคำนวณเยอะๆ ส่วนด้านขวาที่ประกอบด้วยแผนที่โลกอย่างง่ายๆ มีเส้น Latitude/Longitude ในแนวตั้งแนวนอน ทุกๆ 45 องศา ส่วนที่เป็นสีๆเป็นสเปคตรัม ได้จากการอ่านไฟล์ที่ผมกล่าวไปแล้วแล้วนำความสูงจีออยด์มาแมพกับสี โดยที่ด้านสีน้ำเงินเข้มแทนความสูงจีออยด์ -107 เมตร จะไปถึงโทนสีแดงเข้มแทนความสูงจีออยด์ที่มากสุด 87 เมตร
  • ด้านล่างเขียนสเกลมีตัวเลขกำกับให้ดูง่ายด้วย ใต้แผนที่โลกจีออยด์จะมีทูลส์บาร์เล็กๆ สำหรับการซูมเข้าออก การเลื่อนแผนที่ให้ใช้งานได้สะดวกด้วย
  • การเลื่อนเมาส์ โปรแกรมจะทำการคำนวณค่าความสุงจีออยด์ให้แบบเรียลไทม์ แสดงค่าพิกัดและความสูงจีออยด์ที่ status bar ด้านล่างด้านขวา

วิธีใช้งาน

  • มุม latitude/longitude สามารถป้อนได้สามแบบ แบบแรกเป็นดีกรีเช่น 12.2325215 แบบที่สองทศนิยมที่ลิปดาเช่น 12 35.25322 และแบบสุดท้ายคือแบบแยก 12 40 21.4512 ใส่เครื่องหมายลบได้กรณี latitude อยู่ต่ำกว่าเส้นศูนย์สูตร
  • ช่วงของ latitude ที่คำนวณได้อยู่ในช่วง -90…90 ส่วน longitude ป้อนค่าได้ตั้งแต่ -180..180
  • มาทดสอบกันเลย ผมลองป้อนค่าเข้าดังรูปด้านล่าง คลิกคำนวณจะได้ผลลัพธ์และ เขียนกากบาทให้ที่แผนที่โลกด้วย ตรงตำแหน่งพิกัดที่ป้อนไป ลองซูมแผนที่โลกมาดู

geoidheight-manualinput

การคำนวณผ่านไฟล์ coordinates

  • เมื่อติดตั้งโปรแกรมแล้วจะมีโฟลเดอร์ย่อยชื่อ “data” ผมจะเก็บไฟล์ coordinates ของ latitude/longitude เอาไว้ทดสอบ ไฟล์เหล่านี้สามารถเป็นตัวคั่นด้วยคอมมาได้ (csv) หรือกั้นด้วยช่องว่างได้ คลิกที่ทุลส์บาร์ด้านเปิด ทำการเปิดไฟล์ชื่อ NE2000.csv มีจุด coordinates ทั้งหมด 2000 จุด ได้จาก randomsample_data
  • ต่อไปโปรแกรมจะถามรูปแบบ ไฟล์นี้เก็บค่า lattitude/longitude เท่านั้น เลือกแบบ “N E” จากนั้นคลิก import

seelct_format

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

geoidheight-openneทดสอบกับไฟล์ 3000 จุด แบบมีความสูง

  • ลองเปิดไฟล์ PNEZ3000.csv ไฟล์นี้มีความสูง Ellipsoidal Height ติดมาด้วย แต่เหมือนเดิมคือค่าความสูงได้จากการ random

format_pnez

  • ทำการคำนวณ เนื่องจากไฟล์นี้มีความสูง Ellipsoidal Height มาด้วยโปรแกรมจะคำนวณหา Orthometric Height มาให้ด้วยเช่นกัน geoidheight-pnez
  • ถ้าต้องการเซฟไฟล์ที่คำนวณแล้วสามารถคลิกที่ทูลส์บาร์ด้านบนรูปดิสเก็ตได้

ที่มาไฟล์ทดสอบ

  • ไฟล์ทดสอบชื่อ GeoidHeights.dat (credits Charles F. F. Karney ผู้พัฒนา GeographicLib) ผมดาวน์โหลดมาเป็นไว้อ้างอิง ไม่เปิดไฟล์นี้มาคำนวณนะครับ ในไฟล์ประกอบด้วยค่าพิกัด latitude/longitude ความสูงจีออยด์บน EGM84 EGM96 EGM2008 ตามลำดับ จำนวนจุดทั้งหมด 500, 000 จุด ค่าพิกัดได้จากการ random ผมนำไฟล์นี้มาตัดแบ่งเพื่อนำมาคำนวณด้วยโปรแกรมของผม เพื่อทดสอบว่าค่าความสุงจีออยด์ที่คำนวณมาได้ตรงกันไหม ค่าที่ได้จะแตกต่างกันระดับเศษของมิลลิเมตร

geoidheights-testdata

การคำนวณ Interpolation และเครดิต

  • ใช้แบบ Bi cubic interpolation ส่วนในแผนที่ในโปรแกรมเวลาผู้ใช้ลากเมาส์ ความสูงจีออยด์ที่คำนวณแบบเรียลไทม์ ใช้แบบ Bi linear interpolation
  • ก็ขอยกเครดิตให้กับโปรแกรมเปิดโค๊ด Geotrans ผมศึกษาและเรียบเรียงการคำนวณ EGM2008 จากโค๊ดภาษา c/c++ ได้ ที่นี่
  • ยกเครดิตคำนวณความสูงจีออยด์บน EGM96 ผมศึกษาและเรียบเรียงจากโค๊ดภาษา c ได้ ที่นี่ (credits ineiev) ซึ่งเจ้าของโค๊ดเขาเรียบเรียงจากภาษาฟอร์แทรนของ NGA แต่สำหรับผมก็ไปศึกษาฟอร์แทรนจากโค๊ดของ NGA เหมือนกันแต่ไม่สำเร็จ ทั้งๆตอนปี 2 อยู่มหาวิทยาลัยก็ร่ำเรียนภาษานี้จากเครื่องเมนเฟรมมาเหมือนกัน ผ่านไปหลายสิบปี กลายเป็นคนแปลกหน้า

ทิ้งท้าย

  • เนื่องจากโปรแกรมยังเป็นรุ่นแรกๆ คาดว่าบั๊กคงจะมีพอสมควร การ zoom in หรือ zoom out ใช้เวลา 4-5 วินาที โปรแกรมใช้เวลาในการเขียนแผนที่โลก ที่ใช้เวลามาก เนื่องจากไม่ได้ใช้เอนจิ้นแผนที่่ใดๆมาช่วยเลย เขียนบน canvas แบบดิบๆ
  • ก็ขอฝากโปรแกรม Geoid Height Pro ประดับวงการสำรวจไว้อีกโปรแกรมหนึ่งครับ