Geoid Height Calculator v1.05 สำหรับ Mac OS X

Geoid Height Calculator v1.05 รุ่นสำหรับแมคโอเอส

  • คล้อยหลังที่ปล่อยรุ่นสำหรับวินโดส์ไปแล้ว ผมมานั่งคอมไพล์โปรแกรมสำหรับ Mac ซึ่งก็แก้ไขโค๊ดไปบ้าง แต่ไม่ได้หนักหนาอะไร ทำ installer ด้วย dmgCreator  ฟรี ข้อเสียในรุ่นแมคเทียบกับวินโดส์ก็คือ ขนาดเมื่อบีบอัดแล้วยังปาไปถึง 218 MB ส่วนรุ่นวินโดส์ประมาณ 95 MB เอง

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

  • ดาวน์โหลดโปรแกรมได้ที่ GeoidHeightV105.dmg แล้วดับเบิ้ลคลิกแมคจะทำการเมาท์อิมเมจมาให้จากนั้นลาก icon โปรแกรมเข้าโฟลเดอร์ Applications เป็นอันเสร็จ โปรแกรมไม่มีเรียกใช้เฟรมเวิร์ค  (Framework) ใดๆทั้งสิ้นครับ ดังนั้นผมคิดว่านำไปติดตั้งเครื่องไหนน่าจะรันได้ไม่มีปัญหา

geoidheight_mac_01

ลองใช้งาน

  • ติดตั้งแล้วโปรแกรมจะอยู่ที่ Applications พร้อมใช้งาน

myapplications

  • ลองรันดู หน้าตาก็เหมือนรุ่นบนวินโดส์

geoidheight_mac_02

  • ป้อนค่าพิกัดแลตติจูด ลองจิจูดแล้วคลิกคำนวณ (Compute)

geoidheight_mac_03

  • ข้อมูลไฟล์ทดสอบ ผมใส่ไฟล์ข้อมูลตัวอย่าง  bundle ไปในโปรแกรมด้วยวิธีเปิดใช้ Finder ไปที่ Applications หาไอคอนโปรแกรม แล้วคลิกขวาเลือก “Show Package Contents”  คลิกไปที่ Contents/Resources/data จากนั้น copy ไฟล์ไปไว้ที่ใช้งานได้สะดวก

geoidheight_mac_05

  • ลองเปิดไฟล์ดูแล้วรัน

geoidheight_mac_06

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

geoidheight_mac_07

Categories: 3D, GIS, GPS, Lazarus, Programming, Surveying ป้ายกำกับ:, , , , , , , , ,

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

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

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

geoid2_lg

geoid undulation

Geoid Height Calculator

  • ตั้งแต่ปี 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 ดาวน์โหลดโปรแกรมแบบ 64 บิตได้ที่ GeoidHeightV105Setup64.zip และดาวน์โหลดโปรแกรมแบบ 32 บิตได้ที่ GeoidHeightV105Setup32.zip
  • ทำการติดตั้ง ผมทดสอบติดตั้งบนวินโดส์ 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 Calculator ประดับวงการสำรวจไว้อีกโปรแกรมหนึ่งครับ

เขียนโปรแกรมเปลี่ยนภาษาบนวินโดส์ด้วย AutoIT

Grave Accent (`) ผิดตรงไหน

  • ผมเชื่อว่าคนใช้วินโดส์ส่วนใหญ่เวลาตั้งปุ่มภาษา จะใช้คีย์ Grave Accent (`) แทนที่จะเป็น Alt + Shift หรือ Ctrl + Shift สำหรับผมแล้วเนื่องจากใช้แมคด้วย จึงคุ้นเคยกับการใช้คีย์ Alt + Space จนติดเป็นนิสัย เวลาใช้ลีนุกซ์ จึงตั้งคีย์เปลี่ยนภาษาเป็น Alt + Space ตามแมค ซึ่งในลีนุกซ์การตั้งค่าก็ไม่ใช่เรื่องยากเย็น การใช้ Grave Accent ผมว่าก็ไม่ได้ผิดตรงไหน แล้วแต่ความคุ้นเคย
  • แต่ในวินโดส์การตั้งคีย์ Alt + Space กลับเป็นเรื่องใหญ่เพราะ OS ไม่สนับสนุนคีย์นี้ แต่ในวินโดส์แปด กลับสามารถใช้คีย์ Win + Space ได้ แต่ไม่ถนัดเท่าเพราะ Alt + Space เวลากดใช้หัวแม่มือซ้ายกด Alt หัวแม่มือขวากด Space จะสะดวกมากกว่า ผมเคยค้นหาในอินเทอร์เน็ต  ดาวน์โหลดมาใช้งาน เมื่อล้างลงวินโดส์ใหม่ โปรแกรมหาย ไปค้นหาอีกครั้งไม่เจอแล้ว

AutoIt Script Language

  • ในที่สุดมาเจอโปรแกรมที่เป็นภาษาสคริปต์ ชื่อ AutoIT ไปดาวน์โหลดมาใช้ได้ฟรี ขนาดไม่ใหญ่ ใช้เวลาอ่านคู่มือประมาณครึ่งชั่วโมง ผมดาวน์โหลดโปรแกรมสคริปต์เปลี่ยนคีย์บอร์ดจากไหนจำไม่ได้แล้ว แล้วมาทำการแก้ไข จากโค๊ดด้านล่างไม่กี่บรรทัด ฟังก์ชั่น HotKeySet เมื่อผู้ใช้กด Alt และ Space พร้อมกันให้เรียกฟังก์ชั่น Change แล้วทำการแปลงคีย์เป็น Alt + Shift
;^ = Ctrl
;! = Alt
;# = WinKey (Meta)
;+ = Shift</code>

HotKeySet("!{Space}", "change") ;Registers Alt + Space

;Main loop
While 1
  Sleep(100)
WEnd

;At Input language settings on windows
;Please select Alt + Shift
;Changes Keyboard Layout

Func change()
  Send ("{ALTDOWN}") ;Hold down Alt
  Sleep(50) ;Wait 100 milliseconds
  Send("{LSHIFT}{ALTUP}") ;Press Left-Shift and release Alt
EndFunc

ตั้งคีย์บนวินโดส์ก่อน

  • ผมตั้งค่าการเปลี่ยนคีย์เป็น Alt + Shift ด้านซ้าย เราจะให้โปรแกรมสคริปย์ดักจับ Alt + Space เมื่อผู้ใช้กดแล้วเปลี่ยนเป็นคีย์ Alt + Shift ส่งต่อให้วินโดส์

switch_win

ติดตั้ง AutoIt และใช้งาน

  • ในชุดของ AutoIt จะมี SciTe Script Editor เปิดมาแล้วลอกโค๊ดด้านบนใส่

scite

  • ที่จริงสามารถรันโค๊ดได้จากเมนู Tools ถ้า build จะได้ไฟล์ exe ออกมา แต่จะไม่มีไอคอน การยัดไอคอนเข้าไปใน execute file ให้ใช้ Auto2Exe ที่มาด้วยกัน ผมเตรียมไฟล์ไอคอนด้วย เป็นรูปธงชาติไทย คลิก Convert จะได้โปรแกรม exe ที่มีไอคอนมาเรียบร้อย

auto2exe

พร้อมใช้งาน

  • ถ้าเป็นวินโดส์ 7 ทำการ copy โปรแกรมไฟล์ exe มาวางที่ “C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup” เมื่อวินโดส์บู๊ตมาอีกรอบก็พร้อมใช้งานครับ

notifications

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

  • ไม่อยากโปรแกรม สามารถดาวน์โหลดไปใช้งานได้ iSwitcher2.zip (4shared.com) หรือ iSwitcher2.zip (Hightail.com)

Traverse Pro รุ่นใหม่ version 2.50 (มาตามสัญญา)

 นานเหลือเกินที่จากกันไกล

  • หยุดไปนานจนทิ้งบล็อกให้ร้าง เนื่องจากภารกิจการงานในปัจจุบันยุ่งเหยิงเหลือเกิน ที่ผ่านมาไม่นานนี้พอมีเวลาว่าง จึงเอาโปรแกรม Traverse Pro ที่ทิ้งโครงการไว้เสียนานมาปัดฝุ่นต่อ ให้สามารถนำมาติดตั้งบนวินโดส์ 7 หรือ 8 ได้ ปรับปรุงหน้าตา user interface ให้ดูดีขึ้น แตกเวอร์ชั่นออกเป็นรุ่น 32 บิตและ 64 บิต สำหรับวินโดส์ 32 บิต ผมว่าก็น่าจะมีคนใช้อยู่พอสมควร ในอนาคตไม่นานวินโดส์ 64 บิตก็น่าจะเป็นรุ่นหลัก เพราะมองเห็นและใช้ทรัพยากรของเครื่องได้หมด ตัวอย่างเช่นแรมที่เห็นเกิน 3 GB อาจจะมีคนใช้ Windows XP อยู่บ้างประปราย เนื่องจากโปรแกรมถูกพัฒนาบนวินโดส์  7 ไม่ทราบว่าเอาไปติดตั้งบนวินโดส์ XP ได้หรือปล่าว

traversepro_about32

หยุดพัฒนาไปนานเพราะติดกัปดักตัวเอง

  • บอกกันตรงๆ Traverse Pro รุ่นเดิมเขียนด้วย Delphi ตอนนี้ผมพอร์ตขึ้นมาเขียนด้วย Free pascal compiler(FPC) & Lazarus ที่ติดปัญหาร้ายแรงคือไฟล์ข้อมูลบางส่วนที่เป็นไบนารีไฟล์ รุ่นเดิมเขียนตัวเลขทศนิยมด้วยชนิดข้อมูลที่เรียกว่า Extended เดิมบนวินโวส์ 32 บิต มันเป็นเลขทศนิยมขนาด 10 byte (80 bit) แต่บนวินโดส์ 64 บิต ทาง Dephi และ  FPC พร้อมใจกันมาลดขนาดลงเป็น 8 Byte (64 bit) ทำให้การอ่านข้อมูลจากไฟล์รุ่นเก่าได้ข้อมูลมาไม่ถูก ยุ่งจริงๆ ผมทิ้งปัญหานี้ไว้นานมาก จนมานั่งแกะเขียนกันใหม่จากเดิมอ่านข้อมูลไฟล์เป็นก้อนๆ (record) แต่ตอนนี้อ่านสตรีมจากไฟล์ออกมาเป็น Byte (หรือ array of byte) แล้วมาทำการนับบิตหั่นข้อมูลออกมาเป็นส่วนๆ ก็สามารถแก้ปัญหานี้ได้แบบทุลักทุเล
  • สรุปแล้วที่พลาดตอนแรกออกแบบไฟล์ข้อมูลเขียนข้อมูลทศนิยมเป็น Extended ที่กล่าวไปแล้ว ซึ่งเกินความจำเป็นจริงๆ ตัวเลขไม่ได้ละเอียดที่จะต้องเขียนด้วยข้อมูลประเภทนี้

ส่วนที่ปรับปรุงใหม่

  • เขียนข้อมูลเก็บลงไฟล์เป็น Unicode ทำให้เรื่องภาษาไทย ไม่ต้องกังวลเหมือนแต่ก่อน ก่อนหน้านี้เวลาเขียนเครื่องหมาย degree เช่นเขียนลง excel ฝั่ง excel จะเห็นเป็นฐอฐาน (ฐ) วุ่นจริงๆ พอมาเป็นยูนิโค๊ด ก็หมดปัญหา
  • User interface ปรับให้ดูเรียบง่ายขึ้น รายการคำนวณก็ปรับใหม่ให้ดูเนียนขึ้น เมื่อป้อนข้อมูลวงรอบแล้ว ทำการคำนวณ ตรงรายการคำนวณผมจัดทำใหม่ให้ดูง่ายขึ้น

traversepro_computed_clicked

รายการคำนวณที่ดูง่ายขึ้น

traversepro_output

  • เมื่อคำนวณวงรอบแล้ว คลิกที่ toolbar ดังรูป  โปรแกรมจะส่งข้อมูลออกที่โปรแกรม Microsoft Excel เครื่องหมายองศาดีกรี ไม่มีปัญหาเป็น ฐอฐาน เหมือนรุ่นเก่า ทำให้เวลาเขียนมุม อ่านได้ง่าย

traversepro_excel_clicked

จะได้ผลลัพธ์ดังรูป

traversepro_excel

  • ส่วนพล๊อทรูปวงรอบ (Plot  Traverse) ปรับปรุงใหม่  แสดงผลให้ดูเรียบง่ายกว่าเดิม สามารถ Zoom, Pan ได้ตามต้องการ

traversepro_plot_clicked

จะเห็นรูปร่างวงรอบที่ถูกคำนวณปรับแก้แล้ว

traversepro_plotraverse

สามารถเซฟเป็น Autocad DXF ที่ทูลบาร์ดังรูปด้านล่าง

traversepro_plottraverse_toolbarเสร็จแล้วนำไปเปิดด้วย Autocad ต่อไป

traversepro_autocad

ของแถมอีกเล็กน้อยสามารถ Copy เป็นรูปได้เข้าคลิปบอร์ด

traversepro_plottraverse_copy_clickedแล้วไปเปิดโปรแกรมด้านตบแต่งรูปภาพจะได้ผลลัพธ์

traversepro_painted

แก้ไขปัญหาฟอนต์จิ๋วบนวินโดส์ 8

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

tpro001

  • แก้ไขแล้ว ขอให้ผู้ใช้งานบนวินโดส์ 8 ดาวน์โหลดมา แล้วติดตั้งอีกครั้ง

tpro002

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

ก่อนจากกัน

  • ในส่วนคู่มือมีน้องๆอยู่คน ตอนนี้ไม่ประสงค์จะออกนามครับ ได้รับอาสาไปจัดทำ ก็รอ user manual เสร็จเมื่อไหร่ค่อยมาใส่ลิีงค์ให้ดาวน์โหลดกัน
  • ที่ผ่านมาได้มีโอกาสศึกษาเขียนโปรแกรมด้วย Python เนื่องจากอายุมากค่อนข้างใช้เวลาพอสมควร ไพธ่อนเป็นภาษาที่เขียนได้กระชับไม่เยิ่นเย้อเหมือนปาสคาลหรือ Visual basic ทรงพลัง ที่สำคัญคือมีไลบรารีมากมายมหาศาล แต่ใช้เวลาเรียนรู้ไปสองสามเดือนเหมือนกันครับ นับว่า Learning curve ค่อนข้างชัน ไม่ได้ยากมาก แต่เป็นที่วัยไม่เอื้ออำนวย สมองไม่ปราดเปรียวเหมือนตอนวัยรุ่นๆแล้ว
  • ผมเอา Mapnik มาเรียกใช้ด้วย Python ช่วยด้าน GIS ตัวนี้ก็ทรงพลังมาก แต่คนส่วนใหญ่เอาไปใช้ในฝั่งเซิฟเวอร์กันเป็นส่วนมาก ส่วนผมเอามาใช้ในฐานะบน Desktop ก็ไม่ผิดหวัง อนาคตอาจมีโปรเจคที่เขียนด้วยไพธ่อนมาฝากกัน ถ้ายังไม่หมดแรงเสียก่อนครับ

traversepro_about64bit

ขั้นตอนการติดตั้ง PostGIS/Postgresql บน Ubuntu Server

ความเป็นมา

  • Postgresql อ่านออกเสียงว่า โพสเกรส เป็นระบบจัดการฐานข้อมูล RDBMS ซึ่งพัฒนาโดย PostgreSQL Global Development Group ในปี 2550 ลักษณะเป็น opensource มีลิขสิทธิ์แบบ BSD เป็นซอฟท์แวร์แบบ cross-platform ใช้ได้ทั้ง Windows, Free BSD, Solaris, Linux และก็ Mac OS
  • ย้อนหลังไปก่อนหน้านั้น ประวัติดั้งเดิม Postgresql พัฒนาต่อจากฐานข้อมูลชื่อ Ingres จึงเรียกว่า Post-Ingres (แปลง่ายๆว่า อินเกรสในตอนหลัง) ตอนหลังชื่อกลายเป็น Postgresql โครงการนี้สานต่อจากฐานข้อมูล Ingres ที่ยังมีปัญหา การพัฒนาเริ่มต้นในปี 2528 โดย Michael Stonebraker ที่ University of California, Berkeley

PostGIS

  • PostGIS คือส่วนขยายเพิ่มเติมที่ทำให้ฐานข้อมูล Postgresql  สามารถรองรับข้อมูลด้านสารสนเทศรูมิศาสตร์ (GIS) คือสนับสนุนข้อมูลที่สัมพันธ์เชิงพื้นที่ (Spatial)  ในตอนที่เขียนอยู่เป็นรุ่น 1.5 ยังไม่สนับสนุนงานด้าน Raster ต้องรอรุ่น 2.0
  • ผมจะเน้นเขียนถึงด้านนี้เพราะทีมงานของผมนำไปประยุกต์ใช้ควบคู่กับโปรแกรม GIS Desktop คือ Quantum GIS ซึ่งจะเป็นโปรแกรมที่เรียกใช้ฐานข้อมูล PostGIS จากเครื่อง Ubuntu Server ที่ลง PostGIS/Postgresql ไว้

  • สำหรับฐานข้อมูลระดับใหญ่ที่ support ข้อมูลแบบสัมพันธ์กับเชิงพื้นที่ (Spatial) มี Oracle, Microsoft SQL ServerInformix Dynamic Server และก็ Postgresql ผ่านทางส่วนขยาย PostGIS ที่กล่าวไปแล้ว

ความนิยม

  • ตอนนี้มีคนหันมาใช้ Postgresql กันมากขึ้น เพราะ MySQL ฐานข้อมูลยอดนิยมตอนแรกถูก Sun ซื้อไปคนยังไม่ตระหนกตกใจเท่าไหร่ แต่พอ Oracle ไปซื้อ Sun แล้วได้ MySQL มาด้วย ผู้ใช้ก็เกิดอาการอกสั่นขวัญแขวนว่า MySQL จะฟรีหรือเสียเงินต่อด้วยความไม่มั่นใจใน Oracle ผู้ใช้ตามองค์กรก็ย้ายจาก MySQL ไป Postgresql กันมากขึ้น
  • Postgresql ที่เราใช้ฟรีกันทั่วไปพัฒนาโดยชุมชนที่ผมกล่าวไปแล้ว ถ้าเป็นรุ่น Enterprize ที่เทียบเคียงกับ Oracle, DB2, MS SQL Server พัฒนาโดย EnterprizeDB โดยการพัฒนาต่อยอดจาก Postgresql แต่เป็นโค๊ดปิด
  • ตัวอย่างก็คือ Redhat ที่กระโดดเข้าไปลงทุนใน EnterprizeDB ทั้งที่ก่อนหน้านี้โซลูชั่นของ Redhat ก็ผูกอยู่กับ MySQL แต่มีความเสี่ยงสูงเพราะ Oracle เป็นคู่แข่งโดยตรงกับ Redhat และที่ไม่ลืมคือ IBM เข้าไปลงทุนกับ EnterprizeDB ก่อน Redhat ซะอีก (ทั้งที่ IBM ก็มี DB2 อยู่แล้ว)

ขั้นตอนการติดตั้ง

  • สำหรับ Ubuntu Server ที่ใช้อยู่เป็น  64 บิต ตามธรรมเนียมของเซิฟเวอร์ดั้งเดิมคือไม่มีระบบ Desktop คำสั่งที่ใช้เป็น command line ทั้งหมด แต่หลังๆก็เห็น Centos Server ทำเป็น Desktop แต่ดูๆแล้วกราฟฟิคค่อนข้างเรียบง่าย เบาๆ ไม่กินแรมมาก เพราะต้องสงวนแรมให้กับ service/process ของเซิฟเวอร์
  • สำหรับ server ก็ยังเป็นเดี่ยวๆไม่มี cluster เพราะ user ยังไม่มาก ไม่เกิน 20 คน ตัว server รับงานได้ลื่นไหล

ติดตั้ง PostGIS/Postgresql

  • ใช้ putty ล็อกอิน เข้าไป server หรือไปนั่งหน้า server แล้วก็บรรเลงเลยครับ ตอนนี้เมเจอร์เวอร์ชั่นออก 9,1 แล้วแต่ใน Ubuntu Server ยังเป็น 8.4 อยู่
$sudo apt-get install postgresql-8.4 postgresql-contrib-8.4 postgresql-8.4-postgis
  • แก้ไขไฟล์ config ชื่อ pg_hba.conf
$sudo nano /etc/postgresql/8.4/main/pg_hba.conf
  • ระบุว่า IP Address สามารถเข้ามาใช้งาน server ได้ เพิ่มบรรทัดนี้เข้าไปโดยที่หมายเลข IP Address แก้ไขให้ตรงกับที่ใช้

host  all  postgres  192.168.5.0/24  md5

  • แก้ไขไฟล์ config ชื่อ postgresql.conf เพื่อให้การ remote จากเครื่องอื่นที่ใช้เช่น pgAdmin เข้าไปใช้ server ได้
$sudo nano /etc/postgresql/8.4/main/postgresql.conf
  • แก้ไขบรรทัดโดยการยกเลิก comment ที่บรรทัด  listen_address = ‘localhost’ ให้เป็น
listen_address = '*'
  • ทำการ restart service ของ postgresql
$sudo /etc/init.d/postgresql restart
  • หลังจากติดตั้ง postgresql แล้วจะมี user และ group ชื่อ postgres ขึ้นมาซึ่งจะเป็น user ผู้ดูแลระบบของ linux ที่มีสิทธิ์ในการแก้ไข database ทำการเปลี่ยน password ของ user ชื่อ postgres ให้กับ Ubuntu ก่อน โดยป้อนรหัสของไปสองครั้ง สมมติว่าเป็น ‘mypostgres143′
$sudo passwd postgres
  • เปลี่ยน user เป็น postgres เพื่อจะทำการแก้ไข password เพื่อให้สามารถล็อกอินไปแก้ไข database ได้ password ที่ใส่เข้าไปต้องให้ตรงกับ Ubuntu คือ ‘mypostgres143′
$sudo su postgres
$psql -c"ALTER user postgres WITH PASSWORD 'mypostgres143'"
  • สร้างเท็มเพลตของฐานข้อมูลที่เป็นต้นแบบสำหรับงาน GIS (ยังใช้ user ชื่อ postgres อยู่)

$createdb postgistemplate

  • ตอนนี้ฐานข้อมูลชือ postgistemplate ยังเป็นฐานข้อมูลต้นแบบสำหรับ postgresql ทั่วๆไปต่อไปจะปรับโครงสร้างให้รองรับงาน GIS
$createlang -d postgistemplate plpgsql
$psql -q -d postgistemplate -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql
$psql -d postgistemplate -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql
  • สร้าง Group role แล้วค่อยมอบสิทธิ์ให้ user ต่อไปพิมพ์คำว่า psql ตรงคอมมานด์ไลน์ เพื่อจะใช้ภาษา sql ได้เต็มๆ ตรงพร็อมต์จะกลายเป็น postgres# ผมสร้าง group role ที่ชื่อ gisgroup ขึ้นมา จำกัดสิทธิ์ให้สร้าง Database ได้เท่านั้น
#CREATE ROLE gisgroup NOSUPERUSER NOINHERIT CREATEDB NOCREATEROLE;
  • สร้าง user ชื่อ gis ด้วยพาสเวิร์ด ‘mypuppet’
#CREATE ROLE gis LOGIN PASSWORD 'mypuppet' NOINHERIT;
  • แล้วมอบอาญาสิทธิ์หรือบทบาทจาก gisgroup ให้ด้วยคำสั่ง GRANT ออกจากโหมด sql ด้วยคำสั่ง \q
#GRANT gisgroup TO gis;
#\q

มอบสิทธ์ 2 ตารางข้อมูล spatial ให้แก่ผู้ใช้ที่กำหนด

  • สองตารางข้อมูลที่สนันสนุนเรื่อง spatial ที่สร้างมาด้วยตัวส่วนขยาย PostGIS คือ geometry_columns และ spatial_ref_sys เราจะมอบสิทธิ์เต็มแก่ผู้ใช้ชื่อ gis (ไม่ลืมที่จะเปลี่ยน user อื่นเป็น postgres)
$psql -d postgistemplate -c "ALTER TABLE geometry_columns OWNER TO gis;"
$psql -d postgistemplate -c "ALTER TABLE spatial_ref_sys OWNER TO gis;"

สร้างฐานข้อมูลสำหรับใช้งานจริง

  • ใช้คำสั่งสร้างฐานข้อมูลจาก template ที่เราสร้างไว้แล้วชื่อ postgistemplate ฐานข้อมูลที่จะสร้างใหม่ชื่อ cpendb ให้สิทธิ์ผุ้ใช้ชื่อ gis

$createdb -T postgistemplate cpendb -O gis

ติดตั้งทูลส์สำหรับ Postgresql

  • ต่อไปเครื่องมือสำหรับรีโมตเข้าไปบริหารฐานข้อมูล Postgresql จากเครื่องคอมพิวเตอร์ของเรามีให้เลือกใช้แบบ stand alone หรือรันบนอินเทอร์เน็ต เบราเซอร์ก็มี เป็นของฟรี ตัวแรกก็ pgAdmin3 นั้นแจ๋วที่สุดมีให้ใช้ทั้งบนลีนุกซ์หรือทางฝั่งวินโดส์ หรือจะไปใช้ phpPgAdmin บน internet browser ก็ได้แล้วแต่ความชอบ
  • ถ้าเราใช้ ubuntu หรือ ลีนุกซ์ Mint เป็น desktop ติดตั้งง่ายๆด้วย $sudo apt-get install pgadmin3 ติดตั้งแล้วมาดูว่าจะเข้าไป access ฐานข้อมูล cpdb ที่ติดตั้งเข้าไปแล้วอย่างไร เปิดโปรแกรม pgAdmin3 ใช้เมนู File > Add Server…

pgAdmin3 สำหรับบริหารฐานข้อมูล Postgresql (บนวินโดส์)

  • สำหรับผู้ใช้ pgAdmin3 ส่วนใหญ่จะเป็นสิทธิ์ Admin กันอยู่แล้ว ดังนั้น Username ที่ใช้จะเป็น ‘postgres‘ ซึ่งมีสิทธิ์สูงสุด ใส่ password เป็น ‘mypostgres143‘ ส่วน Name เป็นชื่อ Server (ตั้งอะไรก็ได้ในสื่อความหมาย) ส่วน Host เป็นเลข IP ของเซิฟเวอร์ในวงแลนของเราอย่างของผมเป็น 192.168.5.111 เสร็จแค่นี้ถ้าไม่มีอะไรผิดพลาดจะเห็นฐานข้อมูล cpendb ที่เราสร้างไว้ก่อนแล้ว

pgAdmin3 เปิดเซิฟเวอร์ดูไฟล์ที่สร้างไว้แล้ว (บนลีนุกซ์)

ใช้ปลั๊กอินของ Quantum GIS แปลง shape file เข้าไปเก็บในฐานข้อมูล

  • การปั๊ม shape file เข้าไปเก็บในฐานข้อมูล PostGIS ใช้ SPIT ซึ่งเป็นปลั๊กอินของ Quantum GIS นั้นง่ายที่สุด เมื่อเปิด QGIS แล้วคลิกที่เมนู Database > SPIT > Import Shapefile to PostgreSQL ขั้นแรกสร้าง connection ไปที่ฐานข้อมูลPostGIS ก่อน ด้วยการคลิกที่ New

สร้าง connection ไปยังฐานข้อมูล PostGIS บน Server

  • ขั้นต่อไปให้พารามิเตอร์ที่จะติดต่อกับ Server ตั้งชื่อ Host ให้ตรงกับ IP Address ส่วนฐานข้อมูลคือ ‘cpendb’ ที่เราเพิ่งสร้างไป และ Username ‘gis’ Password ‘mypuppet’

ป้อนค่าพารามิเตอร์

  • ก่อนจะเพิ่ม Shape fiel คลิกที่ปุ่ม Connect ดูถ้าสำเร็จก็คลิกที่ Add เพื่อเพิ่ม Shape file เข้าไปเก็บในฐานข้อมูล PostGIS ที่เครื่อง Server สามารถ Add ได้ทีละหลายไฟล์ จากนั้นจะเป็นกระบวนการปั๊มข้อมูลเข้า server ถ้าข้อมูลไม่ใหญ่ก็ไม่ต้องรอนานมาก

เพิ่ม Shape file เข้าฐานข้อมูล

  • หลังการเพิ่ม Shape file ไปที่ฐานข้อมูล PostGIS แล้วเราจะไม่เห็นอะไรเพิ่มมาที่ Map ให้ไปคลิกที่ไอคอนของ QGIS คือ Add PostGIS Layer เลือกตารางที่ต้องการด้วยการ

เลือก Add Table จากฐานข้อมูล PostGIs

  • จะเห็นตารางข้อมูลที่เลือกเพิ่มมาแสดงบน Map ของ QGIS

Quantum GIS แสดงตารางข้อมูลของ PostGIS จาก Server

สรุปการใช้งาน PostGIS

  • เมื่อฐานข้อมูลถูกย้ายมาที่ PostGIS แล้ว ข้อดีคือสามารถให้ user หลายๆคนเข้ามา access ฐานข้อมูลเพื่อแก้ไข update Attribute หรือแม้กระทั่งใช้ทูลส์เช่น QGIS เข้ามาแก้รุปร่าง Vector ได้พร้อมๆกัน
  • เพียงแต่ต้องมีการจำกัดสิทธิ์ user สำหรับผู้ใช้บางคน ซึ่งการให้สิทธิ์ผู้ใช้บางคนมีสิทธิ์แก้ไขได้เฉพาะบางฟิลด์ ไม่มีสิทธิ์เพิ่มหรือลบ record ได้ เป็นเรื่องปลีกย่อยที่ผู้อ่านต้องไปศึกษาต่อครับ
  • สำหรับ PostGIS รุ่น 2.0 ที่จะออกในวันข้างหน้าก็จะสนับสนุนเรื่อง Geo Raster ก็เป็นรุ่นที่รอคอยครับว่าจะทำได้ดีขนาดไหน
Categories: GIS, Lazarus, Windows ป้ายกำกับ:, , , , , ,

การนำเข้าข้อมูลจากไฟล์ CSV เป็นลายเส้น Polygon ใน QGIS

การนำเข้าข้อมูลจากไฟล์ CSV เป็นลายเส้น Polygon

  • ก็ถือว่าเป็นทิปและทริคเล็กๆน้อยๆ ในกรณีสร้าง Vector ที่เป็นรูป Polygon จากข้อมูลดั้งเดิมที่เป็นไฟล์ Excel แล้วแปลงเป็น CSV นำมาสร้างเป็นรูป Vector ใน Quantum GIS ซึ่งโปรแกรมด้าน GIS ที่ฟรีและเปิดโค๊ด cross-platform ในแวดวง GIS คงรู้จักกันดี ข้อมูลในเบื้องต้นที่จะนำมาทดสอบเป็นตัวอย่างคือ
  1. ไฟล์รูปแปลงที่ดิน งานสำรวจในภาคสนามจะได้มาเป็นค่าพิำกัด UTM และมี ID สำหรับรูปแปลงที่ดินไว้ด้วย ส่วนใหญ่แล้วเมื่อได้ค่าพิกัดแปลงที่ดินจากสนามแล้ว Draftman จะทำการสร้างรูปใน Autocad เพื่อตรวจสอบรูปร่าง ซึ่งการนำไฟล์ CAD แปลงเป็นฟอร์แม็ต้าน GIS ทำได้หลายโปรแกรมเช่นเปิดไฟล์ CAD ด้วย Global Mapper ทำการสร้าง attribute เพื่อเก็บ ID รูปแปลงที่ดิน แต่ในกรณีผมขอย้อนไปจุดเริ่มว่าถ้ามีไฟล์แบบ CSV และเก็บรูปแปลงเป็นค่าพิกัดเรียงไปตามลำดับจะทำอย่างไร?
  2. ไฟล์Attribute เก็บ Parcel_ID แปลงที่ดินพร้อมคุณสมบัติต่างเช่น ชื่อแปลงที่ดิน, ชื่อกลุ่มแปลงที่ดิน

ไฟล์ที่เก็บรูปแปลงที่ดินแยกตาม Parcel_ID

ความต้องการขั้นต้นใน QGIS

    1. ต้องการ Plug-in ชื่อ “Add Delimited Text Layer” เป็นปลั๊กอินที่มากับ QGIS ตั้งแต่ติดตั้งเสร็จตอนแรกไม่แสดง ต้องทำการเลือกก่อนผ่านเมนู Plugins > Manage Plugins… ทำเครื่องหมายเลือกให้กับ “Add Delimited Text Layer” เท่านี้ก็ใช้ได้
    2. ต้องการ Plug-in ชื่อ “Points2One” ปลั๊กอินตัวนี้ไม่ได้มาแต่แรก ต้องติดตั้งเพิ่มผ่านทางเมนู Plugins > Fetch Python Plugins…  ต้องอินเทอร์เน็ตด้วยจึงจะดาวน์โหลดแล้วติดตั้งได้
    3. ต้องการ Plug-in ชื่อ “MMQGIS”เหมือนกับตัวบนคือต้องติดตั้งเพิ่ม
    4. Plug-in ชื่อ “fTools” มากับ QGIS ตั้งแต่แรกแล้ว

      Plugins ที่ต้องติดตั้งเพิ่มเติม

ขั้นตอนการทำงาน

  • รวมไฟล์แปลงที่ดินเป็นไฟล์เดียว ถ้าไฟล์แปลงที่ดินเก็บแยกไฟล์กันให้นำมารวมเป็นไฟล์ CSV ไฟล์เดียวจะสะดวกมาก แต่ละวงของ polygon จะต่างกันที่ Parcel_ID

นำเข้าไฟล์ CSV

  • ใช้ปลั๊กอิน “Add Delimited Text Layer” ทำการอ่านไฟล์ CSV ของเรา ผลลัพธ์จะอยู่ในรูปจุด (Point) แต่ละจุดจะมี Parcel_ID ที่ต่างกัน และในกลุ่มจุดที่ Parcel_ID เดียวกัน QGIS จะสร้าง feather_id ให้ตามลำดับการนำเข้า

ใช้ปลั๊กอิน Add Delimited Text Layer นำไฟล์ CSV เข้ามาในรูปจุด

นำเข้ามาแล้วจะได้จุด (point) ที่มี Parcel_ID ที่แตกต่างกัน

แปลงข้อมูลจุด (Point) เป็นลายเส้น (Polygon)

ใช้ปลั๊กอิน “Points2One” ทำการรวมจุดที่มี Parcel_ID เดียวกันเป็น Polygon สืบจากข้อ 2 ปลั๊กอินนี้จะมองหา Parcel_ID เดียวกันแล้วลำดับ feather_id เริ่มลากเส้นจาก feather_id เท่ากับ 1 จนไปสิ้นสุดตัวสุดท้ายแล้วทำการปิดรูปให้

ใช้ปลั๊กอิน Point2One แปลงจากจุดเป็น Polygon

polygon ที่ได้จากปลั๊กอิน Point2One

Join Attribute

  • เตรียมไฟล์ Attribute ของเดิมอาจจะเป็น Export ทำการ Export เป็น CSV ที่สำคัญคือต้องมีคอลัมน์ใดคอลัมน์หนึ่งที่มีเลข Parcel_IDเป็นหมายเลขแปลงที่ดิน ตัวอย่างชื่อคอลัมน์คือ Par_ID ทึ่จะเชื่อมโยงไปยังรูป polygon แปลงที่ดิน

    แสดงไฟล์ attribute ที่จะนำมา Join

  • ใช้ปลั๊กอิน “MMQGIS” ทำการ Joint Attribute ด้วยเมนู Plugins > mmgis > Attributes Join from CSV File… จากไดอะล็อกเลือกไฟล์ (Input CSV File) แล้วกำหนด ID ของไฟล์ที่ CSV File Field ในที่นี้เป็น Par_IDเลือก layer ที่จะนำมา join (Join Layer) ในที่นี้เป็น Polygon_Parcels เลือก Join Layer Attribute ในที่นี้เป็น Parcel_ID เลือก Output Shape File เพื่อเก็บไฟล์ที่ Join Attribute กันแล้ว ส่วน Parcel_ID ไหนหาตัว join ไม่ได้เก็บไว้ในไฟล์ notfound.csv ซึ่งทำให้สามารถตรวจสอบได้ว่า Parcel_ID ที่ไม่สามารถหาคู่กันเจอ

    ใช้ปลั๊กอิน MMQGIS เพื่อ Join Attribute

  • หลังจาก Join แล้วลองปรับการแสดงผลดูได้ดังรูป

    QGIS แสดงผล layer ที่ได้จากการ join แล้ว

  • ลองเปิด table ของ layer ที่ join แล้วดู

    แสดง Table ที่ได้จากการ join แล้ว

การประมวลผลในเบื้องต้น

  • มาลองใช้ปลั๊กอินในการประมวลผลดู ปลั๋กอินตัวนี้ชื่อ fTools มาพร้อมกับ QGIS แต่ต้อง enable ก่อนถึงจะใช้งานได้ สำหรับ GIS แล้วการทำ processing เพื่อประมวลผลหาผลลัพธ์ที่ต้องการคือหัวใจของงาน GIS เมื่อได้ผลลัพธ์แล้วต่อไปก็คือการทำ Report และแสดง map สำหรับผลลัพธ์นั้นๆ
  • โจทย์ก็มีว่าถ้ามีแนวถนนกว้างเท่ากับ 100 เมตร (จริงแล้วคือเขตถนนหรือ right of way) ผ่านเข้าไปในแปลงที่ดิน ให้ประมวลผลว่าเข้าไปในแปลงไหนพร้อมแสดงเป็น map
  • ข้อมูล (layer) ที่จะนำมาประมวลผลสมมติว่ามี polyline (เส้นเดี่ยวไม่มีความกว้าง) ที่แทนแนวถนนตัดผ่านแปลงที่ดิ ผมนำเข้าถนนเข้าดังรูป

layer ถนน ที่เพิิ่มเข้าไป

  • ต่อไปจะขยายถนนให้ได้ขนาดกว้าง 100 เมตรด้วยการทำ Buffer ด้วยปลั๊กอืน fTools ใช้เมนู Vector > Geoprocessing Tools > Buffer ป้อนค่าใส่ไดอะล็อกดังรูป

ทำ Buffer ให้ได้ขนาดความกว้าง 100 เมตร

ความกว้างถนน 100 เมตร

  • ต่อไปจะหา polygon แปลงที่ดินที่ถูกตัดด้วยขอบเขตถนน 100 เมตรที่ตัดผ่าน ที่เมนู Vector > Geoprocessing > Intersect ใส่ค่าไปตาม dialog ดังรูปด้านล่าง

การทำ intersect ระหว่างขอบเขตถนนที่ได้จาก buffer กับ polygon ของแปลงที่ดิน

ผลลัพธ์ที่ได้

ผลจากการ intersect

  • ลองเปิดดู Attribute table ของ layer ที่ได้จากการ intersect

Attribute table ของเลเยอร์ถนนที่ตัดกับแปลงที่ดิน

สรุป

  • สำหรับผมแล้วใช้ QGIS เป็นหลักเพราะไม่ได้ใช้ฟังก์ชั่นการวิเคราะห์ที่ลึกซึ้งนัก ความเร็วของ QGIS ก็ไม่เลวเปิดรูปประมาณ 3 กิกะไบต์ก็ยังไปได้ แต่ขาดเรื่องการจัดปรินต์ Layout ที่ยังไม่ดีพอ อีกอย่างคือการ label ยังไม่เก่ง แต่ฟีเจอร์ต่างๆทางทีมผู้พัฒนาก็ปรับปรุงไปเรื่อยๆครับ
Categories: GIS, Linux, Windows ป้ายกำกับ:, , , , , , , , , ,

การกลับมาของ OpenGL เพื่อมาต่อกรกับ DirectX

ท้าวความถึง OpenGL

  • OpenGL มองในด้านโปรแกรมมิ่งจะเป็นคำสั่งชุดหรือ APIs (Application Program Interface) สำหรับให้ผู้พัฒนาโปรแกรมด้าน 3D สามารถเรียกใช้ความสามารถจากฮาร์ดแวร์บนเครื่องคอมพิวเตอร์ OpenGL เป็น Cross-Platform สามารถจะใช้ได้บนวินโดส์ ลีนุกซ์ บนแมค
  • สำหรับโปรแกรมด้าน 3D พอจะแบ่งได้คร่าวๆ 3 ประเภทคืออย่างแรกด้าน CAD & GIS อย่างที่สองคือโปรแกรมด้าน 3D Graphic Animation(3D Max, Maya) อย่างหลังคือ Game ซึ่งเป็นตลาดที่ใหญ่มาก โปรแกรมจำพวกนี้ถ้าไม่ใช้ OpenGL ก็ใช้ DirectX ของ Microsoft ซึ่งจะได้กล่าวอีกครั้ง

ผู้ก่อกำเนิด OpenGL

  • ย้อนหลังไปในปี 1981 บริษัทฯ Silicon Graphics International Corp ได้ถูกก่อ โดย Jim Clark  ต่อไปจะเรียกชื่อบริษัทฯนี้สั้นๆว่า SGI ซึ่งตั้งขึ้นมาเพื่อตลาดด้าน 2D & 3D Graphic ประกอบไปด้วยฮาร์ดแวร์และซอฟแวร์ คือขายรวมกัน ฮาร์ดแวร์ส่วนใหญ่เป็น workstation ทำงานอยู่บน Unix
  • บทบาทที่สำคัญของ SGI คือออกแบบไลบรารี IRIS GL และสร้าง APIs สำหรับให้นักพัฒนาโปรแกรมบน workstation ของ SGI ได้พัฒนาโปรแกรมด้าน 2D & 3D บน platform ของ SGI นับว่าเป็นการปฏิวัติวงการกราฟฟิคซึ่งจะมีบทบาทอย่างสูงในช่วงปี 1990
  • ต้นปี 1990 SGI คือผู้นำในวงการ 3D Graphic เพราะความเสามารถด้านฮาร์ดแวร์และไลบรารี IRIS GL ที่มีความยืดหยุ่นใช้งานได้ง่าย ความสามารถสูงและเป็นมาตรฐานสำหรับงาน 3D Graphic แต่ก็มีปัญหาตามมาคือ platform ของ SGI ยังเป็นระบบปิด ทำให้คู่แข่งไม่มีโอกาสและความได้เปรียบ ปี 1992 ทาง SGI จึงทำการแก้ไข IRIS GL ใหม่โดยยกเลิกสิ่งที่ไม่เกี่ยวข้องบางอย่างออก และเรียกว่า OpenGL (Open Graphic Library) เพื่อให้ผู้ผลิดฮาร์ดแวร์สามารถนำพัฒนา Device Driver ให้มีความสามารถด้าน 3D Graphic ตามไลบรารีที่ SGI ได้ออกแบบไว้ ในที่สุด OpenGL ก็กลายเป็นมาตรฐาน
  • การเปิดแบบนี้ทำให้ผู้ผลิตฮาร์ดแวร์เช่นการ์ดจออื่นๆสามารถนำความสามารถของ  OpenGL ไปผลิตการ์ดจอให้ได้ตามที่ต้องการไม่ต้องยึดติดกับ platform ของ SGI และในทางเดียวกันผู้พัฒนาโปรแกรมก็สามารถนำ APIs ของ OpenGL ไปพัฒนาซอฟแวร์ประเภท 3D ที่กล่าวไปแล้วเช่นเดียวกัน ตราบเท่าที่ฮาร์ดแวร์สนันสนุนโปรแกรม 3D นั้นๆก็สามารถรันได้

ความยืดหยุ่น (Flexibility)

  • ประโยชน์สูงสุดของ OpenGL ในตอนนี้คือผู้ผลิตฮาร์ดแวร์ต่างๆสามารถเสริมความสามารถด้วย Extension หรือส่วนเสริม ถ้า OpenGL ไม่มีฟีเจอร์ในส่วนนั้น ผู้ผลิตหลายรายเช่น Nvidia, Apple ได้พัฒนา extension เพื่อสนับสนุนฮาร์ดแวร์ของตนโดยเฉพาะ มองในข้อดีคือความยืดหยุ่น แต่ข้อเสียก็ตามมาคือไม่เป็นมาตรฐาน

มาตรฐานเปิด (Open Standard)

  • ในปี 1992 มีการก่อตั้ง ARB (OpenGL Architechure Review Board) เพื่อรวบรวมความต้องการของผู้ผลิตฮาร์ดแวร์และซอฟแวร์ต้องการฟีเจอร์อะไรเพิ่มในอนาคต ทั้งนี้เพื่อความเป็นมาตรฐานและเป็นระบบที่เปิดนั่นเอง
  • และแล้ว OpenGL ก็กลายเป็นผู้นำในเรื่อง 3D Graphic API และเป็นหนึ่งเดียวที่สามารถใช้งานได้หลาย platform

OpenGL บนวินโดส์

  • ไมโครซอฟต์ปล่อย Windows NT ในปี 1993 ซึ่งจะเป็นคู่แข่งของระบบ Unix ด้วยการสนับสนุนฮาร์ดแวร์ 32 บิต และก็ปล่อย Win32 API สำหรับสร้างโปรแกรมใช้บนวินโดส์ ซึ่งโปรแกรมเมอร์ C คงจะจำกันได้ดีในยุคนั้น
  • เนื่องจาก  Windows NT ยังไม่มีไลบรารี 3D จึงสนันสนุน OpenGL ปี 1994 ขณะนั้น Windows NT เป็นรุ่น 3.5 แต่ก็ทำงานช้ามาก เพราะยังไม่มีการปรับ OpenGL ให้เข้ากับฮาร์ดแวร์บนวินโดส์

DirectX

  • ไมโครซอฟท์เริ่มมองเห็นความสำคัญของ 3D Graphic ในตลาดเกมส์ และมองหาไลบรารี 3D เพื่อจูงใจผู้พัฒนาเกมส์ ความพยายามครั้งแรกเริ่มที่ WinG API แต่ไลบรารีก็แค่ 2D ก็ยังไม่มีเรื่อง 3D สุดท้ายซื้อบริษัท RenderMorphics ในปี 1995 ผู้ซึ่งผลิต 3D API ในนาม Reality Lab
  • API ตัวนี้ถูกเปลี่ยนชื่อเป็น Direct3D และรวมๆเรียกว่า DirectX ที่มีเครื่องมืออื่นๆเช่นเรื่องเสียง เน็ตเวิร์ค การวาดแบบ 2D อุปกรณ์เช่น Joystick
  • เริ่มต้นแล้ว DirectX การแสดงผลและประสิทธิภาพยังช้าอยู่มาก ทำให้ไมโครซอฟท์ยังคงสนับสนุน OpenGL 1.1 ต่อไปบนวินโดส์ 95 และ NT 4.0

เริ่มต้นสงคราม

  • ขณะที่ไมโครซอฟท์พยายามยืนกรานว่า OpenGL ดีสำหรับงาน CAD (Computer Aided Design) เท่านั้น เพื่อที่จะครอบครองตลาดเกมส์แต่เพียงผู้เดียว John Carmack แห่ง id software บริษัทผู้พัฒนาเกมส์ Quake ที่ใช้ OpenGL ออกมาวิจารณ์ถึงความง่ายในการใช้งาน OpenGL
  • ธันวาคม ปี 1996 John Carmack แสดงเอกสารพร้อมทั้งข้อคับข้องใจต่อ Direct3D ไม่เพียงเท่านั้นยังแสดงการเปรียบเทียบโค๊ดของโปรแกรมที่วาดรูปสามเหลี่ยมบนจอภาพ OpenGL ใช้เพียง 4 บรรทัดเท่านั้นแต่ Direct3D กลับใช้โค๊ดมากกว่าหลายบรรทัด
  • กุมภาพันธ์ ปี 1997 Alex St. John ผู้พัฒนา Direct3D ของไมโครซอฟท์ก็ออกมาตอบใต้ว่าคำวิจารณ์ของ John Carmack ได้สร้างความเสียหายให้กับ Direct3D เขาอธิบายว่า Direct3D นั้นเน้นเข้าถึงฮาร์ดแวร์มากกว่าซอฟแวร์ ถึงโค๊ดของโปรแกรมไม่สวยแต่ก็ทำงานได้ดี และก็ตอกย้ำอีกครั้งว่า OpenGL เหมาะที่จะเป็น API สำหรับโปรแกรมด้าน Cad เท่านั้น
  • เดือนมิถุนายน 1977 SGI ออกมาสำทับต้อบโต้กับบทวิจารณ์ของ Alex St. john เรื่องความบกพร่องต่อการออกแบบ Direct3D เปรียบเทียบ  API  ทั้งสองและแสดงถึงความง่ายในการใช้งาน OpenGL
  • ไมโครซอฟท์ปรับปรุง Direct3D ในรุ่น 5.0 ถอดเอาฟึเจอร์ที่ไม่สะดวกในการใช้งานออก ในตอนนี้ทั้งสอง API ใช้งานได้ง่ายแล้ว

เรื่องของ Driver

  • สำหรับไดรเวอร์ของ OpenGL จะถูกใช้งานใน Windows NT ผ่านทางไดรเวอร์ที่เรียกว่า Mini-Client Driver (MCD) ซึ่งทำให้ประสิทธิภาพต่ำมาก แต่ก็เป็นวิธีการที่ง่ายที่สุดในการสร้างไดรเวอร์สำหรับฮาร์ดแวร์ที่ต้องการใช้กับ OpenGL แต่ไมโครซอฟท์ก็ตอบโต้ด้วยการไม่อนุญาตให้ใช้ MCD ทาง SGI จึงเสนอวิธีสร้างไดรเวอร์สำหรับ Windows NT ผ่านทางที่เรียกว่า Installation Client Driver (ICD) ทางผู้ผลิตฮาร์ดแวร์ได้ใช้ ICD เพื่อสร้างไดรเวอร์ ไม่นานจากนี้อุตสาหกรรมเกมส์เริ่มนำ OpenGL มาใช้เป็นทางเลือกแทนที่ Direct3D

การปฏิวัติของวงการฮาร์ดแวร์

  • ในช่วงปลายของศตวรรษ 1990 OpenGL ได้ปักหลักในอุตสาหกรรมไม่เฉพาะด้าน CAD เท่านั้น เกมส์ดังๆเช่น Quake 2, Unreal และ Half-Life ก็ได้ใช้ OpenGL และเป็นที่นิยมในเกมส์อื่นๆเช่นเดียวกัน ในตอนนี้ก็มีผู้ผลิตการ์ดจอในราคาไม่แพงและจะเป็นผู้มาปฏิวัติวงการก็คือ 3Dfx
  • 3Dfx ได้ปล่อยการ์ดจอเรียกว่า Voodoo ซึ่งมีประสิทธิภาพสูงมากในสมัยนั้น ในขณะนั้นทาง ATI เริ่มขาย 3D Rage และ S3 Virge แต่ก็ไม่มีใครสู้ Voodoo ของ 3Dfx ได้ ต้องนี้ 3Dfx คิดการใหญ่ได้สร้าง API ของตัวเองขึ้นมาใหม่เรียกว่า Glide ซึ่งเป็น API ที่เร็วและแรงที่สุด แต่อย่างว่าผู้ผลิตฮาร์ดแวร์อื่นๆก็ใช้ไม่ได้ แต่ Glide ก็สร้างปรากฎการณ์ ไม่นาน Glide ก็พบจุดจบ
  • NVIDIA ถูกก่อตั้งในปี 1999 และขายการ์ดจอชื่อ Geforce 256 และได้เรียกการ์ดจอว่า GPU (Graphic Processing Unit) ได้เพิ่มคุณสมบัติที่เรียกว่า T&L (Transform & Lighting) ตัว T&L จะย้ายการคำนวณ Vertex transformation จาก CPU ไปสู่ GPU ซึ่งข้อดีของ GPU จะคำนวณทางคณิตศาสตร์ได้รวดเร็วมากกว่า  CPU เนื่องจากถูกออกแบบให้ทำงานนี้โดยตรง น่าเศร้าที่ 3Dfx ไม่มีคุณสมบัติ T&L ไม่นาน 3Dfx ก็พบจุดจบ
  • สุดท้าย 3Dfx ก็ล้มละลาย จึงถูก NVIDIA เข้าไปซื้อกิจการและ NVIDIA ก็ไม่ได้ออกการ์ดจอรุ่น Voodoo อีกเลย ในขณะนั้นคู่ปรับตลอดกาลของ NVIDIA คือ ATI ซึ่งมีการ์ดจอชื่อ Radeon 7000 ซึ่งเป็น GPU เช่นเดียวกัน และทั้งสองเจ้านี้ก็สนับสนุนเฉพาะ Direct3D และ OpenGL เท่านั้น

การเปลี่ยนแปลงคุณสมบัติที่สำคัญ

  • ในตอนนี้การเรนเดอร์เพื่อให้ได้ภาพ 3D ถูกย้ายจากการคำนวณจาก CPU ไป GPU เพื่อลดคอขวด สองฟีเจอร์ที่จะกล่าวต่อไปนี้คือวิธีการที่กล่าวไปแล้ว

Buffers

  • ในทางโปรแกรมมิ่งแล้วคำว่า Buffers คือสถานที่ในหน่วยความจำที่ถูกเก็บข้อมูลบางอย่างแบบชั่วคราว เมื่อเลิกใช้แล้ว Buffers ก็จะถูกทำลายเพื่อคืนหน่วยความจำให้กับระบบ
  • วัตถุที่จะถูกเรนเดอร์เป็น 3D บนจอภาพจะถูกเก็บในรูป buffers เช่น Vertex array วิธีการเดิมๆ Vertex array จะถูกเก็บในหน่วยความจำกลาง (บนแรมนั่นเอง) จากนั้นจะย้าย buffer นี้ไป GPU ซึ่งทำให้ช้าเนื่องจาก buffer มีขนาดใหญ่ วิธีการใหม่คือ buffer จะถูกเก็บในหน่วยความจำของ GPU  ทำให้ไม่มีคอขวดอีกต่อไป การเรนเดอร์ทำได้เร็ว
  • ใน OpenGL ตัว buffer นี้เรียกว่า Vertex Buffer Objects (VBOs) ใน Direct3D เรียกว่า Vertex Buffers

Shaders

  • ในปี 2000 ไมโครซอฟท์ได้ปล่อย Direct3D รุ่น 8.0 เพิ่มคุณสมบัติที่เรียกว่า Shaders ซึ่งเป็นโปรแกรมเล็กๆที่รันบน GPU ทำให้เพิ่มความเร็วของการเรนเดอร์ภาพ 3D จะเป็นการลดภาระของ CPU อีกแรงหนึ่ง ไมโครซอฟท์เรียก shaders ที่มีสองแบบว่า Vertex Shader และ Pixel Shaders
  • Vertex Shaders เป็นโปรแกรมที่จะถูกรันต่อหนึ่ง vertex ที่ถูกกำหนดให้ ส่วน Pixel Shaders จะถูกรันต่อหนึ่ง pixel การใช้ shader ดังกล่าวจะลดคอขวดที่จะเรียกใช้งาน CPU ได้มาก แต่ข้อเสียคือยากในการเขียนโปรแกรมเนื่องจากโครงสร้างคล้ายกับภาษา Assembly
  • ในปี 2003 ไมโครซอฟท์ เปลี่ยนโครงสร้างของโปรแกรมให้เขียนได้ง่ายขึ้นเรียกว่า High Level Shader Language (HLSL) พร้อมกับการปล่อย Direct3D รุ่น 9.0 ทั้งนี้โครงสร้างภาษาอยู่บนพื้นฐานภาษา C

ยุคซบเซาของ OpenGL

  • ในตอนนั้น OpenGL ยังไม่สนับสนุนเรื่อง shaders จนกระทั่งในปี 2004 ที่ออก OpenGL รุ่น 2.0 เรียกโครงสร้างของการเขียนโปรแกรม shader นี้ว่า OpenGL Shader Language (GLSL) แต่การตามหลังไมโครซอฟท์ถึง 4 ปีทำให้ OpenGL ต้องวิ่งไล่ Direct3D เหมือนกับที่ Direct3D เคยวิ่งไล่ OpenGL ในทศวรรษก่อนหน้านี้
  • ในปี 2004-2006 มีเกมส์น้อยที่สนับสนุน OpenGL จนกระทั่งปี 2005 ไมโครซอฟท์ออก XBox เพื่อยึดคลองตลาดเกมส์คอนโซล ตอนนี้ทั้ง ARB หรือ SGI ทำตัวเงียบทำให้ดูเหมือนว่า OpenGL ตายแล้ว
  • ในปี 2006 OpenGL รุ่น 2.1 ก็ถูกปล่อยมา มีการเพิ่มฟีเจอร์ไม่กี่อย่าง สถานการณ์ยิ่งเลวร้ายขึ้นเมื่อไมโครซอฟท์ปล่อย Direct3D รุ่น 10.0 ซึ่งจะใช้ได้บน Windows Vista เท่านั้น ผู้ผลิตฮาร์ดแวร์เริ่มปรับทิศทางตามไมโครซอฟท์
  • ในระหว่างนี้โปรแกรมเมอร์ที่ใช้ OpenGL เริ่มถามและต้องการคำตอบจาก ARB และ SGI แต่คำตอบกลับเป็นสิ่งที่แตกต่างตาลปัตร

OpenGL รุ่นใหม่

  • ปี 2006 ก่อตั้ง Khronos Group ขึ้นมาเพื่อดูแล OpenGL แทน SGI ทั้งที่ SGI ยังถือลิขสิทธิ์อยู่ Khronos Group เป็นกลุ่มของผู้ผลิตฮาร์ดแวร์และซอฟแวร์ที่ยังสนใจที่จะใช้ OpenGL ต่อ มีการเปิดเผยว่าใช้รูปแบบการเก็บข้อมูล 3D เรียกว่า Collada ในระหว่างนี้มีข่าวว่า OpenGL จะถูกปรับปรุงเพื่อเปลี่ยนแปลงคุณสมบัติคร้งใหญ่ หลังที่เงียบมาแล้วสองปี

Long Peak และ Mt. Evans

  • รุ่นของ OpenGL ที่จะพัฒนามี code name ว่า Long Peak และ Mt. Evans ตัว Long Peak จะถูกปล่อยในฤดูร้อนปี 2007 และ Mt. Evans จะปล่อยตามติดในเดือนตุลาคมปีเดียวกัน
  • รุ่นดังกล่าวให้ความหวังจะมาต่อกรกับ Direct3D รุ่น 10.0 และการเรนเดอร์จะต้องใช้ buffers และ shader ทั้งหมด ผลก็คือตัว API ต้องเขียนใหม่ทั้งหมดด้วยกลุ่มทีเรียกว่า Technical Sub Group (TSG)
  • หนึ่งในสิ่งที่จะพัฒนาขึ้นมาใหม่คือ Object Model ซึ่งจะต้องมาเกี่ยวข้องกับ buffers การเสนอ Object Model ใหม่นี้ทำให้เกิดวิธีการสร้าง Object Model แบบใหม่ เพียงการใช้ฟังก์ชั่นไม่กี่บรรทัด ตัว Long Peak จะออกแบบใหม่ให้มีการเข้ากันกับฮาร์ดแวร์ก่อนหน้านี้ ส่วน Mt.Evans จะถูกออกแบบโดยไม่มีการเข้ากันกับอุปกรณ์ก่อนหน้านี้ มุ่งไปข้างหน้า ด้วยฟีเจอร์ที่เสนอนี้ ทำให้ได้รับการรอคอยอย่างคาดหวังจากชุมชนคน OpenGL
  • แต่ในฤดูร้อนปี 2007 ก็ผ่านไปจนถึงเดือนตุลาคม มีข่าวจาก Khronos Group ว่าเลื่อนการออก OpenGL ชุมชนคน OpenGL ก็มีอาการไม่พอใจเล็กน้อย แต่เทียบกับคุณสมบัติใหม่ที่รอคอยแล้วก็คุ้มที่จะรอ และแล้วก็ผ่านไปอีกปี

OpenGL รุ่น 3.0

  • เดือนกรกฎาคม ปี 2008 ก็ออกรุ่น 3.0 มา นับเป็นระยะเวลา 4 ปี ตั้งแต่รุ่น 2.1 ออกมา แต่ที่น่าผิดหวังคือคุณสมบัติที่รอคอยกลับไม่มี ดูเหมือนจะเปลี่ยนแปลงไปเล็กน้อย ที่สัญญาเรื่อง Object Model ก็ไม่มีและไม่มีทีท่าว่าจะเกิดขึ้นในรุ่นต่อๆไป มีเพียงฟีเจอร์ใหม่ที่เสนอมาคือ deprecation mode และความเข้ากันได้กับฮาร์ดแวร์ก่อนหน้านี้
  • ยังผลทำให้ชุมชนคน OpenGL ต่อต้านตามเว็บบอร์ด ซึ่งหนึ่งในข้อกล่าวหาต่อ Khronos Group ที่ทำให้ OpenGL มีความเข้ากันได้ฮาร์ดแวร์เก่าๆเพราะต้องการรักษาลูกค้าขายซอฟท์แวร์ด้าน CAD ยังผลให้ผู้พัฒนาซอฟท์แวร์บนวินโดส์ เริ่มทิ้ง OpenGL หันไปใช้ Direct3D ความสิ้นหวังต่อ OpenGL ดูเหมือนว่าสงครามระหว่าง API ได้จบลงไปแล้ว

After the Shock

  • ถึงแม้จะไม่พอใจใน OpenGL รุ่นนี้ก็ตาม แต่ OpenGL 3.0 ก็มีฟีเจอร์เทียบเท่ากับ Direct3D 10.0 แต่สิ่งที่เหนือกว่าคือ OpenGL 3.0 ยังใช้งานได้บน Windows XP แต่ Direct3D 10.0 ต้องรันบน Vista เท่านั้นเนื่องจากโครงสร้าง Drivers ใหม่ของไมโครซอฟท์ที่ต้องการ Vista ขึ้นไปเท่านั้น
  • เดือนมีนาคม 2009 ก็ออก OpenGL 3.1 มาคุณสมบัติใกล้เคียงกันกับ Long Peak และ Mt.Evans ดั่งที่เคยเสนอไปแล้ว ตอนนี้ OpenGL กลับมาอยู่ในเส้นทางที่พร้อมจะต่อกรอีกครั้ง ไม่กี่เดือนต่อมาก็ออกรุ่น 3.2 พร้อมคุณสมบัติใหม่คือ Geometry Shaders

OpenGL รุ่น 4.0

  • หนึ่งปีผ่านไปหลังจากปล่อยรุ่น 3.2 ไปแล้วก็ได้เวลาคลอดรุ่น 4.0 ซึ่งคุณสมบัติพอฟัดพอเหวี่ยงกับ Direct3D 11.0 ในขณะเดียวกันก็ได้ออกรุ่น 3.3 ออกมาด้วยซึ่งมีคุณสมบัติใกล้เคียงกับ 4.0 แต่มีความเข้าได้กับฮาร์ดแวร์รุ่นเก่า
  • ในทุกวันนี้ถ้าต้องการเขียนโปรแกรม 3D ที่สามารถรันได้นอกเหนือจาก platform ของไมโครซอฟท์แล้วทางเลือกเดียวคือ OpenGL ถ้าสนใจจะพัฒนาโปรแกรมด้าน 3D บนอุปกรณ์มือถือเช่น Android หรือ iPad, iPhone ก็มีไลบรารี OpenGL ES ซึ่งใกล้เคียง กับ OpenGL รุ่นใหญ่ ทำให้การ port code ให้สามารถรันได้บน PC, Macs ลีนุกซ์หรือแม้แต่อุปกรณ์มือถือที่กล่าวไปแล้ว
  • นอกจาก OpenGL ES แล้วยังมีรุ่น WebGL สำหรับพัฒนาโปรแกรม 3D บนเว็บ

OpenGL รุ่น 4.1 และ OpenGL 4.2

  • เดือนกรกฎาคม ปี 2010 ออกรุ่น 4.1 มีการปรับปรุงคุณสมบัติบางอย่างที่เทียบเท่ากับ Direct3D 11.0 ในรุ่นนี้โค๊ดของ OpenGL มีการเข้ากันกับ (Full campatibility) OpenGL ES ได้อย่างสมบูรณ์
  • เดือนสิงหาคม ปี 2011 ออกรุ่น 4.2 เช่นเดียวกันปรับปรุงคุณสมบัติหลายอย่างทำให้การเรนเดอร์ทำได้เร็วกว่าเดิม
  • ความต้องการของฮาร์ดแวร์ ได้แก่ Nvidia GeForce 400 series, Nvidia GeForce 500 series, ATI Radeon HD 5000 series, AMD Radeon HD 6000 Series

OpenGL ในมุมของ Lazarus

  • ไม่นานมานี้เองผมพยายามหาไลบรารีที่จะมาช่วยทำโปรแกรม 2D จากที่เคยเขียนมาเองแต่ก็หน่อมแน๊มเกินไป ก็ไปเจอ GLSCene ดั้งเดิมพัฒนาโดย Mike Lischke เปิดเป็น opensource และภายหลังดูแลโดย Eric Grange ตอนแรกพัฒนาเป็น VCL สำหรับโปรแกรมเมอร์ Delphi โดยเฉพาะในรุ่นหลังใช้ได้กับ Lazarus ซึ่งผมลองแล้วทั้งบนวินโดส์กับลีนุกซ์ แต่บนวินโดส์เมื่อดาวน์โหลด sourcecode ตอนติดตั้ง package จะมีปํญหา ผมจึงทำการแก้ไขโค๊ดไปเล็กน้อยก็ใช้งานได้ แต่ตัวอย่างที่ให้มาประมาณ 60% ที่ใช้งานได้ เนื่องจากโน๊ตบุ๊คที่ใช้งานอยู่ ยังเป็นการ์ดจอบนบอร์ด จึงทดสอบคุณสมบัติบางอย่างไม่ได้
  • ผมลองดูตัวอย่างที่ให้มาก็คือพยายามเรียนรู้จากตัวอย่าง ก็ไม่ได้ยากเกินไป จุดเริ่มต้นของผมแค่อยากพัฒนา 2D ในตอนแรกก็เลยมีความตั้งใจจะเรียน 3D ไปด้วย ปีหน้าจะซื้อโน๊ตบุ๊คเครื่องใหม่คงได้ลองฟีเจอร์เด็ดๆดูกัน

GLScene ที่ติดตั้งบน Lazarus

  • ผมนำโค๊ดจากตัวอย่างมาปรับเพิ่ม effect บางอย่างมาเขียนเป็นเมนู Aboutของโปรแกรมแสดงข้อมูลที่เกี่ยวข้องกับโปรแกรมเช่นชื่อโปรแกรม รุ่นของโปรแกรม ผู้พัฒนาก็ได้ผลดังรูปด้านล่าง แสดงรูปของทีมงานผู้พัฒนาโปรแกรมหมุนรอบ effect  ไฟ คล้ายนั่งม้าหมุนที่นั่งกันสมัยเด็ก

    About ของโปรแกรม

ก่อนจากกัน

  • ถ้าสนใจจะลองไลบรารี GLScene บน Lazarus ถ้าดาวน์โหลดมาแล้วใช้ไม่ได้ก็ลองขอมาดู ผมจะนำไฟล์ไปฝากไว้แถวๆ file share ครับ โลกนี้ถ้ามีแต่ไมโครซอฟท์วินโดส์ อย่างเดียวโลกนี้คงเหงาพิลึก ความคาดหวังของผมแล้ว OpenGL ไม่ต้องเหนือกว่า Direct3D แต่ขอให้เทียบเท่าก็พอ เพราะสินค้าที่ผลิตมาเพื่อการพาณิชย์จากยักษ์ใหญ่ย่อมมีกำลังที่เหนือกว่า

เครดิต

  • เรื่อง OpenGL ที่เขียนมาเกือบทั้งหมดผมเรียบเรียงมาจาก http://openglbook.com/the-book/ เนื่องจากไม่มีวิทยาการที่ลึกซึ้งกับ OpenGL ผิดพลาดประการใดก็ขออภัยครับ
Categories: 3D, Lazarus, Linux, Programming, Windows ป้ายกำกับ:, , , , , , ,
ติดตาม

Get every new post delivered to your Inbox.

Join 45 other followers