Category: CAD

การออกแบบเส้นโครงแผนที่ความเพี้ยนต่ำ (Low Distortion Projection) ตอนที่ 2 (กรณีศึกษาออกแบบเส้นโครงแผนที่ความเพี้ยนต่ำสำหรับกรุงเทพมหานครและปริมณฑล)

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

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

และ

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

เรื่องเส้นโครงแผนที่ความเพี้ยนต่ำเป็นเรื่องใหม่สำหรับประเทศไทย แต่ในต่างประเทศบางประเทศได้ประยุกต์ใช้งานมานานแล้ว ประโยชน์ของเส้นโครงแผนที่ความเพี้ยนต่ำเมื่อประยุกต์ใช้แล้วคือ ความต่างระหว่าง Ground Distance และ Grid Distance จะน้อยมากจนสามารถละเลยไปได้ ไม่เหมือนกับการใช้แผนที่ระบบพิกัดยูทีเอ็ม (UTM) ที่ค่าระยะทางบนพื้นโลกกับระยะทางบนแผนที่ต่างกันมาก (ตัวอย่างระยะทางประมาณ 1 กม. สองระยะทางนี้อาจจะต่างกันประมาณ 40-80 ซม.แล้วแต่พื้นที่) แต่ข้อเสียคือจะต้องมีการกำหนดใช้เส้นโครงแผนที่ความเพี้ยนต่ำแบ่งเป็นพื้นที่หรือเป็นโซน ที่ค่าพิกัดศูนย์กำเนิดจะต่างกันไป อาจจะทำให้ช่างสำรวจหรือผู้ใช้งานสับสนได้ แต่ข้อเสียนี้สามารถลดลงได้ถ้ารัฐหรือหน่วยงานของรัฐได้กำหนดและประกาศใช้เป็นทางการ โดยที่มีเอกสารและไฟล์ projection สำหรับแปลงพิกัดจากระบบพิกัด UTM ไปยังระบบพิกัดที่ใช้ LDP ในแต่ละโซน ผู้ใช้งานสามารถนำค่าพารามิเตอร์นี้หรือนำไฟล์ projection (ตัวอย่างเช่นไฟล์ prj ของ Shape file) ไปแปลงพิกัดได้บนโปรแกรมด้าน GIS หรือนำไปตั้งค่าบนเครื่องมืออุปกรณ์เช่น GNSS RTK ที่สามารถแปลงพิกัดได้แบบ real time

ตัวอย่างการประยุกต์ใช้งาน

ผมขอยกตัวอย่างอีกครั้งเช่นรัฐโอเรกอนของอเมริกาที่มีการออกแบบ LDP และประกาศใช้กันมานานแล้วดังรูปด้านล่าง 

พื้นที่รัฐโอเรกอน ประมาณครึ่งหนึ่งของประเทศไทย (ประมาณ 255,000 ตร.กม.)

ออกแบบเส้นโครงแผนที่ความเพี้ยนต่ำสำหรับกรุงเทพมหานครและปริมณฑล

ก็เป็นกรณีศึกษาก็แล้วกันนะครับ ผมจะออกแบบคร่าวๆให้พอมองเห็นภาพในภาพรวม ผมจะไล่ไปตามขั้นตอนที่ได้กล่าวไว้ในตอนที่ 1 และผมจะตั้งเป้าว่า ความเพี้ยน (Distortion) ไม่เกิน 20 ppm ก็มาดูกันว่าในพื้นที่ศึกษานี้ ค่าความเพี้ยนจะอยู่ในเกณฑ์นี้ไหม 20 ppm ก็คือระยะทางจริงๆบนพื้นโลก (Ground Distance)  1 กม. ระยะทางบนระนาบเส้นโครงแผนที่ LDP (Grid Distance) จะต่างกันไม่เกิน 20 มม. (20 มม. ต่อ 1 ล้านมิลมิเมตร หรือ 1 กม. นั่นเอง)

1.กำหนดพื้นที่ขอบเขตและหาค่าตัวแทนความสูงเฉลี่ยเหนือทรงรี (h0)

สำหรับขอบเขตก็ตามหัวข้อคือประกอบไปด้วยจังหวัดกรุงเทพมหานคร สมุทรปราการ นนทบุรี และปทุมธานี ขนาดพื้นที่ประมาณ 85 กม.ในแนวเหนือใต้ และกว้างประมาณ 75 กม. ในแนวตะวันออกตะวันตก หรือกล่าวโดยย่อพื้นที่ 85 กม. x 75 กม.

ต่อไปจะหาค่าระดับที่เป็นตัวแทนความสูงเฉลี่ยเหนือทรงรี (h0) ข้อมูลที่จะนำมาในการหาค่าเฉลี่ยจะใช้แผนที่ของกรมแผนที่ทหาร ปี 2553 ชื่อ “แผนที่แสดงค่าหมุดระดับในเขตกรุงเทพมหานครและปริมณฑล” เนื่องจากแผนที่ไม่สามารถหาแหล่งดาวน์โหลดทางการได้ จึงได้ดาวน์โหลดจากกระดานสนทนาจากเว็บไซต์ ที่ความคมชัดน้อย บางครั้งตัวเลขค่าระดับอาจจะแตกต่างค่าจริงไปบ้าง แต่ผมคิดว่าคงไม่ได้ทำให้การออกแบบ LDP กรณีศึกษานี้มีความด้อยลง  ผมนำแผนที่ชุดนี้มา ทำ rubber sheet เพื่อขึงพิกัดให้เข้ากับเส้นโครงแผนที่ UTM จากนั้นทำการ digitize จุดแต่ละจุดระดับลง ไม่ได้เอาทุกจุด แต่เลือกจุดประมาณ 10 กม.ต่อหนึ่งจุด ค่าระดับนี้เป็นค่าระดับน้ำทะเลปานกลาง (Orthometric Height) ซึ่งเราจะแปลงค่าระดับนี้ไปเป็นค่าระดับเหนือทรงรี (Ellipsoid Height) ในขั้นตอนต่อไป

จากนั้นทำการจัดเก็บจุดค่าระดับเป็นไฟล์ shape file กำหนดระบบพิกัดเป็นภูมิศาสตร์ (Geographic) เพื่อสะดวกต่อการใช้ค่าพิกัดนี้ในภายหลัง

นำไฟล์รูปที่ขึงแล้วและไฟล์จุดค่าระดับเข้าโปรแกรม QGIS ใช้ฟังก์ชั่น vector ทำการหา Basic Statistics for fields จำนวนจุดทั้งหมด 365 จุด ค่าระดับต่ำสุด 0.000 เมตร ค่าระดับสูงที่สุด  9.956 เมตร ค่าเฉลี่ย Mean 2.988 เมตร ผมจะนำค่าเฉลี่ยนี้ไปใช้งาน ค่านี้ขอใช้ตัวย่อเป็น H0 = 2.988 เมตร

ค่าระดับ H0 = 2.988 เมตร นี้จะนำมาแปลงเป็นความสูงเทียบกับทรงรี (h0) การประยุกต์ใช้ LDP ก็คือนำระนาบมาวางแตะค่าระดับนี้ โดยที่กำหนดโซนความกว้างทางราบ และช่วงค่าระดับความสูงที่ยังสามารถใช้ได้

ไดอะแกรมแสดงเส้นโครงแผนที่ความเพี้ยนต่ำที่ระนาบพิกัดฉากสัมผัสที่ความสูงเฉลี่ย h0

2.เลือกเส้นโครงแผนที่และกำหนด Central Meridian ที่จุดใกล้จุดศูนย์กลางพี้นที่

เส้นโครงแผนที่ที่นิยมนำมาทำ LDP มี 3 ประเภทคือ Transverse Mercator (TM), Lambert Conformal Conic (LCC 1SP) และ Oblique Mercator (OM) โดยที่แนวทางการเลือกถ้าพื้นที่ยาวไปในทิศทางตะวันออกตะวันตกเลือก LCC ถ้าพื้นที่ยาวไปในทิศทางเหนือใต้เลือก TM ถ้าพื้นที่เอียงไปในแนวทะแยงมุมกันทิศเหนือใต้และตะวันออกตะวันตกให้เลือก OM ในเคสนี้พื้นที่ยาวในทิศทางเหนือใต้ก็เลือกเป็น TM ที่เราคุ้นเคยกันดี

ต่อไปกำหนด Central Meridian (CM) ที่จุดกึ่งกลางของพื้นที่ (Centroid) ผมไปดาวน์โหลดไฟล์ shape file ที่รวมเอาเส้นขอบเขตของจังหวัดในประเทศไทย เมื่อโหลดมาแล้วเปิดใน QGIS จากนั้นทำการรวมพื้นที่ 4 จังหวัดนี้แบบ Dissolve เพื่อให้เหลือเส้น polygon เส้นเดียว แล้วจะนำไปหาจุดศูนย์กลางพี้นที่ โดยใช้ฟังก์ชั่นด้าน vector ของ Geometry tools เพื่อหา centroid ได้จุดมาดังรูปด้านล่าง

ได้ค่าพิกัดภูมิศาสตร์ของจุด Centroid ดังนี้ latitude: 13.852166 longitude: 100.629706 หน่วยเป็นดีกรี แปลงเป็นหน่วย DMS ได้ latitude: 31°51’7.8″N longitude: 100°37’46.94″E การวาง central meridian จะนิยมเลือกลิปดา (second) ที่เป็นจำนวนเต็ม ผมเลือก ค่าเต็มๆคือ Latitude = 31°51′ และ  CM =  100°38′

3.คำนวณหาค่าสเกลแฟคเตอร์ k0 ที่แกน Central Meridian

ก่อนหน้านี้ในข้อ 1. ผมได้ค่าระดับน้ำทะเลปานกลางของพื้นที่เฉลี่ย (H0) 2.988 เมตร จะนำค่านี้ไปแปลงเป็นค่าระดับเทียบทรงรี (h0) เตือนกันนิดว่าทรงรีที่เราใช้เป็น WGS84 การหา k0 ไม่ได้ยากตามสูตรนี้

Formula 1: Calculate Axis Scale Factor

การหาค่า h0 ก็ไม่ได้ยุ่งยากอะไรในทูลส์ Surveyor Pocket Tools ก็มีโปรแกรม Geoid Height ให้ใช้งาน h0 = H0 + N  โดยที่ N คือ Geoid Separation แต่จะก่อนคำนวณทีละขั้นตอนแบบนี้แบบแมนวลผมจะขอเสนอวิธีที่สะดวกกว่านั้น ผมจะใช้ทูลส์ชือ Init Design LDP ที่อยู่ใน Surveyor Pocket Tools มาช่วย

 คำนวณหาค่า k0 ด้วย Init Design LDP

เปิดโปรแกรม Init Design LDP จะเห็นหน้าตาโปรแกรมดังรูปด้านล่าง

ป้อนข้อมูลค่าระดับเฉลี่ย H0 = 2.988 เมตร ป้อนค่า Latitude  of project center =  13°51′ และ  Longitude of project center (CM )=  100°38′ ที่ได้จากข้อ 2.

จากนั้นคลิกที่ไอคอนลูกศรชี้ลง (เลข 3) เพื่อทำการคำนวณจะได้ผลลัพธ์ดังนี้

โปรแกรมจะคำนวณหาค่า h0 ให้และนำค่านี้ไปแทนในสมการด้านบน สุดท้ายจะคำนวณหา k0 = 0.999996 (แนะนำให้ใช้ทศนิยม 6 ตำแหน่ง) ผมพยายามขยับ CM ไปทางตะวันออกและตะวันตกครั้ง 15″ แต่ค่า k0 ยังเกาะที่ค่า 0.999996 นี้ ผมเลยเลือก CM = 100°38′

4.ตรวจสอบความเพี้ยน (Distortion) ตลอดทั้งพื้นที่

เป็นขั้นตอนที่สำคัญมาก คือถ้าเราเลือก Central Meridian มาหลายๆอันจะต้องเอาค่า k0 มาคำนวณหา Distortion

ค่า k คือ grid scale factor ค่า k นี้เราสามารถหาได้จาก สูตรด้านล่าง (เครดิตจาก Map Projection – A Working Manual ของ John P. Snyder หน้า 61)

Formula 2: Calculate Grid Scale Factor

สูตรก็เป็นสูตรเดียวที่เราใช้หา grid scale factor สำหรับ UTM เพียงแต่ค่า k0 ที่เราใช้จะเป็นค่า k0 ที่ได้จากการคำนวณด้วยโปรแกรม “Init Design LDP” คือ k0 = 0.99996, แทนค่า λ0 ด้วย 1.756383004 เรเดียน (λ0 คือ Central Meridian = 100°38′)

เลือกจุดทดสอบ

ผมเลือกจุดมาทั้งหมด 10 จุด ตำแหน่งให้อยู่ขอบๆ เป็นที่ทราบกันดี ว่าถ้าเป็นเส้นโครงแผนที่ TM ตัว grid scale factor จะเปลี่ยนจากด้านตะวันออก-ตะวันตกเท่านั้น (ไม่มีผลกับเลื่อนไปทางเหนือ-ใต้)

เรากำหนด CM ค่อนข้างจะกลางของพื้นที่ ดังนั้นจะมาดูกันว่าด้านขอบนั้นมี distortion จะยังอยู่ในเกณฑ์ไหม

การตรวจสอบจุดหาความเพี้ยนจะอาศัยการคำนวณจากสูตรที่ผมลงมาให้ก่อนหน้านี้ ลองมา workshop กันดูสักนิด  เริ่มจากจุดที่ 1  แต่จุดต่อๆไปผมจะใช้ทูลส์อีกตัวในชุด Surveyor Pocket Tools มาช่วย

Point No 1 Lat (ɸ)= 13.5079570 Long (λ) = 100.8674784 H = 6.394

คำนวณหาความสูงเทียบกับทรงรี

ได้ค่าh = H + N แทนค่าในสูตร h = 6.394 -29.9632 = -23.5692 เมตร

คำนวณ RG

RGเป็นค่าที่ขึ้นอยู่กับ latitude และพารามิเตอร์ของทรงรี (Ellipsoid) WGS84 ดังนี้

a = 6378137, e = 0.08181919084262149, e’ = 0.08209443794969568

แทนค่า

ใช้สูตรที่ 1 (formula 1) ได้ค่า  RG= 6359074.928

คำนวณค่า k

ใช้สูตรที่ 2 (formula 2) คำนวณได้ค่า T = 0.057708361, C = 0.006371791, A = 0.003973557 สุดท้ายคำนวณหาค่า k = 1.000003945

คำนวณหาค่าความเพี้ยน (Distortion)

แทนค่า k, RG และค่า h ลงไป

จะได้ค่า 7.65 x 10-6 เขียนให้ง่ายคือ 7.65 ppm (7.65 มม. ต่อหนึ่งล้านมม. ซึ่งก็เท่ากับ 7.65 มม.ต่อ 1 กม.) สรุปได้ว่าที่จุดที่ 1

Point No 1 Lat (ɸ)= 13.5079570 Long (λ) = 100.8674784 H = 6.394

มีค่าความเพี้ยน (Distortion) = 7.65 ppm จะเห็นว่ายังไม่เกินค่า 20 ppm ที่ผมตั้ง tolerance ไว้

สร้างเส้นโครงแผนที่ความเพี้ยนต่ำ

มาลองสร้างเส้นโครงแผนที่ความเพี้ยนต่ำโดยอาศัยทูลส์ Create LDP มาช่วย ทูลส์ตัวนี้นอกจากจะสร้าง LDP ได้แล้วยังสามารถตรวจเช็คค่าความเพี้ยนได้ทันที พร้อมทั้งแปลงค่าพิกัดจาก latitude/longitude ไปยังค่าพิกัดใน LDP ได้ เปิดทูลส์ Surveyor Pocket Tools คลิก Create LDP

ตามรูปบนผมสร้างเส้นโครงแผนที่ความเพี้ยนต่ำ โดยอันดับแรกเลือก Projection ก็คือ Transverse Mercator กำหนดใช้ Latitude of origin = 13°51′ และ Central Meridian = 100°38′ ผมกำหนดค่า False Northing (FN) = 500000 และ False Easting (FE) = 200000 หน่วยเป็นเมตร รับรองว่าค่าพิกัดขอบของพื้นที่จะไม่มีค่าติดลบ (พื้นที่ 85 กม. x 75 กม. หรือ 85000 ม. x 75000 ม.) และที่สำคัญมากคือค่า Scale factor at grid origin (k0) = 0.999996 ที่คำนวณไว้ตั้งแต่ตอนแรกๆ ค่า FN และ FE ผมหลีกเลี่ยงเลือกค่าที่ใกล้เคียงกัน และพยายามจะไม่ให้ค่ามากจนไปใกล้เคียงกับ UTM อันจะก่อให้เกิดความสับสน

คำนวณหาค่าความเพี้ยนด้วยทูลส์ Create LDP

ลองป้อนพิกัดจุดที่ 1 เข้าไปในกรอบที่ 2 ดังรูป

ทำการคำนวณด้วยการคลิกไอคอนรูปลูกศรจะได้ผลลัพธ์

ค่าความเพี้ยน 7.65 ppm ตรงกับที่เราคำนวณด้วยมือ ผมใช้โปรแกรมช่วยคำนวณมาทั้ง 10 จุดได้ผลลัพธ์ดังนี้

จะเห็นว่าจุด ที่ 3 มีความเพี้ยน (distortion) อยู่ที่ 13.18 ppm เพราะอยู่ชายขอบด้านตะวันออกสุด และจุดที่ 9 ค่าความเพี้ยนมากถึง 17.27 ppm อยู่เกือบขอบด้านตะวันตก แต่ยังไงก็ไม่เกิน 20 ppm ตัวเลขที่ตั้งไว้ ส่วนที่ลองจิจูดใกล้เคียงกับ CM ได้แก่จุดที่ 4 จะเห็นค่าความเพี้ยนเล็กมาก ขนาด -0.6 ppm แค่นั้นเอง

5.กำหนดพารามิเตอร์เส้นโครงแผนที่ความเพี้ยนต่ำให้เรียบง่าย

จากที่คำนวณและออกแบบมาตั้งแต่ต้น สามารถกำหนดพารามิเตอร์เส้นโครงแผนที่นี้ให้เรียบง่ายและอ่านง่ายได้ดังนี้
Projection: Transverse Mercator
Latitude of grid origin: 13° 51’ 00” N
Longitude of central meridian: 100° 48’ 00” E
Northing at grid origin: 500,000 m
Easting at central meridian: 200,000 m
Scale factor on central meridian: 0.999996 (exact)

ค่าพารามิเตอร์นี้ต้องติดไว้ข้างแผนที่ที่ใช้เส้นโครงแผนที่ความเพี้ยนต่ำนี้เสมอ

6.กำหนดหน่วยระยะทางและพื้นหลักฐานให้ชัดเจน

Linear unit:  Meter

Ellipsoidal datum :  World Geodetic System 1984 (WGS84)

Vertical datum:  Mean Sea Level (MSL)

System:  Bangkok Metropolis Low Distortion Projection Coordinate System

Zone:  Bangkok Metropolis Area

หน่วยระยะทางและพื้นหลักฐานต้องติดไว้ข้างแผนที่ที่ใช้เส้นโครงแผนที่ความเพี้ยนต่ำนี้เสมอ

จัดเก็บเส้นโครงแผนที่ความเพี้ยนต่ำเข้าฐานข้อมูล

ทูลส์ Create LDP นอกจากสามารถคำนวณหาค่าความเพี้ยนและแปลงพิกัดได้แล้ว ยังสามารถจัดเก็บเส้นโครงแผนที่ที่เราออกแบบ เข้าไปเก็บในฐานข้อมูล เพื่อความสะดวกสามารถนำมาใช้ในภายหลังได้ เมื่อเปิดโปรแกรม Surveyor Pocket Tools

คลิกที่ LDP Database จะเห็นฐานข้อมูลของ LDP สำหรับเครื่องผมแล้วมีฐานข้อมูลเก็บเส้นโครงแผนที่ความเพี้ยนต่ำที่ผมนำมาศึกษาดังนี้

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

จากนั้นกลับมาดูที่ LDP Database คลิกที่ไอคอนลูกศรวนเพื่อ “Refresh” จะเห็นฐานข้อมูลอัพเดทดังนี้ ผมวงสีแดงเน้นให้ดูพารามิเตอร์ที่ป้อนไป

แปลงพิกัดด้วยทูลส์ Transform Coordinates

เมื่อจัดเก็บฐานข้อมูลเส้นโครงแผนที่ความเพี้ยนต่ำแล้ว ต้องการแปลงพิกัดระหว่าง UTM/Geographic ไปยังเส้นโครงแผนที่ความเพี้ยนต่ำก็สามารถทำได้ดังตัวอย่างต่อไปนี้ เริ่มจากเปิดโปรแกรม Transform Coordinates มาก่อน

จากตัวอย่างคำนวณค่าพิกัดยูทีเอ็ม N = 1,561,926.0937, E = 639,807.9239 Zone: 47N บนพื้นหลักฐาน WGS84 ไปยังพื้นหลักฐาน Bangkok Metropolis (LDP) จะได้ค่าพิกัด N = 530,441.5826, E = 163,493.4658

เครดิตสูตรที่นำมาใช้

เส้นโครงแผนที่ความเพี้ยนต่ำจริงๆแล้วก็คือเส้นโครงแผนที่ตัวหนึ่ง ไม่มีอะไรพิเศษพิศดาร เพียงแต่ยกระนาบขึ้นมาแตะทึ่ค่าระดับเฉลี่ย h0 จุดนี้เองที่พิเศษเพราะว่าจะได้ค่า k0 ตัวใหม่ที่ไม่ใช่ 0.9996 แบบยูทีเอ็ม ดังนั้นสูตรที่นำมาใช้เพื่อคำนวณเส้นโครงแผนที่ความเพี้ยนต่ำ ทั้งการหา Grid Scale Factor หรือแปลงพิกัด ก็ยังเป็นสูตรของ Transverse Mercator

ในโปรแกรม Surveyor Pocket Tools ผม implement สูตรการคำนวณจาก Map Projection – A Working Manual by John P. Snyder เป็นโค้ดภาษาไพทอนเฉพาะการคำนวณที่เกี่ยวข้องกับ LDP ส่วนการแปลงพิกัดข้ามพื้นหลักฐานอื่นๆยังใช้ไลบรารีจาก Proj4 ถ้าสนใจสูตรของ Transverse Mercator ให้ไปดูได้ที่หน้า 60-63 ของตำราเล่มนี้

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

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

 

ก้าวไปอีกหนึ่งก้าวกับ XSection Plot

สวมวิญญานใหม่ด้วย PySide2

หลังจากผมคอมไพล์ XSection Plot ใหม่ด้วยสภาวะแวดล้อมพัฒนาของ Qt5 platform ด้วย PySide2 ผมเปลี่ยนลิขสิทธิ์ของโปรแกรมเดิมที่กำกวมออกมาฟรีสมบูรณ์แบบเหมือนกันกับ Surveyor Pocket Tools สามารถนำไปทำซ้ำแจกจ่ายได้ตามอัธยาศัย แต่ห้ามดัดแปลง ห้ามนำไปจำหน่ายหรือให้เช่า

XSection Plot
Copyright (C) Prajuab Riabroy. All Rights Reserved.

XSection Plot is free for use in any environment, including but not necessarily limited to: personal, academic, commercial, government, business, non-profit, and for-profit. "Free" in the preceding sentence means that there is no cost or charge associated with the installation and use of XSection Plot. 
Permission is hereby granted, free of charge, to any person obtaining a copy of this software (the "Software"), to use the Software without restriction, including the rights to use, copy, publish, and distribute the Software, and to permit persons to whom the Software is furnished to do so.

You may not modify, adapt, rent, lease, loan, sell, or create derivative works based upon the Software or any part thereof. 

The above copyright notice and this permission notice shall be included in all copies of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

แก้ไข bugs

นอกจากย้ายโค้ดมาใช้ PySide2 แล้ว ผมเลยถือโอกาสแก้บั๊กเล็กน้อยไปหลายอย่าง เช่น

  • เวลาคลิกขวาเพื่อเรียกเมนูในช่องป้อนข้อมูล โปรแกรมจะ terminate ทันที
  • ใน Section Layout ตรง Horizontal Grid เมื่อปรับ Distance from CL to left ไปแล้ว โปรแกรมไม่จำค่าใหม่
  • อื่นๆอีกเล็กน้อยประมาณสิบกว่าอย่าง

คอมไพล์และสร้างไฟล์ execute binary ด้วย PyInstaller

ตอนนี้โปรแกรมสนับสนุนทั้ง 32 บิตและ 64 บิต ผมใช้ PyCharm เป็นทูลส์ในการพัฒนา และเลือกได้ว่าจะใช้ 32 บิตหรือ 64 บิต เมื่อโปรแกรม stable แล้ว ก็จะสร้าง execute binary file ด้วย PyInstaller ตามสภาวะแวดล้อม ต้องทำสองครั้ง ครั้งแรก 32 บิตและครั้งที่สอง 64 บิต โดยแต่ละครั้งจะได้ไฟล์ exe, pyd, dll รวมถึงไลบรารีของไพทอนที่เราเรียกใช้ และที่สำคัญคือไลบรารีของ PySide2

ทำไฟล์ Setup ด้วย Inno Setup

ไฟล์ที่ได้จาก PyInstaller ทั้งหมด ผมจะนำมาสร้างไฟล์ Setup ด้วย Inno Setup เพื่อนเก่าที่ใช้กันมานมนาน มีดีเพียงพอที่จะสร้างไฟล์ Setup ได้ง่ายๆ มี options ให้เลือกพอสมควร สุดท้ายจะได้ไฟล์ Setup ที่เป็น Execute file ไฟล์เดียวพร้อมจะนำไปอัพโหลดให้ผู้ใช้นำไปใช้งานได้

ทดสอบโปรแกรมด้วยแบบรูปตัดตามยาว

ผมจะลองทดสอบโปรแกรมจากข้อมูล ความจริง XSection Plot คือโปรแกรมสร้างหรือช่วยเขียนรูปตัดตามขวาง แต่ยังพอเอามาประยุกต์ใช้กับ Long Profile ได้ แต่ไฟล์ข้อมูลส่วนใหญ่จะมีข้อมูลเพียงหนึ่ง Section เท่านั้นจะเริ่มจากไฟล์ข้อมูลของ Existing Ground Section ก่อนครับ ข้อมูลดังในกรอบข้างล่าง สามารถ copy ไป paste ในโปรแกรม text file editor เช่น Notepad ได้จากนั้น save ตั้ง extension เป็น gxml (ตัวอย่างผมตั้งชื่อว่า lake-road.gxml)


  
  
  
XSection Plot Prajuab Riabroy 4.1.512 Ground 2017-11-12 19:24:28.634707
Cantonment Lake Road False 500.0 1000.0 10.0 2.0 0 True True False 3 3 True 10.0 MSL MSL 1 2 True True 1 90 10 LT. RT. Km. 2 1 1 0 True False Custom 940.0 200.0 1
47.7 11.7 14.0 29

ต่อไปเป็น Typical Section ขนาดเล็กกว่า ผมตั้งชื่อว่า lake-typical.txml


  
  
  
XSection Plot Prajuab Riabroy 4.1.512 Typical 2017-11-12 18:42:28.929847
1
0.0 0.0 0.0 4

เปิดไฟล์ข้อมูลทดสอบบน XSection Plot

จากนั้นนำสองไฟล์มาเปิดด้วย XSection Plot เวลาเปิดไฟล์ให้เลือกรูปแบบของไฟล์ด้วยจะได้เปิดง่าย  มีชื่อ extension ตามลำดับดังนี้ gxml, txml

จะได้ข้อมูลปรากฎขึ้นบนโปรแกรมดังนี้

ตั้งหน้ากระดาษ (Page Setup)

ผมลองเลือกใช้หน้ากระดาษที่ไม่มาตรฐานเพื่อให้ฟิตกับขนาดรูปตัดตามยาว ยาว 940 มม. และกว้าง 200 มม.

ตั้งค่า (Settings)

ผมตั้งสเกลทางราบเป็น 1:1000 และสเกลทางดิ่ง 1:250 อย่างอื่นดูรูปด้านล่าง

จัดวางรูปตัดบนกระดาษ (Section Layout)

จะเห็นกระดาษขนาด 200 มม. x 940 มม. แล้วเลือกพารามิเตอร์ดังรูปด้านล่าง

ดูรูปตัด (Section Viewer)

จะเห็นรูปตัดตามยาวที่ประกอบไปด้วย Existing Ground และ Typical

ลองซูมดู ก็ได้แบบ drawing มาพอถูๆไถๆ ที่สามารถนำไปเขียนเพิ่มเติมได้ในโปรแกรมด้านเขียนแบบทั้งหลายเช่น Autocad, Microstation, Draftsight

Save to DXF

จัดเก็บไฟล์ในรูป Autocad DXF เพื่อสามารถนำไปเปิดในโปรแกรมอื่นได้

เปิดไฟล์แบบรูปตัดตามยาว

ผมใช้ Microstation เปิดแบบรูปตัดตามยาวได้ผลลัพธ์ดังนี้และพร้อมจะนำแบบไปเขียนเพิ่มเติมตามความต้องการ

ครับคงอีกไม่นานก็จะคงจะปล่อยเวอร์ชั่นเสถียรให้สามารถดาวน์โหลดได้ พบกันใหม่ครับ

Surveyor Pocket Tools – คำนวณพื้นที่ เรื่องธรรมดาที่ไม่ธรรมดา (ตอนที่ 1)

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

ย้อนรอยสูตรคำนวณหาพื้นที่

  • Surveyor Pocket Tools รุ่นก่อนหน้านี้ส่วนใหญ่จะเป็นงานคำนวณในงานเซอร์เวย์เรื่อง Advance เช่นงานคำนวณหาระยะทางบน Ellipsoid งานคำนวณหาความสูงของจีออยด์ การแปลงพิกัด ตอนนี้จะกลับมาเรื่องพื้นฐานคือการคำนวณหาพื้นที่
  • การคำนวณหาพื้นที่ ปกติที่เราคุ้นหูคุ้นตาคือ การเอาค่าพิกัด X,Y ในระบบพิกัดฉากมาวางเรียงกันในแนวนอนหรือแนวตั้งแล้วจัดการเอาค่า X คูนค่า Y สลับแบบผูกเชือกรองเท้า คูนขึ้นเป็นบวก คูนลงเป็นลบ เรียกสูตรนี้ว่า  สูตรเชือกผูกรองเท้า (Shoelace’s formula) แต่เนื่องจากช่างสำรวจคงใช้สูตรนี้กันมากกว่าเพื่อนเลยเรียกอีกชื่อหนึ่งว่า Surveyor’s formula
soffice-bin_2016-12-22_11-12-12
Shoelace Formula (รูปดัดแปลงจากรูปต้นฉบับ wikipedia.org)
  • โดยที่ข้อแม้สูตรนี้คือจุดจะต้องเรียงกันไปไม่มีการไขว้กันเด็ดขาดแบบรูปด้านล่างsoffice-bin_2016-12-22_11-34-25
  • งานสำรวจแบบโลกเก่าคือออกพิกัดลอยของใครของมัน ใช้กล้อง Total station หรือโบราณกว่านั้นดึงเทปวัดมุม เก็บมุมพื้นที่ของแปลงแล้วนำค่าพิกัดรูปปิดมาคำนวณ ข้อดีคือได้พื้นที่จริงๆมาใช้งาน แต่ข้อเสียคือแผนที่ต่างคนต่างออกจากศูนย์พิกัดต่างกัน ถ้าแปลงติดๆกันไม่สามารถเอามาต่อกันได้ เอาไปเขียนลง google earth ก็ไม่ได้ ไม่รู้ว่ามันอยู่ตรงไหนของโลกนี้

ปัญหาการคำนวณพื้นที่กับค่า Scale factor

  • ในการทำแผนที่พื้นที่ใหญ่ๆ เนื่องพื้นผิวโลกมีความโค้ง ดังนั้นการทำแผนที่บนผิวโลกแล้วนำมาเขียนลงบนระบบแบนราบแบบกระดาษ จะเกิดความเพี้ยน (distortion) ยิ่งไกลมากยิ่งเพี้ยนมาก นักคณิตศาสตร์รุ่นเก่าจึงแก้ปัญหานี้โดยการคิดค้นประดิษฐ์เส้นโครงแผนที่ (Map projection) ที่เป็นระนาบราบ (ระบบพิกัดฉาก) โดยมีการฉาย (project) จุดจากบนผิวโลกลงมาจุดบนระนาบ
  • มีได้ย่อมมีเสีย ข้อดีคือแผนที่ต่างคนต่างทำ แต่อยู่บนระบบพิกัดฉากเดียวกัน ศูนย์กำเนิดเดียวกันสามารถนำมาต่อกันได้เพราะอยู่ในระบบเดียวกัน ข้อเสียคือแต่ละจุดบนเส้นโครงแผนทีจะมี Scale factor ที่แตกต่างกันไปไม่เท่ากัน การทำแผนที่บนเส้นพิกัดฉาก ในทางปฏิบัติจะต้องมีการทอนระยะทางที่วัดได้บนพื้นโลกด้วยการคูนเข้าค่าคูนมาตราส่วน (scale factor) จึงจะได้ระยะทางบนระบบพิกัดฉาก ปัญหาที่ scale factor แต่ละที่ไม่เท่ากันจึงเป็นปัญหาคลาสสิคที่สร้างความเวียนหัวให้กับคนทำแผนที่พอสมควร
  • ดังนั้นการทำแผนที่บนระบบพิกัดฉากเช่น UTM ทุกสิ่งทุกอย่างที่วัดบนพื้นโลกจะถูกทอนลงมาบนระบบพิกัดฉากด้วยค่า scale factor ปัญหาก็คือ ถ้านำค่าพิกัดของรูปปิด (polygon) ระบบพิกัดฉากมาคำนวณจะได้พื้นที่เรียกว่า Grid-based area จะไม่ตรงกับพื้นที่จริงๆ (Surface area) พื้นที่จริงๆนี่แหละครับที่เราต้องการ ที่จะนำไปใช้ในการซื้อขายที่ดิน หรือนำมาบริหารจัดการเกี่ยวกับที่ดินเช่นด้านการเกษตร เช่นการเตรียมปุ๋ยให้สอดคล้องกับพื้นที่จริงๆในกรณีมีที่ดินมากๆ

ทำความเข้าใจเรื่อง Scale Factor

  • ก่อนจะไปต่อเรื่องคำนวณพื้นที่จะมาทำความเข้าใจเรื่อง Scale factor บนแผนที่ระบบพิกัดฉาก Scale factor จะมีผลต่อความยาว ระยะทาง ทำให้มีผลต่อการคำนวณพื้นที่โดยปริยาย
Scale factor
Scale factor
  • จากรูปโมเดลด้านบน จะมีพื้นผิวสี่อย่างคือ
    • พื้นผิวภูมิประเทศบนโลก ช่างสำรวจทำการรังวัดบนนี้ครับ
    • พื้นผิวจีออยด์ (Geoid) คือพื้นผิวที่แทนระดับน้ำทะเลปานกลาง เราวัดความสูงสิ่งต่างๆบนโลกอ้างอิงค่าระดับจากพื้นผิวนี้
    • พื้นผิวทรงรีอาจจะเป็น WGS84 (ช่างรังวัดกรมที่ดินใช้ทรงรี Everest 1830) ค่าพิกัดภูมิศาสตร์ที่ได้จากเครื่อง GPS อ้างอิงที่พื้นผิว WGS84 นี้
    • พื้นระนาบราบ(ระบบพิกัดฉาก) บ้านเราใช้ UTM แผนที่ที่เราใช้กันส่วนใหญ่อยู่บนระบบนี้
  • การคำนวณหาค่าคูนมาตราส่วน (Scale factor) จะมีสองอย่างประกอบกัน โดยที่คำนวนสองขั้นตอน
    • Elevation Scale Factor (ESF) เป็นค่าคูนมาตราส่วนที่คูนกับระยะราบที่รังวัดได้บนพื้นผิวภูมิประเทศของโลกจะได้ระยะราบบนทรงรี หรือ ระยะราบบนทรงรี = ESF x ระยะราบบนพื้นโลก
    • Grid Scale Factor (GSF)  เป็นค่าคูนมาตราส่วนที่คูนกับระยะราบบนทรงรีจะได้ระยะราบบนระบบพิกัดฉาก หรือ ระยะราบบนระบบพิกัดฉาก = GSF x ระยะราบบนทรงรี
  • ดังนั้นถ้ารวบรัดสองขั้นตอนในขั้นเดียวจะได้ ระยะราบบนระบบพิกัดฉาก = ESF x GSF x ระยะราบบนพื้นโลก ค่า ESF x GSF นิยมเรียกว่า Combined Scale Factor (CSF)

ขั้นตอนที่ 1 คำนวณ Elevation Scale Factor (ESF)

  • ชื่อก็บอกมาแล้วว่าเกี่ยวข้องกับค่าระดับ ค่าระดับที่ใช้เป็นความสูงเหนือทรงรี นะครับไม่ใช่ระดับน้ำทะเลปานกลางเหนือจีออยด์ ถ้ากำหนดค่าระดับจากน้ำทะเลปานกลาง (MSL) ก็ใช้โปรแกรม EGM ของผมแปลงลงมาได้จากสูตร h = H + N (ความสูงจากระดับน้ำทะเลปานกลาง + ความสูงจีออยด์)
  • มาดูสูตรกันก่อน R คือรัศมีทรงรี ถ้าใช้ WGS84 ใช้ค่าหยาบประมาณ 6,372,000 เมตร

esf

  • สมมติจุดที่ต้องการหา ESF อยู่แลตติจูด = 12.9725° ลองจิจูด = 99.8329° ค่าระดับ =63.9 เมตร(เหนือระดับน้ำทะเลปานกลาง) คำนวณหา N ได้ด้วยโปรแกรม EGM (อยู่ในชุด Surveyor Pocket Tools อยู่แล้ว) ได้ความสูงเหนือจีออยด์ (N) = -31.6638 เมตร

surveyor-pocket-tools_2016-12-23_11-19-39

  • ความสูงเหนือทรงรี (h) = H + N = 63.9 – 31.6638 = 32.236 เมตร
  • ค่า ESF แบบหยาบๆ ใช้ค่า R โดยประมาณ ESF = 6372000/(6372000+32.236) = 0.999994941
  • ถ้าต้องการค่า ESF ทีละเอียดระดับทศนิยมตัวที่ 8-9 จะต้องคำนวณหาค่า R ละเอียดจากค่าแลตติจูดของบริเวณนั้นก่อน

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

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

 

  • ถ้าทรงรี WGS84 a = 6378137, b = 6356752.314, f=1/298.2572236, e² = 0.00669437998 แลตติจูด (Ɵ) = 12.9725° แทนที่ลงไปสูตร
  • R = 6378137 x √(1-0.00669437998 ) / (1-0.00669437998 x (sin(12.9725))² = 6358897.478
  • ESF = 6358897.478 / (6358897.478 + 32.236) = 0.999994931 (ค่าคำนวณแบบหยาบ 0.999994941)
  • สรุปได้ค่า ESF = 0.999994931 (ชีวิตยุ่งยากไปไหม โอกาสหน้าผมจะทำทูลส์เล็กๆ ไว้คำนวณหา ESF)

ขั้นตอนที่ 2 คำนวณหา Grid Scale Factor (GSF)

  • ต่อไปจะคำนวณหา GSF ค่านี้จะไม่ขึ้นกับค่าระดับ แต่จะขึ้นกับค่าลองจิจูด เช่นเดียวกันจะมีสูตรคำนวณค่าโดยประมาณและค่าละเอียด สูตรค่าละเอียดค่อนข้างจะยาวหน่อย ด้านล่างเป็นสูตรหาค่าโดยประมาณ

soffice-bin_2016-12-24_09-07-23

  • เช่นถ้าจุดมีค่าพิกัด N = 1,434242.632 E = 590,334.084. UTM Zone 47N WGS84 หา GSF โดยประมาณได้โดยการนำตัวเลขไปแทนที่สูตรด้านบน ใช้ค่ารัศมีโลก 6372000 เมตร จะได้ GSF = 0.9996(1 + (590334.084 – 500000)²/(2 * 6372000)) = 0.9997004496
  • ต่อไปมาดูค่าคูนมาตราส่วน Grid Scale Factor แบบละเอียด ก่อนจะไปต่อ ต้องรู้พารามิเตอร์ทรงรีที่ใช้ รู้ค่าพิกัดภูมิศาสตร์ในตำแหน่งที่ต้องการหา

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

  • ค่าที่ต้องเตรียมก่อนจะคำนวณหา Grid Scale Factor (GSF)

soffice-bin_2016-12-26_07-52-18

 

  • สูตร Grid Scale Factor สำหรับเส้นโครงแผนที่ UTM
soffice-bin_2016-12-24_11-09-00
Grid Scale Factor for UTM
  • มาลองคำนวณ กำหนดจุดมีค่าพิกัดดังนี้ N = 1,434242.632 E = 590,334.084 อยูบน UTM Zone 47N WGS84 เราต้องการหา latitude/longitude เปิดโปรแกรม “UTM -Geo converter” แล้วป้อนค่าพิกัด คำนวณดังรูป ได้ค่า latitude(Φ) = 12.9725056694 longitude(λ) = 99.8329042500 central meridian สำหรับโซน 47 คือ λ0=99  สำหรับนำไปคำนวณต่อ

surveyor-pocket-tools_2016-12-24_09-36-29

  • แทนที่สูตรหาค่า T = (tan(12.9725056694))² = 0.053067021
  • แทนที่สูตรหาพารามิเตอร์ของทรงรี WGS84 a = 6378137 f = 1/298.2572236 หาค่า e = √(2f – f²) = 0.08181919084 และค่า e’ = √(e²/(1-e²)) = 0.08209443794
  • หาค่า C = 0.08209443794² x (cos(12.9725056694))² = 0.00639987446
  • หาค่า A = (99.8329042500  – 99) x 3.141592654/180 * (cos (12.9725056694))² = 0.01416590874 (note : แปลงเป็น ดีกรี เป็น radian คูน ¶/180.0 เข้าไป)
  • หาค่า GSF (k) = 0.9996 x 1.000100987 = 0.9997009464 (ค่าโดยประมาณ 0.999704496)
  • สรุปค่า  GSF = 0.9997009464 

คำนวณ Combined Scale Factor (CSF)

  • ตัวอย่างข้างต้นที่ผมคำนวณหาค่า ESF กับ GSF เป็นจุดเดียวกัน ดังนั้น CSF = ESF x GSF
  • CSF = 0.999994931 x 0.9997009464 = 0.9996958785
  • ผมมีหมุด GPS อีกตัวหนึ่ง ค่าพิกัด  N = 1434091.770 E=590362.138   ค่าระดับ(รทก.) =  60.513 m.
  • คำนวณระยะราบได้ 153.448 เมตร ลองทอนระยะราบบนกริดกลับไปบนพื้นภูมิประเทศบนโลก = 153.448 / 0.9996958785 = 153.495 เมตร ถ้าเอากล้อง Total station ลองวัดระยะราบดูควรจะต่างจากนี้ไม่มาก ที่จริง combined scale factor จะต้องหาอีกจุดด้วยก่อนนำมาเฉลี่ยกัน แต่คงต่างกันไม่มากนัก ผมแค่อยากจะบอกว่า ระยะราบของหมุด  GPS สองตัว ที่เป็นระยะราบบนพิกัดฉาก UTM ทำไมเวลาช่างสำรวจไปตั้งกล้อง Total station แล้ววัดระยะราบแล้วทำไมไม่เท่ากัน ไม่เท่ากันเพราะอะไร แล้วจะคำนวณทอนระยะทางไปหากันได้อย่างไร

การประยุกต์ใช้ Combined Scale Factor

  • หลายๆท่านที่เป็นวิศวกรสำรวจ ช่างสำรวจ อาจจะผ่านงานโครงการใหญ่ๆ ยาวๆ เช่นงานถนน งานรถไฟ อาจจะมีโอกาสได้ใช้ CSF ปัจจุบันกล้อง total station ทันสมัย เราสามารถป้อนเอาค่า CSF พวกนี้เข้าไปในกล้องได้ กล้องเกือบๆทุกยี่ห้อจะเรียกตัวนี้ว่า “scale factor” ทำให้ลดความยุ่งยากกว่าสมัยแต่ก่อนที่ดึงเทปวัดระยะ ที่ต้องมาทอนระยะสดๆ เวลาไป setting out ก็อัพโหลดค่าพิกัดก่อน ในสนามก็สามารถ layout out ได้ถูกต้องไม่ต้องกังวลเพราะเรื่องที่เหลือกล้องจัดการให้
  • โครงการยาวๆแบบนี้ จึงต้องมาแบ่งตัดพื้นที่ออกเป็น block แต่ละ block คำนวณหาค่าเฉลี่ย CSF ที่แทนแต่ละพื้นที่ เวลาก่อสร้างช่วงรอยต่ออาจจะมีปัญหาเล็กน้อยที่โครงสร้างอาจจะไม่ต่อกันเป๊ะทีเดียว
  • ข้อควรจำ งานก่อสร้างประเภทนี้ จะออกแบบไว้บนระบบพิกัดฉาก UTM ดังนั้นคนออกแบบควรจะระลึกไว้ตลอดว่ากำลังออกแบบบนกริด ดังนั้นของที่วัดได้บนแบบ 500 เมตร ไม่ใช่ไปวัดในสนามได้ 500 เมตร (ยังมีคนที่เข้าใจแบบนี้อยู่ไม่น้อย) ผมเคยอ่านเจอบางกรณีที่ต่างประเทศ ถ้าบริเวณนั้น  CSF = 0.9995 คนออกแบบจะลง dimension ไว้ 499.75 เมตร ในแบบ เพื่อให้ที่เวลาก่อสร้างจริงจะวัดได้พอดี 500 เมตร
  • มีเอกสารที่เกี่ยวข้องกับการประยุกต์ใช้ Scale factor มากมายบนอินเทอร์เน็ตให้อ่านศึกษา ผมจะลงไว้ท้าย blog
  • เพราะระยะทางมันมี scale factor ที่เปลี่ยนผันไปตามพื้นที่และเป็นระบบ ดังนั้นเรื่องการคำนวณหาพื้นที่จึงต้องคำนึงถึงเรื่องนี้

การใช้งานโปรแกรมคำนวณพื้นที่ (Area) ในชุดโปรแกรม Surveyor Pocket Tools

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

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

  • ดูด้านขวามือดูตรง “ดาวน์โหลด (Download” มองหา “Surveyor Pocket Tools Vxxx build xxxx” คลิกเพื่อดาวน์โหลด สำหรับวินโดส์ 32 บิต ผมยังทำไฟล์ setup ให้อยู่ เมื่อโหลดมาแล้วก็ unzip แล้วก็ทำการติดตั้งได้ง่ายๆ
  • เมื่อติดตั้งแล้วคลิกที่โปรแกรม Surveyor Pocket Tools จะเห็นหน้าต่าง คลิกที่ไอคอนรูปโพลีกอน “Area” จะเห็นโปรแกรมคำนวณหาพื้นที่ขึ้นมาดังนี้
"Compute Area" on Surveyor Pocket Tools
“Compute Area” on Surveyor Pocket Tools

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

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

ขั้นตอนใช้งานพอสังเขป

  • การใช้งาน ผมจะกล่าวย่อๆเป็น work flow ดังนี้
    • เริ่มต้นจากเตรียมไฟล์ CSV ที่เก็บค่าพิกัดของรูปปิดที่จะหาพื้นที่ ค่าพิกัดอาจจะเป็นค่าพิกัดระบบพิกัดฉากบน UTM (อาจจะบน WGS84 หรือ Indian 1975) หรือว่าค่าพิกัดภูมิศาสตร์บน WGS84 ก็ได้
    • นำเข้าด้วยการ import โปรแกรมจะอ่านไฟล์แล้วทำการประมวลผลว่ามีตัวคั่นที่เหมือนกันทั้งไฟล์ไหม หรือว่ามีบรรทัดที่ไม่เหมือนบรรทัดอื่น ถ้าอ่านไม่ได้จะแจ้งให้ผู้ใช้ทราบ เมื่ออ่านเข้ามาแล้วจะแสดงผลที่ตารางข้อมูล
    • ทำการกำหนด header หรือหัวคอลัมน์ว่าช่องไหนเป็น Easting/Northing หรือ Latitude/Longitue หรือกำหนดชื่อจุดด้วยถ้ามี แต่ถ้าโปรแกรมมีหัว (header) โปรแกรมพยายามจัดให้อัตโนมัติ
    • ตั้งรูปแบบมุม ถ้าค่าพิกัดทีอ่านมาเป็นค่าพิกัดภูมิศาสตร์
    • คำนวณพื้นที่
    • ปักหมุดบน Google Maps หรือว่า Google Earth
    • ดูผลการคำนวณพื้นที่แบ่งเป็นพื้นที่บนทรงรี และพื้นที่บนระบบพิกัดฉาก
    • แปลงหน่วยพื้นที่เช่นจากตร.ม. เป็นไม่
    • Export ข้อมูลผลลัพธ์ เป็นไฟล์ CSV, Excel หรือ Shape file เพื่อนำไปใช้ในโปรแกรมด้าน GIS

โฟลเดอร์และไฟล์ทดสอบโปรแกรม

  • ผมมีไฟล์ตัวอย่างให้ทดสอบ แต่ไฟล์ตัวอย่างจะอยู่ที่โฟลเดอร์ที่ซ่อนของวินโดส์ จากหน้าโปรแกรมหลัก ดูที่ไอคอนล่างสุด จะเห็น “Example folder” ลองดับเบิ้ลคลิกเข้าไป จะเห็นโฟลเดอร์ย่อย “example data” ดับเบิ้ลคลิกเข้าไปจะเห็นไฟล์ดังรูป ตอนแนะนำการใช้โปรแกรมผมจะใช้ไฟล์ในโฟลเดอร์นี่เป็นหลัก
explorer_2016-12-24_13-41-57
Example folder
  • เพื่อให้ดูง่ายๆว่าในไฟล์ใช้ระบบพิกัดเป็นอะไร ชื่อไฟล์จะใส่ระบบพิกัดไปในชื่อไฟล์ด้วย และมีไฟล์ที่ขึ้นต้นด้วย “error….” เป็นตัวอย่างไฟล์ถ้าโปรแกรมเจอไฟล์แบบนี้แล้วจะอ่านไม่ได้ หรืออ่านได้แต่ไม่ประมวลผลเช่น ไฟล์มีค่าพิกัดแค่สองจุด กลายเป็นเส้นตรงไม่สามารถคำนวณหาพท.ได้

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

  • ลอง import ไฟล์แรก “boundary1-geo-wgs84.csv” ค่าพิกัดเป็นค่าพิกัดภูมิศาสตร์ ตอน browse เลือกไฟล์เสร็จจะเห็น preview สำหรับไฟล์นี้จะมีชื่อคอลัมน์ “No,Name,Latitude,Longitude”
Import CSV file
Import CSV file
  • ลองเปิดไฟล์นี้มา โปรแกรมจะแสดงข้อมูลที่อ่านมาลงในตารางดังรูปด้านล่าง โปรแกรมจะจัดคอลัมน์ให้ ถ้าไม่ตรงผู้ใช้ต้องมาจัดเอง หลักๆของการออกแบบคือไม่ว่าไฟล์ CSV ผู้ใช้จะเรียงแบบไหนก็ตามเช่น P,N,E หรือ P,E,N หรือ N,E,P ก็ตามโปรแกรมจะอ่านมาก่อน แล้วผู้ใช้ค่อยมากำหนดตามหลัง เพื่อให้ยืดหยุนและสะดวกต่อการใช้งาน

compute_area_header

  • ตอนนี้ยังไม่ได้กำหนดระบบพิกัด แต่ถ้าเผลอไปคลิกไอคอนรูปเครื่องคิดเลขเพื่อคำนวณโปรแกรมก็คำนวณให้ โดยที่นึกว่าค่าแลตติจูดและลองจิจูดเป็นค่าพิกัดฉาก x,y แต่พื้นที่ก็น้อยจนไม่เห็น ต่อไปจะปรับระบบพิกัด (Coordinate Reference System)
  • ตั้งระบบพิกัดเป็น Geographic โดยคลิกเลือกเป็น “WGS84 / Geographic” แล้วคลิกที่ไอคอนเครื่องคิดเลข จะเห็นผลลัพธ์สองอย่าง คือพื้นที่บนทรงรีคำนวณได้ 85129.837 ตร.ม. ส่วนพื้นที่บนระบบพิกัดฉากได้ 85061.858 ตร.ม. ต่างกัน 67.979 ตร.ม.
Area Computation
Area Computation

ปักหมุดรูปแปลงบน Google Maps

  • ตอนนี้เราทราบแล้วว่าทำไมพื้นที่ถึงไม่เท่ากันเพราะ scale factor นั่นเอง ต่อไปจะลองมาปักหมุดบน google maps ที่ไอคอนด้านขวามือคลิกไปที่ไอคอนของ google maps โปรแกรมจะ plot รูปปิดให้พร้อม ปักหมุดรอบรูปแปลง ตรงกลางจะมีหมุดสีแดง แสดงจุดศูนย์ centroid ของพื้นที่

nvidia-share_2016-12-24_15-49-01

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

  • คลิกที่ไอคอน google earth โปรแกรมจะถามฃื่อไฟล์ KML ที่จะจัดเก็บ จากนั้นก็พาบินเข้าพื้นที่ จะเห็นแปลงที่ดินดังรูป จะเห็น label แสดงพื้นที่บนทรงรี (Ellipsoidal Area) ที่จริงตอนผมเปิดเรื่องมาเป็นพื้นที่จริงบนผิวโลก ดังนั้นจะมีกระบวนการแปลงพื้นที่จากผิวทรงรีขึ้นไปบนพื้นผิวภูมิประเทศอีกที เอาไว้ในตอนหน้าครับ

explorer_2016-12-24_15-55-16

  • ในตอนหน้ามาดูการใช้งานโปรแกรม ถ้ากำหนดให้รูปแปลงที่ดินเป็นค่าพิกัดฉากในระบบ UTM บน Indian 1975 หรือ WGS84 จะตั้งค่ายังไง และมาดูเบื้องหลังการคำนวณว่าจากค่าพิกัดภูมิศาสตร์จะคำนวณเนื้อที่ได้อย่างไร

เอกสารอ้างอิง

The Return of Spot Fire ก้าวกลับมาอีกครั้งของ Spot Fire รุ่น 2.10 (ล่าสุด)

Spot Fire V2.10 รุ่นล่าสุด

  • และแล้วก็ได้เวลา upgrade โปรแกรมอีกตัว ซึ่งโปรแกรมเขียนตัวเลขค่าระดับส่งเข้า Autocad โดยตรง เป็นโปรแกรมเล็กมากๆ เรียกว่าเป็นทูลส์ (tools) ก็ได้ครับ ขนาดไฟล์ติดตั้ง 1.5 MB แค่นั้นเอง
  • เดิมทีโปรแกรมพัฒนาด้วย Delphi ซึ่งติดเรื่องลิขสิทธิ์ ผมพอร์ทโปรแกรมมา Lazarus ซึ่งใช้ Free pascal compiler เป็นคอมไพเลอร์ ที่ฟรีและ opensource เนื่องจากโค๊ดของ Dephi เป็นปาสคาลอยู่แล้วการพอร์ทโค๊ดมา Lazarus ซึ่งเป็นภาษาปาสคาลเหมือนกัน จึงเป็นเรื่องง่ายๆ และได้อัพเกรดความสามารถหลายๆอย่างเพิ่มเติมครับ
  • รองรับจอ 4K เหมือนทุกโปรแกรมที่อัพเดทก่อนหน้านี้

SpotFire_Intro

จุดกำเนิดโปรแกรม

  • งานสำรวจทางทะเลหรือแม่น้ำ สำรวจความลึกท้องทะเล (sea bed) หรือท้องแม่น้ำ (river bed) เรียกให้แคบในภาษาปัจจุบันคือ  Bathymetric Survey จะมีเอกลักษณ์เฉพาะตัว คือการเขียนเลขน้ำ (เขียนค่าระดับหรือความลึกตรงบริเวณจุดสำรวจ)

bathy_example

  • งานทางน้ำทางทะเล เลขน้ำลึกตัวเลขจะบวก ที่ตื้นค่าระดับจะเป็นลบ เลขน้ำทางสากล จะไม่เขียนจุดทศนิยม ถ้าเลขทศนิยมเป็นศูนย์ เช่น 1.0, 2.0 จะไม่เขียนเลขทศนิยมคือเลขศูนย์ ตัวเลขทศนิยมจะเป็นตัวห้อย ตัวหนังสือจะเล็กว่าเลขหลักประมาณ 70-80% (ดูรูปด้านบน ผมดาวน์โหลดจากอินเทอร์เน็ต) ถ้าเป็นเลขลบจะขีดเส้นใต้ตัวเลขตัวหลัก ส่วนทศนิยมจะไม่มีขีดด้านล่าง
  • ตัวหนังสือนิยมเขียนตัวเอียงแบบ oblique อีกเอียงโย้ไปด้านหลังประมาณ 15 องศา ลองดูแผนที่เดินเรือแบบสากล สังเกตที่ตื้นๆสีเขียวเข้มๆด้านขวาค่าระดับจะเป็นลบ จะมีขีดใต้ตัวเลขหลัก

portion-of-raster-chart

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

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

  • ดาวน์โหลดได้ที่ SpotFire V2.10 แบบ 64 bit และ SpotFire V2.10 แบบ 32 bit ตอนนี้เป็น build 2370 หรือถ้าลิ๊งค์ตรงนี้ขาดให้ดูด้านขวามือของ blog ในส่วน Download เมื่อดาวน์โหลดมาแล้วก็ unzip แล้วทำการติดตั้งง่ายๆ ติดตั้งแล้วจะเห็นไอคอนของโปรแกรมอยู่บน desktop ดับเบิ้ลคลิกเพื่อเปิดโปรแกรม

spotfire_icon_desktop

เปิดโปรแกรม

  • เปิดมาหน้าแรกจะเป็นหน้าต่างของแท็บ “Options” ที่เป็นหน้าให้ป้อนค่าตัวเลือกเพื่อควบคุมตัวเลขค่าระดับ ตั้งแต่กำหนดมาตราส่วนของแผนที่ ฟอนต์ ขนาดตัวเลข และอื่นๆ
  • ส่วนทูลบาร์ มีแค่สองไอคอนคือเปิดไฟล์ กับส่งตัวเลขค่าระดับเข้า Autocad

spotfire_introduction

  • อีกหน้าจะเป็นหน้าต่างของแท็บ “Points” ไว้แสดงข้อมูล X,Y,Z หรือ N,E,Z ที่อ่านได้จากไฟล์ CSV ตอนนี้ยังโล่งเพราะยังไม่มีข้อมูล

SpotFire_points

ทดสอบข้อมูล

  • ข้อมูลตัวอย่างเก็บไว้ที่ “C:\Users\ชื่อผู้ใช้\Appdata\Roaming\Spot Fire\Examples Data” ซึ่งจะเป็นโฟลเดอร์ที่ซ่อนไว้ จะใช้ตัวช่วย คลิกที่เมนู “Help > Examples Data Folder…” ดังรูป

spotfire_open_examples_folder

  • โปรแกรมจะบอกว่าได้ก๊อปปี้พาท (path) ของโฟลเดอร์ตัวอย่างข้อมูลไปไว้ในคลิปบอร์ดเรียบร้อยแล้ว คลิก “OK” เพื่อปิด

spotfire_copytoclipboard

  • โปรแกรมจะเปิด Windows Explorer แสดงพาทที่เก็บข้อมูล จะเห็นไฟล์ชื่อ “Cavite-NEZ.csv” เราจะทดสอบไฟล์นี้ก่อน ไฟล์ข้อมูลจะเป็น text file ที่เก็บจุดงานสำรวจ (point) ไว้ในรูปแบบ NEZ โดยที่ใช้ตัวคั่นคือเครื่องหมายคอมม่า

spotfire_tested_file

เปิดไฟล์ข้อมูล

  • กลับมาที่โปรแกรมกันต่อ ที่ทูลบาร์คลิกไอคอน “Open CSV text file…

spotfire_open_file_icon

  • จะเห็นไฟล์ไดอะล็อก เนื่องจากพาทข้อมูลที่วินโดส์ซ่อนไว้ ถ้า browse จะมองไม่เห็น วิธีการคือเอาพาทที่เราก็อปปี้ไปไว้ในคลิปบอร์ดมาวาง (pasted) บนพาทของไดอะล็อก กด “Enter” ที่คีย์บอร์ดครั้งหนึ่ง เลือกไฟล์ เลือกรูปแบบไฟล์เป็น N,E,Z แล้วเปิดไฟล์ ดูรูปประกอบ

spotfire_selected_file

  • ตอนเลือกรูปแบบไฟล์ต้องเลือกให้ตรง เพราะบางท่านนิยมเก็บไว้ในรูปแบบ E,N,Z ค่า N และ E บางครั้งมีค่าใกล้เคียงกัน ผมไม่สามารถโปรแกรมให้อ่านไฟล์ แล้วตัดสินใจเลือกว่าคอลัมน์ไหนเป็น N หรือ E ซึ่งอาจจะผิดพลาด ผู้ใช้ต้องเลือกเองครับ
  • Format ของ CSV มี 4 รูปแบบที่โปรแกรมอ่านได้คือ
    • P,N,E,Z,D (P = Point No. D=Description) และ P,N,E,Z
    • P,E,N,Z,D และ P,E,N,Z
    • N,E,Z,D และ N,E,Z
    • E,N,Z,D และ E,N,Z

ตรวจสอบข้อมูล

  • ไฟล์ข้อมูล “Cavite-NEZ.csv” ที่เปิด จะมีจำนวนจุดประมาณ 19789 จุด โปรแกรมใช้เวลาอ่านนิดเดียว คลิกที่แท็บ “Points” มาดูข้อมูลบนตารางข้อมูล ตารางนี้ดูได้อย่างเดียวไม่สามารถแก้ไขได้

spotfire_data_table

  • เปิดเมนู “File > Properties” จะเห็นค่าระดับลึกสุด = 43.160 เมตร ค่าตื้นสุด = -1.060 เมตร ไฟล์งานนี้เป็นไฟล์สำรวจ seabed ของทะเล

spotfire_file_properties

ตั้งค่าตัวเลือกเพื่อตั้งรูปแบบตัวเลขค่าระดับ

  • คลิกแท็บกลับมาที่ “Options” รูปด้านล่างดูแล้วอาจจะลายตา ทนเอาหน่อยครับ หน้านี้เป็นการกำหนดรูปแบบให้ตัวเลข อย่างเช่นอันดับแรกมาตราส่วน ผมเลือกมาตราส่วน 1 : 20000 เพราะงานสำรวจเป็นพื้นที่ขนาดใหญ่ในทะเลติดชายฝั่งแห่งหนึ่ง

spotfire_set_options

  • มาตราส่วนแผนที่จะเป็นสิ่งแรกที่เราคิดไว้ก่อนสิ่งอื่น 1 : 20000 เทียบแบบนี้จะเข้าใจง่าย 1 มม. บนแผนที่ = ขนาดจริงบนโลก 20000 มม. หรือ 1 มม.บนแผนที่ = 20 เมตร (หาร 20000 ด้วย 1000) ฉะนั้นเวลากำหนดตัวอักษรสูงขนาด 2 มม. เวลาเขียนแบบตัวอักษรใน CAD จะต้องตั้งความสูงเท่ากับ 2 x 20 = 40 เมตร (ถ้าเรากำหนดหน่วยเขียนแบบใน CAD เป็นหน่วยเมตร) แต่ไม่ต้องปวดหัวครับ ถ้าตั้งมาตราส่วนเท่าไหร่โปรแกรมจะคำนวณมาให้ถูกต้องได้ถูกต้องเท่านั้น
  • Text layer สามารถเลือกเป็น “Single layer” โปรแกรมจะใช้ชื่อเลเยอร์ “SpotText” โดยอัตโนมัติ แต่ถ้าเลือก “Multiple layers” โปรแกรมจะสร้างให้ตามชั้นหรือช่วงของค่าระดับ (Color band)
  • เลือกฟอนต์ไว้เป็น “Romans” เพราะตัวเลขจะออกมาสวย เลือกความสูงตัวเลขหลัก 2 มม. ตัวทศนิยมจะเป็นตัวห้อยขนาดเล็กกว่า ขนาด 1.5 มม. ไม่หมุนตัวเลข จัดให้ตัวเลขเอียงไปด้านหลัง (Oblique) 15 องศา
  • รูปแบบเครื่องหมายลบ เลือก “Underlineขีดเส้นใต้ล่างตัวเลขหลัก กำหนดจำนวนทศนิยม 1 ตำแหน่ง ไม่แสดงเครื่องหมายจุดทศนิยม
  • จะเขียน point ลงให้ไปด้วย ตั้งชื่อเลเยอร์ “Points
  • เลือกจำนวนจุด (Select point every) ในเบื้องต้นตั้งเป็น 1 สามารถตั้งค่าอื่นได้เช่น ตั้งเป็น 4 ถ้าจุดเรียงกันไป 1,2,3,4,5,6,7,8…. โปรแกรมจะเลือกจุดที่ 1 จุดต่อไปจะเลือกจุดที่ 5 (ทุกๆ 4)
  • ในตอนนี้โปรแกรมจะตั้งค่าปริยาย Automatic color band interval = 5 เมตร ถ้าเปลี่ยนค่าโปรแกรมจะคำนวณให้ใหม่โดยคลิกที่ปุ่มยาวๆ “Apply” ด้านล่าง
  • จะเห็นว่าแบ่งค่าระดับจากมากไปน้อยได้ 10 ระดับ โปรแกรมจะเลือกสีมาให้เช่นกัน 10 สี และตั้งค่าเลเยอร์ตามค่าระดับอีก 10 เลเยอร์

ปั๊มตัวเลขค่าระดับเข้า Autocad

  • ก่อนจะปั๊มตัวเลขเข้า ขอให้เปิดโปรแกรม Autocad  ไว้ก่อน เพราะไม่งั้น Autocad ใช้เวลาเปิดนาน โปรแกรม Spot Fire อาจจะรวน
  • ที่ทูลบาร์คลิกที่ไอคอน Autocad

spotfire_fire_to_acad_icon

  • เมื่อสถานะการส่งจุดครบ 100% ไปที่โปรแกรม Autocad จะเห็นจุดดังรูป

autocad_all_points_cavite

  • ลอง Zoom เข้าไปดูใกล้ๆ จะเห็นว่าจุดแน่น ตัวเลขค่าระดับติดกันเป็นพรืด

dense_points

  • ที่ Options ตรงเลือกจุด (Select point every) เพิ่มจาก  1 เป็น 4 แล้วส่งจุดเข้า Autocad อีกครั้ง เมื่อครบ 100%  ซูมดูอีกครั้ง จะเห็นตัวเลขอยู่ห่างกันพอประมาณ และสีตัวเลขเป็นไปตามช่วงค่าระดับที่ตั้งไว้ ส่วนตัวเลขทับกันตรงที่แนวตัดกัน ต้องอาศัยลบออกด้วยมือครับ

dense_points_level2

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

points_onshore

  • ตรวจสอบเลเยอร์ใน Autocad ที่ Layer properties ว่าโปรแกรมเขียนมาให้ตามที่ต้องการไหม ก็โอเคครับ

Autocad_layers_banding

 

เลือกรูปแบบที่กำหนดไว้แล้ว

  • ในแท็บ “Options” ตรง Annotation style จะมี “User define” ถ้าเลือกตัวนี้ ผู้ใช้จะเป็นคนกำหนดเอง แต่ถ้าเลือก Preset style จะเป็นสไตล์ที่โปรแกรมเตรียมไว้ให้ จะขอกล่าวถึง Preset Style #1 อันเป็นการเขียนเลขน้ำสไตล์กรมเจ้าท่าของไทย ที่มีเอกลักษณ์เฉพาะตัว ตัวเลขจะเอียงไปด้านหลัง 15 องศา ตัวทศนิยมตัวเล็กกว่าแต่จะไม่ห้อย เขียนเสมอกับตัวเลขหลัก จุดทศนิยมใช้เครื่องหมายคอมม่า ที่ขีดตรงๆ ถ้าค่าเป็นลบ จะขีดเส้นใต้เครื่องหมายคอมม่า

spotfire_preset_style_1

  • เลือก  “Preset style #1” แล้วส่งจุดเข้าโปรแกรม Autocad อีกครั้ง ดูตัวเลขสไตล์ของกรมเจ้าท่า สวยงามครับ

points_doh_style

  • หรือตัวเลขติดลบบนฝั่ง เครื่องหมายลบใช้ขีดใต้เครื่องหมายคอมม่า

points_doh_style_onshore

  • ลองทดสอบดู “Preset Style #3” ตัวเลขจะหมุนทวนเข็ม 15 องศา

points_preset_style_3

สรุป

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

SpotFire_About

สิ้นสุดการรอคอย XSection Plot รุ่น 4.10 มาแล้ว ตอนที่ 3 (จบ)

10.การจัดเรียงรูปตัดบนกระดาษเขียนแบบ (Page Layout)

  • การจัดเรียงรูปตัด เลือกทูลบาร์และคลิกที่ “Page layout” ได้ดังรูป

page_layout_toolbar

  • ความยาวของรูปตัดแต่ละรูปตัด ความกว้างในแนวดิ่ง มาตราส่วน จะมีผลต่อขนาดของรูปตัดแต่ละรูป ที่่จะวางบนกระดาษเขียนแบบ  การจัดเรียงรูปตัดให้เหมาะสม ผู้ใช้สามารถเลือกจำนวนรูปตัดในแนวดิ่ง จำนวนรูปตัดในแนวนอน ลองตั้งค่าตามรูปด้านล่าง เนื่องจากข้อมูลที่เรากำลังทดลองใช้งานอยู่มี 4 รูปตัดและความกว้างของรูปตัดประมาณ 1300 เมตร จึงยาวจรดกระดาษซ้ายขวา จำนวนรูปตัดในแนวดิ่งจึงเลือกเป็น 1 ส่วนจำนวนรูปตัดในแนวนอนเลือกเป็น 4

page_layout_1

  • มาดูตั้งค่าให้กริดทางราบ จัดระยะราบจาก CL (ค่าที่ X = 0) ไปด้านซ้าย ตั้งไว้ 700 เมตร เผื่อยาวเกินกว่าข้อมูลไว้นิดหนึ่งไม่ให้รูปตัดไปชน ด้านขวาตั้งไว้ 650 เมตร ส่วนระยะราบของกริดแต่ละช่อง(grid spacing) เลือกไว้ 10 เมตร

page_layout_2

  • มาดูการตั้งกริดทางดิ่ง ผมตั้งไว้ 21 เมตร ระยะของช่องกริดทางดิ่ง (มาตราส่วน 1:200) 1 เมตร ดูรูปกราฟฟิคที่ลากลูกศรเชื่อมโยงด้านล่างเพื่อความเข้าใจ และตั้งระยะของช่องกริดทางดิ่ง 1 เมตร

page_layout_3

  • เวลาเปลี่ยนค่า ต้องกปุ่ม “Apply” เพื่อโปรแกรมจะได้จัดวางรูปตัดให้ใหม่ ถ้ารูปตัดทับซ้อนกันโปรแกรมจะเตือนให้ทราบ ผมเตรียมไอคอนบนทูลบาร์ด้านบน เพื่อ  copy ค่าพิกัดของรูปตัดเมื่อเทียบกับค่าพิกัดของกระดาษ มุมล่างซ้าย x,y = 0,0 หน่วยเป็น ซม.ครับ เมื่อคลิกที่ไอคอน โปรแกรมจะคัดลอกค่าพิกัดลงไปตารางข้อมูล จากนั้นคลิก “OK” เพื่อปิดหน้าต่างไดอะล็อก

page_layout_coors

  • บันทึกไฟล์ข้อมูลลงดิสค์ ให้เรียบร้อย

11.แสดงรูปตัดตามขวาง (Section Viewer)

  • ในที่สุดก็มาดูรูปตัดที่เราตั้งค่าไว้ ว่าตรงตามที่ต้องการหรือไม่ ที่ทูลบาร์ คลิก “Section Viewer”

section_viewer_toolbar

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

section_viewer_elements

  • ค่าที่เราตั้งค่าสำหรับรูปตัดไว้ก่อนหน้านี้ เช่นค่าระดับกริดเส้นบน (Top grid elevation) หรือไม่รูปแบบการเขียนตัวเลข จะส่งผลต่อรูปตัด พิจารณาดูรูปด้านล่างที่แสดงเส้นลูกศรเชื่อมโยง

section_viewer_shown_topgrid_int

  • ส่วนค่าอื่นๆเช่นตั้งค่าให้คำนวณหาพื้นที่ดินตัด (cut) หรือดินถม (fill) หรือหาจุดตัดระหว่าง typical  และเส้นดินเดิม

section_viewer_shown_calcarea_interval

  • สังเกตรูปตัดด้านบนจะเห็นว่าตัวรูปตัดตกจากเส้นกริดลงมาด้านล่างเนื่องจากค่าระดับกริดเส้นบนใส่ค่ามากไป จากที่โปรแกรมคำนวณมาให้ ลองกลับไปตั้งค่าใหม่จาก 6 เมตร เป็น 4 เมตร จะเห็นว่ารูปตัดเลื่อนขึ้นไปอยู่ในกริด แต่เส้น existing ground ล้นกริดด้านบนไปแทน ซึ่งสามารถ trim ออกได้ในโปรแกรมด้าน CAD ในภายหลัง

section_viewer_shown_new_topgrid_elev

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

section_viewer_interactive

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

section_viewer_next_prev12.บันทึกไฟล์ Autocad DXF (Save to DXF)

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

save_to_dxf_toolbar

  • โปรแกรมจะแสดงไดอะล็อก คลิกที่รูปไอคอนรูปดิสเก็ตเพื่อเลือกโฟลเดอร์ที่จะจัดเก็บตลอดทั้งป้อนชื่อไฟล์ทึ่จะบันทึกเป็น dxf ดังรูป

save_to_dxf_inputfile

  • เมื่อเสร็จสิ้นโปรแกรมจะขึ้น message box ว่าจัดเก็บเรียบร้อย คลิก “OK” และ “Close” เพื่อปิด

save_to_dxf_ready

13.เปิดไฟล์ด้วยโปรแกรมด้าน CAD

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

draftsight2d-first

  • จะเห็นว่าตัว hatch สำหรับพื้นที่ดินตัด ดินถม ทึบสนิท ทั้งๆที่ผมตั้ง scale ของแฮ็ทช์ไว้ 1.0 ปัญหาไม่ใช่ของ Draftsight แต่มาจากไฟล์ dxf ซึ่งผมคิดว่าน่าจะเป็นไลบรารีเขียน dxf ที่ผมใช้งานอยู่คือ ezdxf แต่ไม่เป็นไรวิธีแก้กลับคือไปคลิกเลือก hatch ทุก section ที่ property มองหา scale เจอแล้วจะเห็นตัวเลข 1.000 ป้อนค่าใหม่เป็น 10.000 (หรืออะไรก็ได้) จากนั้นป้อนกลับไปค่าเดิมอีกครั้งเป็น 1.000 เหมือนเดิม จะเห็น hatch เปลี่ยนเป็นโปร่งขึ้น
  • ปัญหา hatch นี้เปิดใน Autocad ก็เป็นครับ

 

draftsight2d-hatch_ok

  • ผมลองเปิดข้อมูลเก่าที่ Titleblock เป็นภาษาไทย ลองดูก็ใช้ได้บน Draftsight สำหรับ Draftsight แบบสองมิติ อ่านดูในเน็ตเห็นว่ารุ่นนี้ฟรี (แต่ต้องลงทะเบียน ซึ่งง่ายๆ ถามไม่กี่คำถาม) แต่ก็ไม่แน่ใจว่าฟรีไปตลอดหรือไม่ ซึ่งก็น่าใช้งานมากครับถ้าฟรีตลอด สำหรับท่านที่ใช้งานแคด ที่ไม่ได้มีงานสามมิติเข้ามาเกี่ยวข้อง ดีกว่าไปละเมิดลิขสิทธิ์

draftsight2d_thai_ok

สรุป

  • โปรแกรมนี้ใช้เวลาพัฒนาประมาณ 2 ปีกว่าๆ แต่ไม่ได้ต่อเนื่องนะครับ เนื่องจากเขียนเป็นงานอดิเรก ไม่มีความกดดันอะไร ถือว่าเป็นการศึกษาด้านโปรแกรมมิ่งในตัวโดยเฉพาะ python เขียนสนุก กระชับ ทรงพลัง มีแง่บางอย่างที่นึกไม่ถึงว่าภาษาสามารถทำได้ และที่สำคัญมีไลบรารีหรือโมดูลให้ใช้มากมาย ส่วนใหญ่ฟรี เมื่อมารวมกับ Qt framework ที่เก่งอยู่แล้ว โปรแกรมที่เขียนออกมาแล้วจึงดูเป็นมืออาชีพพอสมควร แต่ก็แจ้งเตือนก่อนว่าโปรแกรม XSection Plot รุ่นนี้ยังมีบั๊กอยู่บ้าง ถ้าพบก็แจ้งมาได้ที่ blog นี้
  • เกือบลืมบอกไป โปรแกรมนี้สนับสนุนจอ 4K เรียบร้อยแล้ว ไม่มีปัญหาเรื่องไอคอนเล็ก ตัวหนังสือเล็ก

xsectionplot_about

  • ก่อนจากกันก็ขอบอกว่าโปรแกรมทุกโปรแกรมที่ผมพัฒนาขึ้นมายังคง concept เหมือนเดิมคือให้ใช้ฟรี และสำหรับช่างสำรวจและช่างโยธา เหมือนเดิมครับ

สิ้นสุดการรอคอย XSection Plot รุ่น 4.10 มาแล้ว ตอนที่ 2

6.เปิดไฟล์ข้อมูล (Open file)

  • ขั้นตอนต่อไปจะมาเปิดไฟล์ข้อมูล เริ่มจากไฟล์ Typical section ที่จัดเก็บไว้ใน Documents ขั้นตอนตามรูปด้านล่าง ขั้นตอนที่ 3 เลือกประเภทของไฟล์เป็น .txml โปรแกรมจะอ่านข้อมูล และแสดงผลบนตารางในแท็บ “Typical section”

open_typical_section_file

  • ต่อไปเช่นเดียวกันเปิดไฟล์ Existing Ground section

open_ground_section_file

7.ป้อนข้อมูลโครงการ

  • ตอนนี้ข้อมูลของเราที่ได้จาก import  จาก text file มีแต่รูปตัดในตารางเท่านั้น เราจะทำการบันทึกข้อมูลโครงการของงาน นอกจากบันทึกเพื่อจำแล้วยังสามารถนำไปเขียนเป็น Titleblock ใน Autocad คลิกที่ Toolbar ดังรูปด้านล่างedit_titleblock
  • จะเห็นหน้าต่างไดอะล็อกให้ป้อนข้อมูล ถ้ามีข้อมูลอะไรให้ลบออกหมด เนื่องจากโปรแกรมจะบันทึกสถานะครั้งสุดท้ายที่ใช้เอาไว้set_project_info_procedure
  • ป้อนข้อมูลโครงการเข้าไป (ข้อมูลมาจากการสำรวจจริง แต่ชื่อโครงการ บริษัท ชื่อคน สมมุติหมด)

set_project_info_filled

เลือกภาษาให้  Titleblock

  • ที่ผมเตรียมไว้ให้มีภาษาไทยกับอังกฤษเท่านั้น ถ้าต้องการใช้ภาษาไทยก็คลิกตามรูป

set_project_info_locale

8.ตั้งขนาดกระดาษสำหรับเขียนแบบ (Page Setup)

  • สำหรับงานเขียนแบบใน Autocad แล้วขนาดกระดาษที่เราใช้มักจะเป็นขนาดกระดาษมาตรฐานได้แก่ A4, A3, A2, A1 และ A0 ขึ้นอยู่กับขนาด printer หรือ plotter ที่ใช้ด้วย ที่ทูลบาร์หลักคลิกที่ “Page Setup”

page_setup_toolbar

  • จะมีหน้าต่างไดอะล๊อกให้เลือกตั้งขนาดกระดาษ (ขนาดกระดาษกำหนดโดยผู้ใช้  Custom Paper Size โปรแกรมตอนนี้ยังไม่ support) เลือก A1 ดังรูป

page_setup

9.ตั้งค่ารูปตัด (Cross-section settings)

  • รูปแบบรูปตัดเช่นการเลือกมาตราส่วนทางราบและทางดิ่งให้ตรงกับความต้องการ การจัดรูปแบบตัวอักษร ค่า x,y (offset/elevation) หรือการตั้งจำนวนทศนิยม สามารถตั้งค่าได้ที่นี่ จากทูลบาร์หลักเลือก “Xsection Settings” ดังรูป

section_settings_toolbarตั้งค่าทั่วไป

  • จะเห็นหน้าต่างไดอะล็อก มีแท็บทั้งหมด 4 แท็บ แยกค่าที่จะตั้งเป็นสัดส่วน มาดูหน้าแรกสำหรับตั้งค่ารูปตัดทั่วๆไป

section_settings_page1_desc

  • ข้อสังเกตรูปตัดจะเห็นว่าใช้มาตราส่วนทางราบ 1 : 2000 คิดง่ายๆ ในแผนที่วัดได้ 1 มม. = ระยะจริงในสนามได้ 2 เมตร หรือในแผนที่วัดได 1 ซม. เท่ากับระยะจริงในสนาม 20 เมตร ขนาดกระดาษ A1 594 x 871 มม. แต่ขนาดที่ปริ๊นท์ได้เท่ากับ 517 x 817 มม. ถ้าวางกระดาษในแนวนอน (landscape) ความยาวคร่าวๆคือ 800 มม. สามารถเขียนแบบรูปตัดตามขวางได้เท่ากับระยะในสนาม = 2 x 800 เมตร = 1600 เมตร
  • ถ้ากลับไปดูข้อมูลในตารางจะเห็นว่าจากซ้ายไปขวาประมาณ 1300 เมตร ซึ่งกระดาษ A1 และมาตราส่วนนี้สามารถเขียนแบบได้โดยที่ไม่ล้นกระดาษ

ตั้งค่ารูปแบบตารางแสดงตัวเลข offset/elevation

  • จากหน้าต่างไดอะล็อก คลิกที่แท็บที่ 2 เลือกรูปแบบแสดงตัวเลข  offset/elevation  จาก 3 รูปแบบที่มีรูปตัวอย่างแสดงไว้ให้เห็นง่ายๆ ที่นี้ผมเลือก  Type 3 ดังรูปด้านล่าง

section_settings_page2_desc

ตั้งค่าตัวหนังสือคำหน้า/ตามหลัง ค่าระดับ datum

  •  ที่หน้าต่างไดอะล็อกคลิกที่แท็บตัวที่ 3 “Grid datum postfix/prefix” เลือกแบบที่สาม เขียนตัวหนังสือ CD (Chard Datum)  ตามหลังค่าระดับ 0.0  บางครั้งงานทางทะเลจะระบุว่าค่า 0.0 เมตร อิงอยู่กับอะไรเช่นน้ำทะเลปานกลาง (MSL) หรือ Chart Datum (CD)

section_settings_page3_desc

 ตั้งค่าระดับเส้นกริด

  • เป็นการตั้งค่าระดับเส้นกริดตัวบนสุด ปรับได้ตามต้องการเพื่อให้รูปตัดอยู่กลางๆรูปตัด จะได้ดูง่าย ไม่อึดอัด

section_settings_page4_desc

  • แต่ก็สามารถเลือกตั้งได้อัตโนมัติโดยโปรแกรม ดูรูปด้านล่างประกอบ เมื่อเสร็จสิ้นการตั้งค่ารูปตัด สามารถคลิกปุ่ม “OK” เพื่อออกจากไดอะล็อก

section_settings_page4_auto

  • ต่อไปบันทึกข้อมูลลงไฟล์ ที่เราแก้ไขตั้งค่ารูปตัด โปรแกรมจะเก็บค่าทั้งหลายเอาไว้ในไฟล์ Existing ground section รวมทั้งข้อมูล offset/elevation ในตารางทุก  section
  • ก่อนจะทำอะไรต่อ ให้คลิกรูปดิสค์เก็ตที่ทูลบาร์ เพื่อบันทึกข้อมูลลงดิสค์ โลกสวยด้วยมือเราครับ

เปิดดูไฟล์ข้อมูล

  • ลองเปิดไฟล์ข้อมูลด้วยโปรแกรมเช่น  Notepad, Notepad++  จะเห็นข้อมูลดังข้างล่าง (คลิกที่สี่เหลี่ยมลิ๊งค์ด้านล่าง เพื่อขยายออกมา)
<root version="1.0">
<!--Generated by XSection Plot-->
<!--This data file is Existing ground section-->
<Header>
<AppName>XSection Plot</AppName>
<Developer>Prajuab Riabroy</Developer>
<Version>4.1.512</Version>
<SectionType>Ground</SectionType>
<DateCreated>2016-08-15 21:09:30.751163</DateCreated>
</Header>
<ProjectInfo>
<ProjectName>Macuzy International Port</ProjectName>
<ClientName>MX Port Authority</ClientName>
<ContractorName>East West Construction & Engineering</ContractorName>
<DrawingTitle>X-Section of Approach Channel</DrawingTitle>
<DrawnName>Sergio Motezia</DrawnName>
<ApprovedName>Prati Wisas</ApprovedName>
<ClientApprovedName>Mario P. Tenes</ClientApprovedName>
<CheckedName>Antonio Molibzo</CheckedName>
<SurveyorName>Suras Malcom</SurveyorName>
<SurveyedDate>1-7/03/2016</SurveyedDate>
<DrawingNo>2017-MZ-001-PLN-020</DrawingNo>
<SheetNo>1 / 50</SheetNo>
<DrawingDate>1-7/03/2016</DrawingDate>
<Revision></Revision>
<UseLocaleLanguage>False</UseLocaleLanguage>
<MapTexts>
<MapText Label="Client" Locale="เจ้าของโครงการ"/>
<MapText Label="Contractor" Locale="ผู้รับจ้าง"/>
<MapText Label="Drawn" Locale="เขียน"/>
<MapText Label="Design" Locale="ออกแบบ"/>
<MapText Label="Surveyor" Locale="ผู้สำรวจ"/>
<MapText Label="Surveyed Date" Locale="วันที่สำรวจ"/>
<MapText Label="Checked" Locale="ตรวจสอบ"/>
<MapText Label="Approved" Locale="อนุมัติ"/>
<MapText Label="Client Approved" Locale="ผู้คุมงานอนุมัติ"/>
<MapText Label="Drawing No." Locale="แบบเลขที่"/>
<MapText Label="Plotted Date" Locale="แบบวันที่"/>
<MapText Label="Project" Locale="โครงการ"/>
<MapText Label="Drawing Title" Locale="แผนที่แสดง"/>
<MapText Label="Sheet No." Locale="แบบเลขที่"/>
<MapText Label="Scale" Locale="มาตราส่วน"/>
<MapText Label="Vertical" Locale="ทางดิ่ง"/>
<MapText Label="Horizontal" Locale="ทางราบ"/>
<MapText Label="Vertical Scale" Locale="มาตราส่วนทางดิ่ง"/>
<MapText Label="Horizontal Scale" Locale="มาตราส่วนทางราบ"/>
<MapText Label="Legend" Locale="สัญลักษณ์"/>
<MapText Label="Note" Locale="หมายเหตุ"/>
<MapText Label="Geodetic Information" Locale="ข้อมูลระบบพิกัด"/>
<MapText Label="No." Locale="ครั้งที่"/>
<MapText Label="Amendments" Locale="ความเห็น"/>
<MapText Label="By" Locale="โดย"/>
<MapText Label="Date" Locale="วันที่"/>
<MapText Label="Revision" Locale="ครั้งที่แก้ไข"/>
</MapTexts>
</ProjectInfo>
<SectionOptions>
<VerticalScale>200.0</VerticalScale>
<HorizontalScale>2000.0</HorizontalScale>
<HozGridSpace>10.0</HozGridSpace>
<VertGridSpace>1.0</VertGridSpace>
<GridLineType>0</GridLineType>
<CalcIntersection>True</CalcIntersection>
<CalcArea>True</CalcArea>
<TrimTypical>False</TrimTypical>
<NumDecimalElev>3</NumDecimalElev>
<NumDecimalDist>3</NumDecimalDist>
<UseIntervalText>True</UseIntervalText>
<IntervalDist>20.0</IntervalDist>
<PrefixText></PrefixText>
<PostfixText>CD</PostfixText>
<UsePostPrefix>0</UsePostPrefix>
<UseOffsetElevFormat>2</UseOffsetElevFormat>
<CalcPlotAreaCut>True</CalcPlotAreaCut>
<CalcPlotAreaFill>True</CalcPlotAreaFill>
<NumVertCLLeft>70</NumVertCLLeft>
<NumVertCLRight>65</NumVertCLRight>
<NumHozTopBottom>21</NumHozTopBottom>
<LeftSideText>LT.</LeftSideText>
<RightSideText>RT.</RightSideText>
<StationText>Km.</StationText>
<SelectedTBlock>2</SelectedTBlock>
<NumSectionRows>4</NumSectionRows>
<NumSectionColumns>1</NumSectionColumns>
<SurveyType>0</SurveyType>
<PlotTBlock>True</PlotTBlock>
<SwapLeftAndRight>False</SwapLeftAndRight>
</SectionOptions>
<PageSetup>
<Size>A1</Size>
<Width>817</Width>
<Height>570</Height>
</PageSetup>
<Sections>
<NumSections>4</NumSections>
<Section Name="-0+078">
<XPositionOnPaper>0.0</XPositionOnPaper>
<YPositionOnPaper>0.0</YPositionOnPaper>
<TopGridElev>0.0</TopGridElev>
<NumPoints>94</NumPoints>
<Points>
<Point Elevation="5.696" Offset="-600.0"/>
<Point Elevation="5.693" Offset="-596.305"/>
<Point Elevation="5.337" Offset="-587.506"/>
<Point Elevation="2.271" Offset="-526.489"/>
<Point Elevation="0.579" Offset="-507.151"/>
<Point Elevation="-1.19" Offset="-490.954"/>
<Point Elevation="-2.314" Offset="-471.14"/>
<Point Elevation="-2.766" Offset="-462.616"/>
<Point Elevation="-2.875" Offset="-457.815"/>
<Point Elevation="-3.6" Offset="-434.419"/>
<Point Elevation="-4.104" Offset="-414.736"/>
<Point Elevation="-4.128" Offset="-406.659"/>
<Point Elevation="-4.356" Offset="-380.964"/>
<Point Elevation="-4.382" Offset="-376.491"/>
<Point Elevation="-4.406" Offset="-375.215"/>
<Point Elevation="-4.989" Offset="-349.559"/>
<Point Elevation="-5.161" Offset="-338.86"/>
<Point Elevation="-5.347" Offset="-322.669"/>
<Point Elevation="-5.812" Offset="-302.883"/>
<Point Elevation="-5.942" Offset="-297.584"/>
<Point Elevation="-6.148" Offset="-283.939"/>
<Point Elevation="-6.342" Offset="-272.05"/>
<Point Elevation="-6.387" Offset="-267.862"/>
<Point Elevation="-6.733" Offset="-246.07"/>
<Point Elevation="-7.111" Offset="-231.836"/>
<Point Elevation="-7.372" Offset="-217.745"/>
<Point Elevation="-7.824" Offset="-194.494"/>
<Point Elevation="-7.882" Offset="-191.371"/>
<Point Elevation="-7.834" Offset="-183.933"/>
<Point Elevation="-7.668" Offset="-165.389"/>
<Point Elevation="-8.54" Offset="-139.979"/>
<Point Elevation="-8.98" Offset="-123.408"/>
<Point Elevation="-9.255" Offset="-115.989"/>
<Point Elevation="-9.487" Offset="-93.719"/>
<Point Elevation="-9.566" Offset="-88.009"/>
<Point Elevation="-9.732" Offset="-85.635"/>
<Point Elevation="-11.591" Offset="-57.803"/>
<Point Elevation="-11.779" Offset="-43.322"/>
<Point Elevation="-11.967" Offset="-27.782"/>
<Point Elevation="-11.928" Offset="-5.492"/>
<Point Elevation="-11.967" Offset="-1.247"/>
<Point Elevation="-12.16" Offset="11.274"/>
<Point Elevation="-12.318" Offset="20.29"/>
<Point Elevation="-12.301" Offset="22.958"/>
<Point Elevation="-12.249" Offset="39.553"/>
<Point Elevation="-12.303" Offset="48.517"/>
<Point Elevation="-12.25" Offset="59.398"/>
<Point Elevation="-12.081" Offset="76.972"/>
<Point Elevation="-12.057" Offset="79.758"/>
<Point Elevation="-12.02" Offset="83.034"/>
<Point Elevation="-11.703" Offset="98.323"/>
<Point Elevation="-11.569" Offset="104.196"/>
<Point Elevation="-11.562" Offset="105.697"/>
<Point Elevation="-11.365" Offset="116.141"/>
<Point Elevation="-11.25" Offset="117.347"/>
<Point Elevation="-10.732" Offset="135.54"/>
<Point Elevation="-10.625" Offset="146.227"/>
<Point Elevation="-10.077" Offset="158.793"/>
<Point Elevation="-8.681" Offset="177.76"/>
<Point Elevation="-8.592" Offset="181.044"/>
<Point Elevation="-8.401" Offset="194.035"/>
<Point Elevation="-8.271" Offset="203.535"/>
<Point Elevation="-7.923" Offset="213.249"/>
<Point Elevation="-7.728" Offset="217.373"/>
<Point Elevation="-7.095" Offset="235.24"/>
<Point Elevation="-6.982" Offset="241.693"/>
<Point Elevation="-6.682" Offset="247.206"/>
<Point Elevation="-6.075" Offset="256.627"/>
<Point Elevation="-5.455" Offset="278.481"/>
<Point Elevation="-5.337" Offset="282.26"/>
<Point Elevation="-5.042" Offset="294.845"/>
<Point Elevation="-5.019" Offset="295.988"/>
<Point Elevation="-4.347" Offset="321.161"/>
<Point Elevation="-4.189" Offset="329.073"/>
<Point Elevation="-3.808" Offset="348.654"/>
<Point Elevation="-3.664" Offset="355.277"/>
<Point Elevation="-3.317" Offset="372.887"/>
<Point Elevation="-3.154" Offset="382.261"/>
<Point Elevation="-2.776" Offset="410.279"/>
<Point Elevation="-2.765" Offset="410.995"/>
<Point Elevation="-2.704" Offset="413.887"/>
<Point Elevation="-2.197" Offset="439.138"/>
<Point Elevation="-1.967" Offset="448.435"/>
<Point Elevation="-1.716" Offset="464.705"/>
<Point Elevation="-1.481" Offset="485.302"/>
<Point Elevation="-1.403" Offset="489.714"/>
<Point Elevation="-1.251" Offset="498.925"/>
<Point Elevation="-0.928" Offset="517.874"/>
<Point Elevation="-0.799" Offset="529.258"/>
<Point Elevation="-0.604" Offset="548.73"/>
<Point Elevation="-1.169" Offset="576.146"/>
<Point Elevation="-1.18" Offset="579.205"/>
<Point Elevation="-1.305" Offset="585.252"/>
<Point Elevation="-1.468" Offset="600.0"/>
</Points>
</Section>
<Section Name="0+172">
<XPositionOnPaper>0.0</XPositionOnPaper>
<YPositionOnPaper>0.0</YPositionOnPaper>
<TopGridElev>0.0</TopGridElev>
<NumPoints>104</NumPoints>
<Points>
<Point Elevation="4.21" Offset="-600.0"/>
<Point Elevation="3.865" Offset="-590.197"/>
<Point Elevation="3.192" Offset="-572.372"/>
<Point Elevation="1.492" Offset="-534.461"/>
<Point Elevation="-1.278" Offset="-510.761"/>
<Point Elevation="-1.773" Offset="-506.708"/>
<Point Elevation="-2.262" Offset="-496.208"/>
<Point Elevation="-3.027" Offset="-480.587"/>
<Point Elevation="-3.26" Offset="-473.089"/>
<Point Elevation="-4.034" Offset="-454.61"/>
<Point Elevation="-4.281" Offset="-430.868"/>
<Point Elevation="-4.355" Offset="-425.789"/>
<Point Elevation="-4.35" Offset="-412.009"/>
<Point Elevation="-4.367" Offset="-398.744"/>
<Point Elevation="-4.437" Offset="-394.505"/>
<Point Elevation="-4.911" Offset="-371.013"/>
<Point Elevation="-5.369" Offset="-344.896"/>
<Point Elevation="-5.909" Offset="-321.896"/>
<Point Elevation="-5.972" Offset="-318.479"/>
<Point Elevation="-6.203" Offset="-307.947"/>
<Point Elevation="-6.559" Offset="-290.298"/>
<Point Elevation="-6.742" Offset="-282.919"/>
<Point Elevation="-7.278" Offset="-261.654"/>
<Point Elevation="-7.19" Offset="-241.456"/>
<Point Elevation="-7.206" Offset="-234.351"/>
<Point Elevation="-7.744" Offset="-212.894"/>
<Point Elevation="-7.972" Offset="-205.898"/>
<Point Elevation="-8.011" Offset="-204.056"/>
<Point Elevation="-8.937" Offset="-181.613"/>
<Point Elevation="-9.613" Offset="-169.45"/>
<Point Elevation="-10.568" Offset="-155.252"/>
<Point Elevation="-11.306" Offset="-139.728"/>
<Point Elevation="-11.435" Offset="-136.455"/>
<Point Elevation="-11.67" Offset="-122.543"/>
<Point Elevation="-11.836" Offset="-115.516"/>
<Point Elevation="-11.845" Offset="-113.826"/>
<Point Elevation="-12.223" Offset="-102.969"/>
<Point Elevation="-12.219" Offset="-100.525"/>
<Point Elevation="-12.572" Offset="-83.796"/>
<Point Elevation="-12.666" Offset="-73.185"/>
<Point Elevation="-12.605" Offset="-61.703"/>
<Point Elevation="-12.379" Offset="-44.437"/>
<Point Elevation="-12.45" Offset="-41.849"/>
<Point Elevation="-12.273" Offset="-20.661"/>
<Point Elevation="-12.271" Offset="-15.995"/>
<Point Elevation="-12.279" Offset="-14.536"/>
<Point Elevation="-12.193" Offset="7.86"/>
<Point Elevation="-12.049" Offset="12.127"/>
<Point Elevation="-11.97" Offset="26.792"/>
<Point Elevation="-11.482" Offset="39.803"/>
<Point Elevation="-11.428" Offset="47.755"/>
<Point Elevation="-11.244" Offset="53.548"/>
<Point Elevation="-10.805" Offset="70.223"/>
<Point Elevation="-10.718" Offset="74.57"/>
<Point Elevation="-10.702" Offset="75.913"/>
<Point Elevation="-10.087" Offset="96.66"/>
<Point Elevation="-9.799" Offset="103.819"/>
<Point Elevation="-9.63" Offset="112.183"/>
<Point Elevation="-9.234" Offset="126.254"/>
<Point Elevation="-8.999" Offset="137.384"/>
<Point Elevation="-8.476" Offset="159.55"/>
<Point Elevation="-8.445" Offset="160.778"/>
<Point Elevation="-8.271" Offset="164.407"/>
<Point Elevation="-7.259" Offset="184.045"/>
<Point Elevation="-7.127" Offset="189.256"/>
<Point Elevation="-6.92" Offset="198.448"/>
<Point Elevation="-6.48" Offset="207.958"/>
<Point Elevation="-6.04" Offset="221.897"/>
<Point Elevation="-5.474" Offset="242.469"/>
<Point Elevation="-5.364" Offset="247.769"/>
<Point Elevation="-5.253" Offset="251.096"/>
<Point Elevation="-4.998" Offset="265.24"/>
<Point Elevation="-4.818" Offset="275.102"/>
<Point Elevation="-4.715" Offset="277.979"/>
<Point Elevation="-4.027" Offset="298.699"/>
<Point Elevation="-3.738" Offset="309.727"/>
<Point Elevation="-3.575" Offset="322.408"/>
<Point Elevation="-3.105" Offset="340.851"/>
<Point Elevation="-2.937" Offset="346.115"/>
<Point Elevation="-2.855" Offset="359.315"/>
<Point Elevation="-2.833" Offset="366.127"/>
<Point Elevation="-2.816" Offset="367.498"/>
<Point Elevation="-2.675" Offset="385.31"/>
<Point Elevation="-2.596" Offset="391.895"/>
<Point Elevation="-2.673" Offset="406.1"/>
<Point Elevation="-2.465" Offset="418.482"/>
<Point Elevation="-2.516" Offset="427.315"/>
<Point Elevation="-2.328" Offset="445.356"/>
<Point Elevation="-2.337" Offset="446.342"/>
<Point Elevation="-2.626" Offset="452.604"/>
<Point Elevation="-3.486" Offset="470.977"/>
<Point Elevation="-3.693" Offset="476.912"/>
<Point Elevation="-3.777" Offset="496.074"/>
<Point Elevation="-3.932" Offset="501.72"/>
<Point Elevation="-4.018" Offset="513.362"/>
<Point Elevation="-3.474" Offset="529.259"/>
<Point Elevation="-3.265" Offset="532.878"/>
<Point Elevation="-2.893" Offset="543.264"/>
<Point Elevation="-2.834" Offset="544.691"/>
<Point Elevation="-2.372" Offset="551.966"/>
<Point Elevation="-1.374" Offset="568.651"/>
<Point Elevation="-1.184" Offset="572.608"/>
<Point Elevation="-0.9" Offset="589.873"/>
<Point Elevation="-0.265" Offset="600.0"/>
</Points>
</Section>
<Section Name="0+422">
<XPositionOnPaper>0.0</XPositionOnPaper>
<YPositionOnPaper>0.0</YPositionOnPaper>
<TopGridElev>0.0</TopGridElev>
<NumPoints>98</NumPoints>
<Points>
<Point Elevation="2.527" Offset="-600.0"/>
<Point Elevation="1.923" Offset="-583.886"/>
<Point Elevation="1.147" Offset="-573.7"/>
<Point Elevation="0.148" Offset="-560.844"/>
<Point Elevation="-1.561" Offset="-534.717"/>
<Point Elevation="-1.604" Offset="-534.134"/>
<Point Elevation="-2.764" Offset="-502.908"/>
<Point Elevation="-3.147" Offset="-490.643"/>
<Point Elevation="-3.634" Offset="-472.527"/>
<Point Elevation="-4.199" Offset="-442.515"/>
<Point Elevation="-4.26" Offset="-440.183"/>
<Point Elevation="-4.353" Offset="-435.493"/>
<Point Elevation="-4.626" Offset="-412.074"/>
<Point Elevation="-4.836" Offset="-400.43"/>
<Point Elevation="-4.963" Offset="-383.964"/>
<Point Elevation="-5.335" Offset="-361.676"/>
<Point Elevation="-5.378" Offset="-357.711"/>
<Point Elevation="-5.461" Offset="-354.483"/>
<Point Elevation="-5.587" Offset="-348.617"/>
<Point Elevation="-6.599" Offset="-306.504"/>
<Point Elevation="-6.923" Offset="-292.309"/>
<Point Elevation="-7.646" Offset="-260.816"/>
<Point Elevation="-7.665" Offset="-260.005"/>
<Point Elevation="-8.267" Offset="-238.897"/>
<Point Elevation="-9.466" Offset="-215.915"/>
<Point Elevation="-9.939" Offset="-205.494"/>
<Point Elevation="-10.636" Offset="-192.184"/>
<Point Elevation="-11.499" Offset="-177.238"/>
<Point Elevation="-11.845" Offset="-170.731"/>
<Point Elevation="-12.281" Offset="-152.944"/>
<Point Elevation="-12.343" Offset="-150.873"/>
<Point Elevation="-12.345" Offset="-150.114"/>
<Point Elevation="-12.485" Offset="-127.286"/>
<Point Elevation="-12.474" Offset="-120.381"/>
<Point Elevation="-12.427" Offset="-111.488"/>
<Point Elevation="-12.447" Offset="-105.883"/>
<Point Elevation="-12.651" Offset="-87.792"/>
<Point Elevation="-12.622" Offset="-78.078"/>
<Point Elevation="-12.53" Offset="-55.591"/>
<Point Elevation="-12.495" Offset="-52.513"/>
<Point Elevation="-12.115" Offset="-31.23"/>
<Point Elevation="-12.009" Offset="-23.783"/>
<Point Elevation="-11.488" Offset="-9.776"/>
<Point Elevation="-11.236" Offset="4.184"/>
<Point Elevation="-10.416" Offset="13.232"/>
<Point Elevation="-10.641" Offset="20.134"/>
<Point Elevation="-10.28" Offset="44.002"/>
<Point Elevation="-10.292" Offset="44.652"/>
<Point Elevation="-10.289" Offset="44.792"/>
<Point Elevation="-10.828" Offset="56.567"/>
<Point Elevation="-10.797" Offset="59.917"/>
<Point Elevation="-10.401" Offset="76.981"/>
<Point Elevation="-10.186" Offset="85.234"/>
<Point Elevation="-10.076" Offset="91.139"/>
<Point Elevation="-9.671" Offset="106.374"/>
<Point Elevation="-9.556" Offset="114.729"/>
<Point Elevation="-9.018" Offset="131.881"/>
<Point Elevation="-8.96" Offset="133.976"/>
<Point Elevation="-8.938" Offset="135.194"/>
<Point Elevation="-8.59" Offset="157.634"/>
<Point Elevation="-8.516" Offset="163.615"/>
<Point Elevation="-8.379" Offset="182.167"/>
<Point Elevation="-8.093" Offset="194.118"/>
<Point Elevation="-7.878" Offset="204.774"/>
<Point Elevation="-7.548" Offset="221.957"/>
<Point Elevation="-7.482" Offset="225.607"/>
<Point Elevation="-7.519" Offset="237.596"/>
<Point Elevation="-7.537" Offset="244.959"/>
<Point Elevation="-7.524" Offset="247.228"/>
<Point Elevation="-7.202" Offset="265.159"/>
<Point Elevation="-6.937" Offset="273.625"/>
<Point Elevation="-6.791" Offset="280.238"/>
<Point Elevation="-6.674" Offset="286.833"/>
<Point Elevation="-6.486" Offset="295.474"/>
<Point Elevation="-6.408" Offset="313.252"/>
<Point Elevation="-6.365" Offset="316.221"/>
<Point Elevation="-6.294" Offset="327.463"/>
<Point Elevation="-6.2" Offset="337.22"/>
<Point Elevation="-6.207" Offset="338.339"/>
<Point Elevation="-5.867" Offset="355.513"/>
<Point Elevation="-5.65" Offset="362.307"/>
<Point Elevation="-5.567" Offset="375.271"/>
<Point Elevation="-5.433" Offset="387.259"/>
<Point Elevation="-5.152" Offset="396.436"/>
<Point Elevation="-4.378" Offset="413.203"/>
<Point Elevation="-4.146" Offset="425.427"/>
<Point Elevation="-4.099" Offset="435.841"/>
<Point Elevation="-3.993" Offset="439.726"/>
<Point Elevation="-3.418" Offset="457.353"/>
<Point Elevation="-2.943" Offset="467.452"/>
<Point Elevation="-2.548" Offset="480.037"/>
<Point Elevation="-1.52" Offset="499.033"/>
<Point Elevation="-1.085" Offset="505.573"/>
<Point Elevation="-0.707" Offset="509.068"/>
<Point Elevation="-0.564" Offset="514.17"/>
<Point Elevation="1.044" Offset="545.131"/>
<Point Elevation="3.671" Offset="586.351"/>
<Point Elevation="4.257" Offset="600.0"/>
</Points>
</Section>
<Section Name="0+672">
<XPositionOnPaper>0.0</XPositionOnPaper>
<YPositionOnPaper>0.0</YPositionOnPaper>
<TopGridElev>0.0</TopGridElev>
<NumPoints>101</NumPoints>
<Points>
<Point Elevation="0.751" Offset="-600.0"/>
<Point Elevation="0.17" Offset="-590.282"/>
<Point Elevation="-0.185" Offset="-585.509"/>
<Point Elevation="-1.698" Offset="-564.455"/>
<Point Elevation="-2.012" Offset="-556.049"/>
<Point Elevation="-2.541" Offset="-536.428"/>
<Point Elevation="-2.738" Offset="-526.646"/>
<Point Elevation="-3.164" Offset="-510.314"/>
<Point Elevation="-3.581" Offset="-498.217"/>
<Point Elevation="-3.967" Offset="-482.548"/>
<Point Elevation="-4.17" Offset="-466.638"/>
<Point Elevation="-4.63" Offset="-454.111"/>
<Point Elevation="-4.885" Offset="-437.444"/>
<Point Elevation="-4.739" Offset="-426.605"/>
<Point Elevation="-4.755" Offset="-407.163"/>
<Point Elevation="-4.887" Offset="-399.338"/>
<Point Elevation="-5.348" Offset="-377.159"/>
<Point Elevation="-5.455" Offset="-371.865"/>
<Point Elevation="-6.085" Offset="-345.987"/>
<Point Elevation="-6.145" Offset="-343.34"/>
<Point Elevation="-6.428" Offset="-331.877"/>
<Point Elevation="-6.448" Offset="-330.864"/>
<Point Elevation="-7.104" Offset="-309.854"/>
<Point Elevation="-7.356" Offset="-296.783"/>
<Point Elevation="-7.378" Offset="-295.786"/>
<Point Elevation="-8.31" Offset="-272.558"/>
<Point Elevation="-9.344" Offset="-249.668"/>
<Point Elevation="-9.524" Offset="-246.49"/>
<Point Elevation="-10.115" Offset="-236.3"/>
<Point Elevation="-10.351" Offset="-218.394"/>
<Point Elevation="-10.714" Offset="-213.348"/>
<Point Elevation="-11.674" Offset="-204.751"/>
<Point Elevation="-11.699" Offset="-201.381"/>
<Point Elevation="-11.744" Offset="-193.463"/>
<Point Elevation="-12.329" Offset="-178.033"/>
<Point Elevation="-12.592" Offset="-165.284"/>
<Point Elevation="-12.777" Offset="-155.308"/>
<Point Elevation="-12.43" Offset="-144.408"/>
<Point Elevation="-12.528" Offset="-139.081"/>
<Point Elevation="-12.669" Offset="-133.221"/>
<Point Elevation="-12.262" Offset="-121.876"/>
<Point Elevation="-12.13" Offset="-110.999"/>
<Point Elevation="-12.286" Offset="-98.019"/>
<Point Elevation="-12.367" Offset="-89.578"/>
<Point Elevation="-11.654" Offset="-75.025"/>
<Point Elevation="-11.598" Offset="-71.369"/>
<Point Elevation="-12.418" Offset="-63.45"/>
<Point Elevation="-12.586" Offset="-57.395"/>
<Point Elevation="-12.029" Offset="-40.428"/>
<Point Elevation="-11.941" Offset="-37.225"/>
<Point Elevation="-12.05" Offset="-17.903"/>
<Point Elevation="-11.919" Offset="-14.255"/>
<Point Elevation="-10.878" Offset="5.213"/>
<Point Elevation="-10.987" Offset="7.781"/>
<Point Elevation="-12.241" Offset="17.876"/>
<Point Elevation="-12.175" Offset="19.902"/>
<Point Elevation="-12.679" Offset="37.309"/>
<Point Elevation="-12.779" Offset="41.445"/>
<Point Elevation="-12.756" Offset="41.967"/>
<Point Elevation="-12.147" Offset="62.308"/>
<Point Elevation="-12.189" Offset="63.587"/>
<Point Elevation="-11.804" Offset="83.447"/>
<Point Elevation="-11.748" Offset="85.224"/>
<Point Elevation="-11.68" Offset="105.223"/>
<Point Elevation="-11.648" Offset="107.415"/>
<Point Elevation="-11.299" Offset="124.477"/>
<Point Elevation="-11.183" Offset="129.8"/>
<Point Elevation="-10.608" Offset="145.77"/>
<Point Elevation="-10.491" Offset="152.394"/>
<Point Elevation="-10.528" Offset="156.006"/>
<Point Elevation="-10.486" Offset="170.955"/>
<Point Elevation="-10.376" Offset="180.254"/>
<Point Elevation="-10.183" Offset="192.924"/>
<Point Elevation="-10.122" Offset="198.333"/>
<Point Elevation="-9.995" Offset="209.165"/>
<Point Elevation="-9.803" Offset="220.192"/>
<Point Elevation="-9.727" Offset="230.156"/>
<Point Elevation="-9.793" Offset="235.687"/>
<Point Elevation="-9.444" Offset="249.066"/>
<Point Elevation="-9.308" Offset="258.031"/>
<Point Elevation="-9.253" Offset="261.971"/>
<Point Elevation="-8.511" Offset="283.111"/>
<Point Elevation="-8.163" Offset="289.464"/>
<Point Elevation="-7.102" Offset="307.459"/>
<Point Elevation="-6.902" Offset="312.383"/>
<Point Elevation="-6.731" Offset="322.229"/>
<Point Elevation="-6.609" Offset="326.578"/>
<Point Elevation="-6.011" Offset="346.572"/>
<Point Elevation="-5.822" Offset="350.33"/>
<Point Elevation="-4.461" Offset="371.66"/>
<Point Elevation="-4.318" Offset="373.491"/>
<Point Elevation="-1.818" Offset="396.911"/>
<Point Elevation="-1.583" Offset="398.654"/>
<Point Elevation="1.249" Offset="416.959"/>
<Point Elevation="1.897" Offset="437.491"/>
<Point Elevation="3.568" Offset="467.863"/>
<Point Elevation="6.567" Offset="551.744"/>
<Point Elevation="6.606" Offset="552.895"/>
<Point Elevation="6.604" Offset="553.18"/>
<Point Elevation="6.591" Offset="553.868"/>
<Point Elevation="5.965" Offset="600.0"/>
</Points>
</Section>
</Sections>
</root>

จบตอนที่ 2

  • พบกันตอนหน้า ตอนที่ 3 ครับ

สิ้นสุดการรอคอย XSection Plot รุ่น 4.10 มาแล้ว ตอนที่ 1

ถึงจะล่าช้าแต่ก็มาตามสัญญา

  • โปรแกรมเขียนรูปตัดตามขวาง XSection Plot รุ่นนี้รุ่น 4.10 มาแทนรุ่นเดิม 3.25 ที่ปลดระวางด้วยเนื่องจากอายุมากร่วมสองทศวรรษ แต่ขอแจ้งไว้ก่อนรุ่นนี้ยังเป็นรุ่นทดลองใช้ (beta) นะครับ เพราะยังมีบั๊กอยู่บ้าง แต่โดยรวมใช้งานได้

xsectionplotv410-intro

ความเป็นมาของโปรแกรม

  • อ่านความเป็นมาของโปรแกรมได้อย่างละเอียดที่ => ก้าวต่อไปของโปรแกรมเขียนรูปตัดตามขวาง XSection Plot ในร่างใหม่พัฒนาด้วย Python + Qt
  • และที่ => ก้าวที่ใกล้กับโปรแกรมเขียนรูปตัดตามขวาง XSection Plot รุ่นใหม่
  • ก็ขอเท้าความเป็นมาโปรแกรมสักนิดเผื่อผู้อ่านไม่ได้ติดตามมาก่อน โปรแกรมเขียนรูปตัดตามขวาง XSection Plot รุ่นเดิมพัฒนาด้วย VB อายุอานามเกือบยี่สิบปีแล้วครับ ใช้ได้ดีตอนวินโดส์ XP แต่หลังมาวินโดส์ 7, 8 และวินโดส์ 10 ก็มีปัญหากับการติดตั้งเรื่อยมา เพราะโปรแกรมยังใช้ library ของวินโดส์รุ่นเก่า พอเจอวินโดส์ใหม่หาไลบรารีไม่เจอ ผมเขียนใหม่ด้วยภาษาไพธอน (Python) ใช้ระบบกราฟฟิคเฟรมเวิร์คของ Qt รวมๆเรียกว่า PyQt
  • ขณะที่พัฒนานี้ใช้ Python 3.5 ส่วน Qt ใช้ PyQt รุ่น 5.6 ส่วน Qt เป็นเฟรมเวิร์คที่ใหญ่โตมากๆ อ่านคู่มือไม่ไหว ก็จะเลือกอ่านแต่เท่าที่ใช้ แน่นอนสิ่งที่ทำให้ผมโปรแกรมได้สำเร็จยกเครดิตให้ stackoverflow.com ถ้าไม่มีเวปไซต์ถามและตอบปัญหาการเขียนโปรแกรมนี้ ยังคิดว่าจะเขียนโปรแกรมได้อย่างไร มีปัญหาอะไร เข้าไปค้นหาทีไร ก็เจอคำตอบทุกที จะมีคนที่มีปัญหาแบบเรามาถามก่อนเรา พร้อมมีคนมาตอบให้ ส่วนใหญ่ 99% คำตอบสามารถนำไปใช้งานต่อยอดได้

สาเหตุแห่งความล่าช้า

  • เรื่องความรู้ความเข้าใจภาษาไพธอน อาจจะไม่ใช่ปัญหานักเนื่องจากไพธ่อนเป็นภาษาที่เรียบง่ายแต่ทรงพลัง ปัญหาของผมลำดับแรกคือ Qt Framework ที่เกี่ยวกับกราฟฟิค ศึกษาได้ค่อนข้างช้า ก่อนหน้านี้ไปทุ่มให้กับ wxPython ที่เป็น GUI Framework ที่ใช้ wxWidget ทำให้เสียเวลาไปมาก  พูดอย่างนี้ไม่ใช่ wxPython ไม่ดีนะครับเพียงแต่ส่วนตัวแล้วไม่ชอบ มาเจอ Qt นี่ใช่เลย
  • ความล่าช้าลำดับที่สอง คือไลบรารีที่ผมเอามาเขียนไฟล์ Autocad DXF ใช้ ezdxf เป็นโครงการเปิดซอร์ส ตัวไลบรารีใช้งานง่าย เก่งมาก ผมลองสมมุติว่าถ้าให้ผมเขียนไลบรารีนี้เอง คงไม่มีปัญญาเป็นแน เพราะผู้พัฒนาเข้าใจถ่องแท้มาก ทั้งโครงสร้างของ  DXF ที่รุ่นหลังๆค่อนข้างซับซ้อนพอสมควร ปัญหาของผมอยู่ที่คอมไพล์โปรแกรมเพื่อสร้างไฟล์ execute ที่เป็นไบนารี .exe ตอนแรกใช้ py2exe กลับไม่สามารถรันได้ พอเปิดโปรแกรมใช้งานพอเรียกใช้ไลบรารีนี้จะ crash ทันที ตอนแรกหาสาเหตุไม่เจอ ตอนหลังมาทราบว่ามี่ไฟล์ที่ไลบรารี ezdxf ที่ต้องการใช้ แต่ py2exe ไม่ได้ใส่ไปให้ด้วย คือ py2exe จะสร้างไฟล์ไลบรารีที่โปรแกรมเรียกใช้ทั้งหมดแล้ว zip ไว้ แต่ขาดไฟล์บางไฟล์ของ ezdxf
  • ผมหันมาใช้ pyinstaller คอมไพล์และสร้างไฟล์  .exe สำเร็จเนื่องจาก pyinstaller ใช้วิธีการที่ง่ายกว่าแบบคิดไม่ถึงและก็ยืดหยุ่นมาก ตอนนี้เทใจให้กับ pyinstaller เมื่อได้ไฟล์ execute มาก็ไม่ยากแล้วทำไฟล์ติดตั้ง (setup) ด้วย Inno Setup เจ้าเดิมที่ผมใช้ประจำ เพราะฟรี ใช้งานง่าย

จุดประสงค์ของโปรแกรม

  • เนื่องจากจุดกำเนิดโปรแกรมนี้เริ่มต้นในยุค PC กับวินโดส์ที่กำลังรุ่งเรืองคือวินโดส์ 98 ที่โปรแกรมด้าน Civil/Survey ยังไม่เก่ง การเขียนรูปตัดจึงค่อนข้างจะใช้มือแบบแมนวลคือเน้นป้อนเข้าตาราง ต่อมาเริ่มมีโปรแกรมด้าน Civil/Survey เช่น Land desktop, Terramodel, โปรแกรมตระกูล Microstation เช่น PowerCivil, Inroads ประมาณนี้ หลายๆโปรแกรมสามารถ export รูปตัดเป็น text file ได้ ผมก็พัฒนาโปรแกรมให้สามารถอ่านเข้ามาโปรแกรม XSection Plot เพื่อจัดรูปแบบและสามารถนำไฟล์เข้าโปรแกรมจำพวก CAD ได้
  • ปัจจุบัน Terramodel, Land desktop หยุดพัฒนาไปหลายปี แต่ผู้พัฒนาหันมาพัฒนาตัวใหม่ที่เก่งกว่าเดิมเช่น Trimble Business Center (TBC) ของค่าย Trimble และค่าย Autodesk ก็มี Autodesk Civil3D เป็นโปรดัคเรือธง ผมลองใช้มาหมดแล้วครับ ยอมรับความสามารถเก่งกาจไปไกล แต่ราคาต่อไลเซนต์ก็สูงมากโข ถามกันจริงๆ ถ้าจะซื้อมาใช้แบบไลเซนต์ จะมีผู้ใช้ที่ไม่ใช่องค์กรสักกี่คนที่มีปัญญาซื้อมาใช้งานได้ นี่เป็นปัญหาอย่างหนึ่ง

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

  • ดาวน์โหลดได้ที่ XSectionPlotV410b867Setup64.zip หรือดูด้านขวามือตรง ดาวน์โหลด (Download) มองหาลิ๊งค์สำหรับติดตั้งโปรแกรม  “XSection Plot V4.10” ในเบื้องต้นมีเฉพาะรุ่น 64 บิต (สำหรับรุ่น 32 บิต รออีกสักพักครับ) ดาวน์โหลดมาแล้ว ขนาดโปรแกรมไม่ใหญ่ประมาณ 16 MB จากนั้นก็ติดตั้งได้ง่ายๆ ติดตั้งแล้วจะเห็น icon ขึ้นมาบน Desktop ดังรูปด้านล่าง

xsectionplot_icon

พาทัวร์โปรแกรมทดลองใช้งาน

  • ต่อไปผมจะพาลองทดลองใช้โปรแกรมคร่าวๆ พาทัวร์การใช้งานรวดเดียวจบ ผมมีไฟล์ตัวอย่าง ตอนติดตั้งโปรแกรมจะไปอยู่ในโฟลเดอร์ของวินโดส์ C:\Users\ชื่อผู้ใช้\AppData\Roaming\XSection Plot\examples data โฟลเดอร์นี้จะถูกซ่อนอัตโนมัติ ผู้ใช้หน้าใหม่ๆอาจจะหาไม่เจอ กรณีหาไม่เจอผมเตรียมตัวช่วยไว้
  • เปิดโปรแกรมมาครั้งแรกจะเห็นว่าตารางโล่งไม่มีข้อมูล

xsectionplotv410-firstload

1.ที่จัดเก็บข้อมูลตัวอย่าง

  • เปิดเมนู Help เลือกคลิกที่ “Example data”

help_examples_data

  • โปรแกรมจะเปิด windows explorer ของวินโดส์มาให้ มองไปจะเห็นโฟลเดอร์ “examples data”

examples_data_folder

  • จากนั้น double click เข้าไปที่โฟลเดอร์ “example data\mz\import files” จะเห็นไฟล์อยู่สองไฟล์ มาถึงตรงนี้ขอให้คลิกแถบ path ดังรูปแล้วก็ใช้เมาส์คลิกขวาเลือก copy ตอนนี้ path อยู่ในคลิปบอร์ดแล้ว ต่อไปจะใช้โปรแกรม XSection Plot ทำการ import ข้อมูลที่อยู่ในพาทนี้เข้าโปรแกรม

mz_import_files_folder

2.นำข้อมูลดินเดิมเข้าโปรแกรม (Import file)

  • คลิก Import text file ที่ไอคอนตามรูปเพื่อจะนำเข้าไฟล์รูปตัด จะเห็นไดอะล็อกของ Import XSection text file ขึ้นมา คลิกที่ไอคอน Open เพื่อเปิดไฟล์

xtoolbar_import

import_dialog

  • จะเห็นไดอะล็อก “Open X-Section text file” เอาเมาส์ไปคลิกที่แถบพาทดังรูปแล้ว paste กด enter สักครั้งหนึ่งจะเห็นไฟล์ app_ch155m.xsc ที่เก็บไฟล์รูปตัดไว้ จากนั้นคลิกเลือกไฟล์นี้

xfolder_import

  • โปรแกรมจะเปิดไฟล์แล้วอ่านรูปตัดแสดง preview ไฟล์รูปตัด สังเกตว่ารูปแบบค่าปริยายจะเลือก Terramodel Road (4 decimal) คลิก “Next >” เพื่อไปขั้นตอนต่อไป

import_view

3.เลือกรูปตัดให้พอดีกับหน้ากระดาษแบบ

  • เมื่อโปรแกรมอ่านพบรูปตัดแล้วจะนำรูปตัดมาแสดงเป็นลิสต์เพื่อจะให้ผู้ใช้เลือกรูปตัดไปใส่กระดาษแบบตามที่ต้องการ ดูรูปข้างล่าง ข้อสังเกตจะเห็นขั้นตอนที่  3.เลือกปลายทาง ไฟล์นี้เป็นค่าระดับดินเดิมจึงเลือก Copy to Existing Ground section ขั้นตอนที่ 4.copy ไปตารางข้อมูล เป็นอันเรียบร้อย

import_selected

  • ข้อมูลรูปตัดจะถูก  copy ตารางป้อนข้อมูลดินเดิม (Existing Ground Section)

xsectionplot_import_ground

4.นำเข้าข้อมูลไฟล์ Typical Section

  • ต่อไปจะนำข้อมูลดินเดิม Typical section  จาก toolbar เลือกไอคอน “Import text file” เปิดไฟล์ที่โฟลเดอร์เดิม ที่นี้เลือกไฟล์ “design_ch.xsc” คลิก Open โปรแกรมจะเปิดไฟล์มาให้ดูก่อนจากนั้นคลิก “Next >” เพื่อมาเลือกรูปตัด เลือกตามรูปโดยเฉพาะขั้นตอนที่ 3.เลือกปลายทาง เลือก “Copy to Typical section” สุดท้ายคลิกที่ “Copy to >>

import_selected_ts

  • โปรแกรมจะนำข้อมูล Typical มาลงที่ตารางข้อมูล Typical section

typical_after_imported

5.บันทึกไฟล์ข้อมูล (Save file)

  • เมื่อนำข้อมูลเข้ามาแล้ว สิ่งแรกควรจะบันทึกไฟล์ข้อมูลลงดิสค์ คลิกที่ไอคอน “Save” เนื่องจาก Tab มีสองหน้าคือ Typical Section และ Existing Ground Section เวลาจะบันทึกไฟล์ข้อมูลแบบไหนก็ให้คลิกที่แท็บให้ตรงกัน เช่นถ้าต้องการบันทึกไฟล์ข้อมูลของดินเดิมก็ให้คลิกที่แท็บ “Existing Ground Section”

toolbar_save

  • ตอนนี้อยู่แท็บ “Typical Section” เราจะบันทึกไฟล์ข้อมูลนี้ก่อน ผมจะเก็บใน Documents ซึ่ง extension ของไฟล์จะเป็น .txml โดยอัตโนมัต ไฟล์ข้อมูลนี้เป็น xml เปิดดูได้ด้วย Notepad ของวินโดส์ ส่วนรูปแบบฟอร์แมตของไฟล์รุ่นเก่าเป็นไบนารีมีนามสกุล .XST

save_typical_section_file

  • บันทึกไฟล์ดินเดิม (Existing Ground Section) คลิกที่แท็บ “Existing Ground Section” เพื่อสวิตช์มาที่ตารางข้อมูลดินเดิม คลิก “Save” ที่ toolbar ด้านบน เลือกโฟลเดอร์ Documents ป้อนชื่อไฟล์ดังรูปด้านล่าง ไฟล์จะมี extension เป็น .gxml อัตโนมัติsave_existing_ground_section

จบตอนที่ 1 ติดตามต่อตอนที่ 2

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

 

ก้าวที่ใกล้กับโปรแกรมเขียนรูปตัดตามขวาง XSection Plot รุ่นใหม่

ก้าวที่ผ่านมา

  • ผ่านมาครึ่งปีกว่าแล้วก็ยังไม่เสร็จตามสัญญา แต่โปรแกรมก็คืบหน้าไปพอสมควรครับ ขอเท้าถึงความหลังหน่อยว่าโปรแกรมรุ่นเดิมเขียนด้วย VB ที่นับอายุอานามแล้วจะใกล้ๆ 20 ปีเข้าไปแล้ว ผมนำโปรแกรมมาพัฒนาใหม่ด้วยของฟรีดีมีคุณภาพ Python3 + Qt5 แรกก็ตะกุกตะกักพอสมควรเนื่องจากยังใหม่กับ Python และเป็นครั้งแรกที่ใช้  Qt สำหรับ Python ที่ว่ากันว่าเรียนง่ายเขียนง่าย แต่สำหรับผมที่เขียนด้วยภาษาอื่นมานมนานก็ต้องบอกว่า Python มีสไตล์ของตัวเอง ที่สั้น กระชับ ฉับไวที่คาดไม่ถึงเลยก็หลายๆอย่าง แต่ด้วยความที่สมองคิดแบบภาษาอื่นมานาน พอมาลอง Python ก็ยอมรับว่าตอนใหม่ๆไปอย่างฝืด Learning Curve  ชันไปนิดสำหรับผม แต่ผ่านไปปีกว่าๆ สไตล์ของ Python เริ่มเข้าหัว ทุกสิ่งทุกอย่างจะลื่นไหลออกมาเอง ลองมาดูว่าโปรแกรมสามารถทำอะไรได้บ้างเมื่อเทียบกับรุ่นเก่าที่พัฒนาด้วย VB 6

XSection_41_showcase

1) ป้อนและแก้ไขข้อมูลโครงการ (Project Information)

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

XSectionPlot_41_Projinfo

  • บางครั้งผู้ใชอาจต้อง Titleblock เป็นภาษาไทย ในส่วนรูปแบบ Titleblock ที่ออกแบบไว้ในโปรแกรมเป็นภาษาอังกฤษ ถ้าจะใช้ภาษาไทยต้องมาป้อนคำเทียบกับภาษาอังกฤษเอง หรือจะใช้ที่ผมใส่ไว้เป็น default ก็ได้

XSectionPlot_41_Maptb

2) ตั้งขนาดกระดาษ (Page Setup)

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

XSectionPlot_PageSetup

3) ตั้งค่ารูปตัดตามขวาง (Section Settings)

  • การตั้งค่ารูปตัดตามขวางเช่นการตั้งมาตราส่วนทางราบ (Horizontal scale) และมาตราส่วนทางดิ่ง (Vertical scale) ให้เหมาะสมหรือตามแต่เจ้าของงานจะกำหนด อย่างอื่นได้แก่ ตั้งจำนวนทศนิยมตัวเลข รูปแบบของเส้นกริด

XSection_41_gensettings

  • รูปแบบตัวเลขค่าระดับ และระยะทาง offset เลือกตั้งได้ 3 รูปแบบ

XSectionPlot_41_elevdisttxt

  • รูปแบบค่าระดับข้างตารางกริด สามารถตั้งตัวอักษรเป็นตัวย่อนำหน้าเพื่อระบุว่าเป็นค่าระดับที่ใช้อ้างอิงกับหลักฐานทางดิ่ง (Datum) อะไรเช่น รทก (MSL) หรือไม่ก็ LAT (Low Astronomical Tide) หรือบางครั้ง CD (Chart Datum)

XSectionPlot_41_gridelevtxt

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

XSectionPlot_41_topgridelev

4) การจัดรูปตัดตามขวางบนกระดาษ (Page Layout)

  • โมดูลตัวนี้เพิ่งเขียนเสร็จสดๆร้อนๆ การจัดรูปตัดบนกระดาษ โดยที่ผู้ใช้เพียงแต่บอกว่าต้องการรูปตัดในแนวราบ (คอลัมน์) และในแนวดิ่ง (แถว) เท่าไหร่ โปรแกรมก็จะจัดให้ตามต้องการ แต่ที่สำคัญคือความกว้างของรูปตัดจะขึ้นอยู่กับลักษณะงานด้วย เช่นงานถนนอาจความกว้างรูปตัดอาจจะ 100 เมตร ก็แบ่งไปข้างซ้าย 5o เมตร ข้างขวา 50 เมตร ในทางดิ่งก็เหมือนกันสามารถตั้งความสูงในแนวดิ่งได้เช่นกัน นอกจากนี้ระยะระหว่างเส้นกริดในแนวราบและแนวนอนก็ยังสามารถตั้งได้ เช่นบางงานอาจต้องการระยะความห่างเส้นกริดทางราบ 5 เมตร หรือ 10 เมตร ทั้งนี้ขึ้นอยู่กับมาตราส่วนด้วย และความสวยงาม เส้นกริดไม่ถี่มากดูแล้วสบายตา

XSectionPlot_41_sectionlayout2

  • หรือในบางกรณีรูปตัดไม่เต็มหน้า โปรแกรมก็จัดให้ได้

XSectionPlot_41_sectionlayout3

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

XSectionPlot_41_sectionlayout4

สิ่งที่ต้องทำต่อ

1) แสดงรูปตัด (Section Viewer)

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

XSectionPlot_32_SectionViewer1

XSectionPlot_32_SectionViewer2

2) เขียนไฟล์รูปตัดรูปแบบ DXF

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

XSectionPlot_42_icon_sectionviewer

ก่อนจากกัน

  • สำหรับ Python + Qt เป็นจัดเป็นคู่หู ที่ทรงประสิทธิภาพมาก เป็น Cross-platform ผมใช้ Eclipse ผ่านปลั๊กอิน Pydev เป็นสภาวะแวดล้อมในการพัฒนาโปรแกรม การดีบักหาข้อผิดพลาดของโปรแกรม เนื่องจากคำสั่ง print  ของ Python เก่งมากก็ใช้คำสั่ง print นี้ครับสะดวก รวดเร็ว
  • เมื่อนำไปพัฒนาบน Ubuntu Gnome ก็ออกมาดังที่เห็น

XSectionPlot_41_ubuntugnome

  • หรือนำไปพัฒนาบนแมค ที่ติดเรื่อง font จากปัญหาสระลอย จนต้องมาบังคับฟอนต์ ตามที่อ.จักรนันท์แนะนำ ก็แก้ปัญหานี้ไปได้

XSectionPlot_41_mac

  • พบกันใหม่ครับ

หนทางข้างหน้าของ Traverse Pro ที่พัฒนาด้วย Lazarus (ตอนที่ 2)

พัฒนาและปรับปรุงต่อ

  • ก็ต่อจากตอนที่ 1 ตอนนี้ผมปรับมาเป็นรุ่น 2.0.1 built 5727 พยายามโค๊ดเท่าที่เวลาเอื้ออำนวยครับ ปรับเรื่องตัวหนังสือภาษาไทยและเรื่อง print preview

ปัญหาของตัวหนังสือ Unicode

  • หลังจาก update โปรแกรมมาได้พักหนึ่ง ผมก็พบกับปัญหา 2 เรื่องคือเรื่อง Unicode กับ Meta file (สำหรับการแสดง Print Preview)  เรื่องแรกเนื่องจากเดิมโปรแกรมอยู่บน Delphi ตัวหนังสือที่เห็นบนโปรแกรมทั้งหมดเป็น Ascii เมื่อโปรแกรมมาอยู่บน Lazarus ที่สนับสนุน Unicode ในรูปแบบ UTF8 (Unicode Transformation Format — 8-bit) เต็มตัว ผมค่อนข้างมะงุมมะหราอยู่พักใหญ่ ภาษาไทยที่เคยแสดงได้บนกริด (เช่นตารางป้อนข้อมูล ตารางผลคำนวณ) กลับเป็นภาษามนุษย์ต่างดาว แต่ก็แก้ไขได้ไม่ยาก แต่ที่เหงื่อตกมากๆคือ สัญลักษณ์  (° degree) ที่แสดงผลมุมหลังตัวเลขกลับยากบนวินโดส์ แต่บน Ubuntu ง่ายกว่า บนวินโดส์ใช้ฟอนต์ Tahoma เป็นหลัก ส่วนบน Ubuntu ผมใช้ฟอนต์ Sans
  • สัญลักษณ์ degree ใน ubuntu ทำได้โดยการ typecast ง่ายๆ ด้วยโค๊ด WideChar(#$00B0) ถ้าเปิดโปรแกรม character map จะเห็นว่าหมายเลข Unicode ตรงกันเป็นฐาน 16 คือ 00B0 แต่บนวินโดส์ที่ผมเสียเวลามากหาอยู่นานต้องใข้แบบนี้ UnicodeToUTF8(chr(176)) ผมค่อนข้างงงมาก เพราะสัญลักษณ์บนระบบ Ascii เก่าตัว degree ใช้ตัวเลข 176 แต่มันกลับ work
สัญลักษณ์มุม (degree) แสดงได้ถูกต้องบน Ubuntu

ปัญหาของ Metafile สำหรับ Print Preview

  • โค๊ดดั้งเดิมใช้ Meta File ซึ่งเป็นฟอร์แม็ตถ้าจำไม่ผิดน่าจะออกแบบโดยไมโครซอฟท์ ซึ่งอะไรๆถ้าขึ้นกับไมโครซอฟท์ ก็ไม่ใช่ cross-platform ชื่อเต็มๆของ Meta file ก็คือ Windows Meta file คือ Meta file เป็นฟอร์แม็ตที่สามารถขยายหรือย่อได้โดยไม่เสีย resolution ในทางโปรแกรมมิ่งจะเขียนงานที่จะพิมพ์ลงบน Meta file ก่อนเวลาพิมพ์จริงๆ ก็แค่ลอกภาพจาก Meta file ลงไปที่เครื่องพิมพ์ ผมพยายามหาโค๊ดใหม่ของ Meta file ที่สนับสนุน cross-platform ก็โชคดีมีคนเขียนไว้ค่อนข้างดี ถ้าสนโปรแกรมมิ่ง free pascal เข้าไปดูและดาวน์โหลดได้ Lazarus Meta File
  • ผมโค๊ด Print Preview ใหม่ ลองดูหน้าตาดังรูปด้านล่าง
Print Preview ที่ดูเรียบง่ายกว่าเดิม (แสดงทั้งหน้า) capture จาก Ubuntu
  • ลอง print บนวินโดส์ไม่มีปัญหาพิมพ์ออกเครื่องพิมพ์ได้ปกติ แต่ถ้าใช้ driver เป็นเครื่องพิมพ์จำพวก pdf  ในวินโดส์ OK แต่ใน ubuntu ผมใช้ driver เรียกว่า cups-pdf ยังไม่ work ส่วน printer ใน Ubuntu ยังไม่ได้ลอง ตอนนี้ผมลองขยายหน้าดูเป็น 200 % จะเห็นดังรูปด้านล่าง
เลือกโหมดการแสดงผลแบบขยายหน้ากระดาษเป็น 200%

ปรับการจัดหน้ากระดาษ Page Setup

  • ปรับปรุงโค๊ดเดิมจัดหน้ากระดาษเช่นตั้งกั้นหน้าซ้ายและขวา บนและล่าง เขียน header และ footer ได้ ลองดูภาพด้านล่างครับ
จัดหน้ากระดาษสำหรับเครื่องพิมพ์
  • ผมลองตั้งกั้นหน้าซ้ายขวาบนล่างแล้วใส่ header, fotter ดังรูปด้านบน ลองดูได้ผลดังรูปด้านล่าง
ภาพก่อนพิมพ์แสดง header ภาษาไทยไม่มีปัญหาสำหรับวินโดส์และ ubuntu

ปรับปรุง Plot Viewer

  • งานวงรอบเมื่อคำนวณเรียบร้อยแล้ว งานอยู่ในเกณฑ์ขั้นต่อไปคือตรวจดูรูปร่างของวงรอบ โค๊ดในส่วนนี้ผมได้เข้าไปแก้ไขได้นิดเดียว ตัวหนังสือแสดงชื่อหมุดเมื่อเปิดครั้งแรกตัวหนังสือยังโอเค แต่พอซูมหรือแพนตัวหนังสือพลิกไป 90 องศา ที่จัดไปแล้วคือเรื่อง icon, status bar ที่เหลือยังต้องแก้ไขต่อไป ผมพยายามหา component ที่เป็น vector พบแล้วแต่ยังไม่รู้นำมาใช้จะเป็นอย่างไร สามารถ export เป็น SVG, DXF ได้
Plot viewer แสดง figure รูปร่างของงานวงรอบ
ตัวหนังสือพลิกกลับลงมา 90 องศา

แก้ไขปัญหาเรื่องฟอนต์ไทยบนลินุกซ์

  • เล่นเอาเหงื่อตก ตอน print preview ตัวหนังสือภาษาไทยก็แสดงผลอยู่ดีๆ แต่พอเวลา print หรือ print เป็น pdf ด้วยไดรเวอร์ cups/cups-pdf ตัวหนังสือไทยก็หายวับไปกับตา สาเหตุที่น่าจะเป็นไปได้ ผมว่าน่าจะมาจาก component ที่ติดมากับ Lazarus คือ Printer4Lazarus แนวทางแก้ไขของผมใน linux ใช้การเขียนภาพเข้าไปโดยตรง แบบนี้ข้อเสียข้อแรกก็คือ ไม่สามารถเลือก Text ได้จากโปรแกรม pdf editor เช่น pdfedit แต่ถ้าไปรันโปรแกรมนี้บนวินโดส์ก็ไม่มีปัญหา ข้อเสียข้อที่สองคือทำงานช้ากว่าเดิม
  • มาลองดูโค๊ด โมดูลตัวนี้จะรับ object ก่อนพิมพ์ในรูปแบบ Meta File ผ่านตัวแปร AMetafile และต้องใช้ directive มาช่วยแยกโค๊ด linux ออกจากวินโดส์
procedure TPrintPreviewForm.PrintMetafile(const ARect : types.TRect;
AmetaFile : TGraphic);
var
bm : TBitmap;
begin
{$IFDEF LINUX}
bm := TBitmap.Create;
try
(* Use TBitmap to draw canvas from TlmfImage (Meta File *)
(* To solve the problem of Thai font on Linux *)
(* The following codes implemented for Linux *)

(* The disadvantage of this way *)
(* 1. Very slow *)
(* 2. In pdf file, all the result are images not text object *)
bm.Width := ARect.Right - ARect.Left;
bm.Height := ARect.Bottom - ARect.Top ;
bm.Canvas.Brush.Style := bsSolid;
bm.Canvas.Brush.Color := clWhite;
bm.Canvas.Rectangle(ARect);
TlmfImage(AMetafile).Draw(bm.Canvas, ARect);
Printer.Canvas.StretchDraw(Arect, bm);
{$ELSE}
(* The following codes that doesn't work with Thai font on Linux *)
(* but work fine on Windows *)
TlmfImage(AMetafile).Draw(Printer.Canvas, ARect);
{$ENDIF}
{$IFDEF LINUX}
finally
bm.Free;
end;
{$ENDIF}
end;
  • ลองเปิดด้วย Document Viewer ได้ผลดังรูปด้านล่าง
ทดสอบเปิดด้วย Document Viewer บน Ubuntu

หนทางข้างหน้า

  • ปรับปรุง Plot Viewer ให้สามารถแสดงผลได้ถูกต้อง ปรับปรุงเรื่องสามารถ export ไปอยู่ในรูปแบบ DXF, SVG
  • ปรับปรุงให้สามารถ Save as ผลการคำนวณวงรอบให้อยู่ในรูปแบบ xml หรือไม่ก็ xls สามารถเปิดได้ด้วย Excel หรือ Openoffice calc ได้ ในตอนนี้หา component มาช่วยยังไม่ได้ เขียนเิองเป็นไปไม่ได้เพราะหนักหนาเกินไป
  • ปรับให้สามารถอ่านไฟล์ข้อมูลเดิมได้ (จากโปรแกรม Traverse Pro รุ่นเดิมที่เขียนด้วย Delphi) ที่ผมบอกไว้ก่อนหน้านี้คือ ไม่สามารถอ่านข้อมูลไฟล์ไบนารีในรูป type ที่เป็น extended ได้ (สำหรับโปรแกรมรุ่นก่อนพัฒนาด้วย Delphi ไม่มีปัญหากับการอ่าน type ข้อมูลแบบนี้)

โปรแกรมเขียนแบบรูปตัดตามขวาง (XSection Plot) สำหรับช่างสำรวจ/ช่างโยธา ตอนที่ 3 (ตอนจบ)

การพรีวิวรูปตัด (Depth Viewer)

  • มาถึงตอนสุดท้าย เรามาดู preview รูปตัดกันก่อน เมื่อดูแล้วผลลัพธ์อาจไม่ตรงกับที่ต้องการ สามารถกลับไปแก้ไขข้อมูลได้เช่น มาตราส่วน ปรับเพิ่มลดรูปตัดในพอดีกับขนาดกระดาษ เมื่อดูแล้วเป็นที่พอใจ สามารถ Export หรือ Save เป็น Autocad DXF ท้ายที่สุดแล้วยังสามารถตามไปแก้ไขรูปตัดได้ใน Autocad
Depth Viewer
  • เมื่อคลิกที่ tool bar จะปรากฏ Depth Viewer ให้เห็นดังรูปด้านล่่าง
การตรวจสอบรูปตัด
  • เมื่อพิจารณาดูรูปตัด จะเห็นว่าโปรแกรมยังไม่สามารถแสดงพื้นที่ที่เป็น cut area ได้ เนื่องจากข้อมูลรูปตัดที่ import จาก Terramodel ตรงจุดตัดระหว่าง Typical section กับเส้นดินเดิมยังไม่ตัดกันเป๊ะ เราจะทำการแก้ไข Typical section ที่ตารางข้อมูล
zoom ดูรูปตัด
  • จากรูปด้านบน ผมจะต่อเส้น typical ให้ไปถึงค่าระดับ -12 กลับมาดูที่ตารางข้อมูลดังรูปด้านล่าง
แก้ไขรูปตัด Typical Section
  • ดูรูปด้านบนที่ Section 2+000 จะเห็นว่าที่ระยะ offset ที่ -65  เมตร และ +65 เมตร ค่าระดับอยู่ีที่ -15.5 เมตรเท่ากัน ผมจะแก้ให้เส้น side slope ไปแตะที่ค่าระดับ -12 เมตร ดังนั้นค่าต่างระดับในแนวดิ่ง = -12.0 + 15.5 = 3.5 เมตร ถ้า side slope กำหนดให้ 1 : 5 ดังนั้นระยะราบจะต่อไปจากระยะ -65 และ + 65 เมตรไปอีกเท่ากับ 3.5 x 5 = 17.5 เมตร ดังนั้นระยะ offset ที่ค่าระดับ -12 จะเท่ากับ -65 – 17.5 = -82.5 เมตร ลองแก้ไขที่ตารางข้อมูลดังรูป
แก้ไข typical section
  • กลับเข้าไปดูใน Depth Viewer อีกครั้งจะเห็นว่าโปรแกรมสามารถคำนวณหาพื้นที่หน้าตัดได้แล้ว
รูปตัดตามขวางเมื่อแก้ไขข้อมูล Typical section ที่ station 2+000
  • ลองเลื่อนไปดู station 2+300 จะเห็นว่าไม่ต้องแก้ไข typical section เนื่องจากโปรแกรมพบจุดตัดเรียบร้อยแล้ว พร้อมคำนวณหา cut area มาให้
รูปตัดที่ station 2+300

Export to Autocad DXF

  • หลังจัดวางรูปตัดได้ตามต้องการแล้ว มาถึงตอนสุดท้ายคือ export รูปตัดตามขวางออกเป็น Autocad DXF ซึ่งถ้าจะแก้ไข Title block หรืออื่นๆก็สามารถเปิดไฟล์ด้วย Autocad แล้วทำการแก้ไขได้ง่าย
คลิกที่ toolbar เพื่อใช้ Export to Autocad DXF

เปิดไฟล์รูปตัดตามขวางด้วย Autocad

  • ลองเปิดไฟล์ DXF ที่เซฟไว้ ดังรูปด้านล่าง ถ้ายังไม่พอใจหรือต้องการแก้ไขตรงจุดไหนก็สามารถกลับไปที่โปรแกรม XSection Plot ได้แล้ว save เป็น DXF ออกมาอีกครั้ง
เปิดไฟล์ DXF ด้วย Autocad

ลองดูข้อมูลจากโครงการอื่น

  • ผมมีตัวอย่างงานถนน อยู่ในโฟลเดอร์ “c:\program files\survey suite\xsection plot\examples\road” เปิดไฟล์ “DW Road.XST และ “DW Road.XSG” ตามลำดับ ลองคลิกไปที่ “ตั้งค่ารูปตัด” ในตัวอย่างนี้เป็นงานถนนใช้มาตราส่วน 1:250 เท่ากันทั้งทางราบและทางดิ่ง ซึ่งในตัวอย่างนี้เนื่องจากใช้ scale ใหญ่ จึงมีรูปตัดทั้งหมดได้ 5 รูปตัด
ตั้งค่ารูปตัดตามขวาง
  • ส่วน “การจัดวางรูปตัดบนกระดาษ” จะเป็นดังรูปด้านล่าง
จัดวางรูปตัด
  • ลองดู Section Viewer จะเห็น รูปตัดที่เป็นงานถนนเป็นหลังเต่า ซ้ายและขวาจากไหล่ทางจะเป็น ditch และมี side slope ที่ cut ออกไปสองข้าง
Section viewer ดูรูปตัด station 3+550

สรุปการใช้โปรแกรม

  • เป็นอย่างไรบ้างครับ ดูแล้วใช้งานง่ายไหม ผมว่าทุกๆโปรแกรมต้องลองใช้สักพัก ถึงจะคุ้นเคย ความจริง Terramodel ที่ใช้งานอยู่ก็มี module สำหรับ export รูปตัดออกมาได้ แต่ที่พบมาคือ config ยากมาก เมนูที่ทางโปรแกรมเมอร์ Terramodel เขียนมานั้นชวนสับสนและยอกย้อน ทางออกก็คือเมื่อ config ได้ต้องเขียน template ไว้ แต่ถ้าใช้ XSection Plot งานจะง่ายขึ้นมาก ปัญหาของ XSection Plot มีอยู่คือการออกแบบ Typical section ซึ่งในโปรแกรมมานั่งป้อนข้อมูล typical section ที่ค่อนข้างซับซ้อนคงไม่สะดวกเป็นแน่แท้ แต่ถ้าสามารถ export ออกมาได้เหมือน existing ground ก็ดี (เช่น Terramodel) ตอนก่อนหน้านี้ผมฝากโปรแกรมคำนวณวงรอบ (Traverse Pro) มีคนดาวน์โหลดไปใช้กันมากกว่าที่คิด ก็ขอฝากอีกโปรแกรมก็แล้วกัน สวัสดีครับ