- เมื่อต้องบวกปริมาณการเคลื่อนที่ x,y หน่วยเมตรเข้ากับพิกัดละติจูด/ลองจิจูด หากระยะที่เคลื่อนที่อยู่ที่ ไม่กี่กม. หรือน้อยกว่า และไม่ได้อยู่ใกล้ขั้วโลก ก็สามารถคำนวณได้รวดเร็วด้วยสูตรประมาณแบบง่าย
- การคำนวณพื้นฐานมองว่าในทิศทาง y 111,111m เท่ากับละติจูด 1 องศา และในทิศทาง x
111,111 * cos(latitude)m เท่ากับลองจิจูด 1 องศา ดังนั้นการเคลื่อนที่ขึ้นเหนือ 100m ก็ให้บวก 100 / 111111 องศา
- แนวคิดเดียวกันอาจคำนวณโดยถือว่าโลกเป็นทรงกลมที่มีรัศมี
R=6378137 และใช้ dLat=dn/R, dLon=de/(R*cos(lat)) ได้เช่นกัน โดยที่ละติจูด 51 องศา ถ้า dn=100, de=100 จะได้ latO=51.00089832, lonO=0.001427437
- หากต้องการความแม่นยำ ภายใน 10m และ offset ไม่เกิน 1km ก็อาจใช้สูตรที่ซับซ้อนกว่า เช่น Aviation Formulary ได้ แต่คาดว่าสูตรประมาณแบบระนาบง่าย ๆ ก็มีความคลาดเคลื่อนต่ำกว่า 50m เมื่อ offset 1km
- หากต้องรองรับผลที่ความยาว 1 องศาเปลี่ยนไปตามละติจูดด้วย ควรใช้สูตร meters per degree หรือแปลงเป็นระบบพิกัดฉายภาพท้องถิ่น บวกปริมาณการเคลื่อนที่ แล้วแปลงกลับเป็นละติจูด/ลองจิจูดจะปลอดภัยกว่า
สำหรับการเคลื่อนที่ระยะสั้น ใช้ค่าประมาณ 111,111m/องศาก็เพียงพอ
- สำหรับปริมาณการเคลื่อนที่เล็ก ๆ สามารถคำนวณการเปลี่ยนแปลงละติจูด/ลองจิจูดได้ด้วยค่าประมาณต่อไปนี้
- ทิศทาง y 111,111m ≈ ละติจูด 1 องศา
- ทิศทาง x
111,111 * cos(latitude)m ≈ ลองจิจูด 1 องศา
- พิกัดใหม่หาได้คร่าว ๆ ดังนี้
lat_new = lat + dy / 111111
lon_new = lon + dx / (111111 * cos(latitude))
- สำหรับ
cos(latitude) ต้องใส่หน่วยให้ตรงกับสภาพแวดล้อมที่รัน
- ในสภาพแวดล้อมที่ต้องใช้เรเดียน ต้องแปลงด้วย
latitude * pi / 180
- ค่าประมาณนี้เหมาะเมื่อปริมาณการเคลื่อนที่ไม่ใหญ่เกินไป ไม่ได้อยู่ใกล้ขั้วโลกโดยตรง และข้อกำหนดด้านความแม่นยำไม่ได้สูงมาก
ที่มาของตัวเลข 111,111m และช่วงความคลาดเคลื่อน
- ค่า 111,111 เชื่อมโยงกับนิยามทางประวัติศาสตร์ของเมตร
- เพราะเดิมฝรั่งเศสนิยามเมตรว่าเป็น 1 ส่วนใน
10^7 ของระยะทางที่วัดตามเส้นเมริเดียนปารีสจากเส้นศูนย์สูตรถึงขั้วโลกเหนือ
10^7 / 90 = 111,111.1m จึงเท่ากับละติจูด 1 องศา
- จากการตรวจสอบในคอมเมนต์ เมื่อเทียบกับการคำนวณ UTM โดยให้ x,y อย่างละ 1400m และการกระจัดรวม 2km ผลลัพธ์ตรงกันในระดับ ไม่เกิน 8.6m
- ภายใต้เงื่อนไขนั้น ละติจูดกรณีแย่ที่สุดคือ 81 องศา
- ความคลาดเคลื่อนยังคงต่ำกว่า 10m ไปจนเกิน 89.6 องศา
- สูตรแบบง่ายสะท้อนผลที่ลองจิจูดแคบลงเมื่อเข้าใกล้ขั้วโลกด้วย
cos(latitude)
- เนื่องจากระยะจริงของลองจิจูด 1 องศาลดลง การเคลื่อนที่เป็นเมตรในทิศทาง x เท่าเดิมจึงแปลงเป็นการเปลี่ยนแปลงลองจิจูดที่มากขึ้นในละติจูดสูง
การคำนวณแบบเดียวกันโดยใช้รัศมีโลก
- การคำนวณเดียวกันสามารถเขียนเป็นสูตรอิงรัศมีโลกได้เช่นกัน
//Position, decimal degrees
lat = 51.0
lon = 0.0
//Earth’s radius, sphere
R=6378137
//offsets in meters
dn = 100
de = 100
//Coordinate offsets in radians
dLat = dn/R
dLon = de/(R*Cos(Pi*lat/180))
//OffsetPosition, decimal degrees
latO = lat + dLat * 180/Pi
lonO = lon + dLon * 180/Pi
- ตัวอย่างนี้คืนผลลัพธ์ดังนี้
latO = 51,00089832
lonO = 0,001427437
- วิธีนี้เป็นคำตอบที่แทบจะเหมือนกับค่าประมาณ 111,111m/องศา ต่างกันตรงที่ใช้ค่าตามรัศมีที่ใกล้กับ
111,319.5m
- การเคลื่อนที่ x ควรใกล้เคียงกับ ทิศตะวันออก-ตะวันตกจริง และการเคลื่อนที่ y ควรใกล้เคียงกับ ทิศเหนือ-ใต้
- หาก easting/northing ของระบบพิกัดฉายภาพท้องถิ่นถูกหมุนอยู่ ต้องแปลงเป็นองค์ประกอบตะวันออก-ตะวันตกและเหนือ-ใต้ก่อน
ตัวเลือกเมื่อต้องการความแม่นยำมากขึ้น
- สูตร “lat/long given radial and distance” ใน Aviation Formulary ใช้ได้เมื่อต้องคำนวณละติจูด/ลองจิจูดใหม่จากระยะทางและมุมทิศทาง
- อาจค่อนข้างซับซ้อนสำหรับสภาพแวดล้อม embedded ที่อยากลดการใช้ฟังก์ชันตรีโกณมิติ
- พารามิเตอร์ระยะทางจัดการเป็นค่า เรเดียน ในรูป
distance / earth radius
- อีกวิธีคือฉายไปยังระบบพิกัดระนาบที่เหมาะกับพื้นที่ แล้วบวก offset
flat_coordinate = latlon_to_utm(original_coordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)
- วิธีนี้ไม่จำเป็นต้องใช้เฉพาะ UTM เท่านั้น ระบบพิกัดระนาบใด ๆ ที่เหมาะกับพื้นที่นั้นก็ใช้ได้
- อย่างไรก็ตาม หากหลังจากเคลื่อนที่แล้วข้ามไปยัง UTM zone อื่นตรงขอบเขต zone ก็จะนำไปใช้ตรง ๆ ได้ยาก
ตัวอย่างการใช้งานตามภาษาและสูตรละเอียดตามละติจูด
- ตัวอย่าง Python ทำค่าประมาณ 111,111m/องศาให้อยู่ในรูปฟังก์ชันโดยตรง
from math import cos, radians
def meters_to_lat_lon_displacement(m, origin_latitude):
lat = m / 111111
lon = m / (111111 * cos(radians(origin_latitude)))
return lat, lon
- ตัวอย่าง R ก็ทำการคำนวณเดียวกัน
deg2rad = function(deg) {(deg * pi) / (180)}
meters_to_lat_lon_displacement = function(m, origin_latitude){
lat = m / 111111
lon = m / (111111 * cos((deg2rad(origin_latitude))))
return(list(lat=lat,lon=lon))
}
- สูตร meters per degree ที่ละเอียดขึ้นตามละติจูดสามารถเขียนได้ดังนี้
meters_per_degree_lat = (111132.92 - 559.82 * np.cos(2 * lat0_rad) +
1.175 * np.cos(4 * lat0_rad) - 0.0023 * np.cos(6 * lat0_rad))
meters_per_degree_lon = (111412.84 * np.cos(lat0_rad) -
93.5 * np.cos(3 * lat0_rad) + 0.118 * np.cos(5 * lat0_rad))
- สูตรละเอียดนี้สะท้อนว่าความยาวของ ละติจูด 1 องศาและลองจิจูด 1 องศา เปลี่ยนแปลงต่อเนื่องตามละติจูด
- ตัวอย่าง Swift ใช้วิธีคำนวณรัศมีโลกตามละติจูด แล้วหาค่า
CLLocationCoordinate2D ใหม่จากระยะทางและมุมทิศทาง
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เมตรถูกนิยามใหม่ในปี 1791 ให้เท่ากับหนึ่งในสิบล้านของเส้นเมริเดียนควอดแรนต์ที่ผ่านปารีส หรือความยาวส่วนโค้ง 90 องศา
ดังนั้น 1° ≡ 1/90 × 10^7 m = 111,111.111... m และเส้นรอบวงโลกก็ประมาณ 40 ล้าน m หรือ 40,000 km
นิยามแรก ๆ ของเมตรคือความยาวของลูกตุ้มนาฬิกาวินาที หรือความยาวของลูกตุ้มที่มีคาบ 2 วินาที และถ้าแทน T = 2, L = 1 ใน T ≈ 2π√(L/g) จะได้ 1 = π√(1/g), 1 = π²/g
ดังนั้นการที่ g มีค่าใกล้ π² ก็ไม่ใช่เรื่องบังเอิญล้วน ๆ และการที่น้ำ 1 cm³ มีมวล 1 g ก็เพราะนั่นเคยเป็นนิยามของกรัมมาเป็นเวลานานด้วย
ตอนที่เมตรถูกนิยามด้วยลูกตุ้มนาฬิกาวินาที มันผูกอยู่กับนิยามของวินาทีและค่า g โดยสิ้นเชิง เขียนเป็นสมการได้ว่า 1 m = 1 s² × g / π²
g ≈ π² จึงออกมาอย่างเป็นธรรมชาติ แต่การที่เส้นรอบวงโลกใกล้พอกับ 40,000 km จนสามารถนิยามเมตรใหม่เป็นเลขยกกำลังของ 10 ได้โดยเปลี่ยนแปลงไม่มากนั้น ดูเหมือนเป็นเรื่องบังเอิญ
https://en.wikipedia.org/wiki/Second#Fraction_of_solar_day
ส่วน 3 ฟุตอังกฤษมีเพียงประมาณ 0.91m
คนในยุคนั้นไม่ได้อนุมานหน่วยความยาวที่มีหลักการที่สุดหรือสวยงามเชิงจักรวาลที่สุดในสุญญากาศ แต่ใกล้เคียงกับการพยายามนิยามหน่วยที่ใช้อยู่แล้วด้วยวิธีที่ไม่ใช่ “ความยาวของแท่งที่อยู่ตรงนั้น”
ใช้ 40,000 km แทน 360 องศา และในการคำนวณจริงก็ใช้ระยะจริง ส่วนค่าประมาณก็ใกล้พอ
อย่างน้อยสำหรับผู้ใช้ระบบเมตริก ก็จะไม่ต้องมีการแปลงเป็นระยะทาง
ปัญหาของหน่วยองศาคือแปลงเป็นระยะทางที่ใช้งานได้ยาก และทริกแบบนี้ก็ช่วยได้บ้าง แต่ถ้าไม่มีการแปลงตั้งแต่แรกย่อมดีกว่า
ไมล์ทะเล 1 ไมล์ หรือประมาณ 6076 ft ตรงกับส่วนโค้ง 1 ลิปดาที่เส้นศูนย์สูตรของโลกพอดี
ในมุมของคนเดินเรือ ก็อยากให้ไมล์ทั้งหมดเป็นไมล์ทะเล
ไมล์ทะเลมีความหมายจริง ๆ แต่ 5280 ft นี่มีความหมายอะไรกันแน่
ความยาวของ chain เป็นผลพลอยได้จากกฎหมายภาษีที่ดินของอังกฤษ ซึ่งเก็บภาษีตามหน่วยเอเคอร์
ไมล์โรมันคือ 1000 ก้าว หรือ 5000 ft ดังนั้นแบบนั้นยังสมเหตุสมผลกว่า
https://en.wikipedia.org/wiki/Gunter%27s_chain
เดิมทีไมล์โรมันคือ 5000 ฟุตโรมัน
ในความเป็นจริง 1 nmi ≡ 1.852 km ถูกนิยามไว้อย่างแม่นยำ
แม้ในนิยามดั้งเดิมของเมตร ก็จะได้ 1/60 × 1/90 × 10^7 = 1851.85185185... m
คุณลักษณะสำคัญของ SI และรุ่นก่อนหน้าอย่าง MKS, CGS คือความสามารถในการแปลงระหว่างหน่วยมาตั้งแต่ต้น จึงมีความสัมพันธ์อย่าง 1 m ≡ 1 s ≡ 1 kg ≡ 1 N ≡ 1 Pa ≡ 1 J ≡ 1 A ≡ 1 C ≡ 1 V ≡ 1 Ω ≡ 1 F ≡ 1 W ≡ 1 Wb ≡ 1 T ≡ 1 H ≡ 1 Hz
ตรงนี้ใช้ ≡ ในความหมายแบบหลวม ๆ เพื่อชี้ค่าสัมประสิทธิ์การแปลง ไม่ใช่สมมูลอย่างเคร่งครัด
สิ่งที่เกือบจะเป็นข้อยกเว้นใน SI คือเคลวิน โมล แคนเดลา และหน่วยอนุพันธ์ของมัน โดยสองอย่างแรกจัดการได้อย่างเรียบร้อยด้วยค่าคงที่โบลต์ซมันน์และค่าคงที่อาโวกาโดร
ส่วนตัวแล้วไม่พอใจที่แคนเดลาอยู่ใน SI
แต่ในคริสต์ศตวรรษที่ 1500 อังกฤษเปลี่ยนไมล์เป็น 8 furlong เพื่อให้การคำนวณการวัดทางการเกษตรในเวลานั้นง่ายขึ้นมาก
https://en.m.wikipedia.org/wiki/Furlong
ฟังดูเหมือนข้ออ้างทำนองว่าหน่วยตามธรรมเนียมดีกว่า เพราะไม่สามารถหาร 10 ด้วย 3 โดยใช้จำนวนเต็มล้วน ๆ ได้
ดูเหมือนว่าถ้าแบ่งวงกลมเป็นส่วนโค้ง 360 ส่วน ก็ถือว่าส่วนโค้งหนึ่งนั้นมีความหมายบางอย่าง ณ จุดที่อยู่ห่างจากจุดศูนย์กลางเป็นระยะหนึ่ง
แต่เมื่อพิจารณาว่าชาวกรีกเมื่อราว 2000 ปีก่อนนำการใช้ 360 ของบาบิโลนมา และชาวบาบิโลนเองก็ไปถึงตัวเลขนั้นจากการปรับปรุงการวัดจำนวนวันคร่าว ๆ ในหนึ่งปีที่ใช้ในดาราศาสตร์มาตลอด 2000 ปีก่อนหน้านั้น ความหมายของไมล์ทะเลจึงใกล้เคียงกับความหมายแบบสืบทอดและบังเอิญ มากกว่าจะเป็นความหมาย “จริง”
ยิ่งไปกว่านั้น หากคำนึงถึงข้อเท็จจริงที่ว่าโลกเป็น ทรงกลมแป้น ความยาวของไมล์ทะเลก็เปลี่ยนไปตามตำแหน่งด้วย
แม้จะอยู่สหรัฐฯ มานานกว่า 10 ปีแล้ว แต่ก็ยังไม่ชินกับ ระบบอิมพีเรียล/หน่วยอังกฤษ และคิดว่าต่อไปก็คงเป็นแบบนั้น
มันไม่สมเหตุสมผลเลย
ระบบเมตริกเหมือนทองคำบริสุทธิ์: 1cm = 10mm, 1m = 100cm, 1km = 1000m, 1kg = 1000g, 1ton = 1000kg
ระบบอิมพีเรียลเหมือนบอกว่า “เดี๋ยวก่อนนะ” แล้วก็ 1in = ???, 1ft = 12in, 1yd = 3ft, 1mile = 5280ft, 1lb = 16oz อะไรทำนองนั้น
ไม่รู้จริง ๆ ว่าใครเป็นคนสร้างความบ้าคลั่งแบบนี้ขึ้นมา
เพราะงั้นปัญหามันเลยไม่โผล่มาให้เห็นบ่อยอย่างที่คิด
แม้บางครั้งจะเจอหน่วยที่เขียนเป็นระบบเมตริก ก็สังเกตได้ว่าเขาไม่แปลงหน่วยกัน
เช่น เขียน 1000mL แทน 1L หรือ 3500g แทน 3.5kg
คนยุโรปอาจพูดว่า “ทางนี้ 600m ทางนั้น 1.2km” ได้ แต่คนอเมริกันแทบจะไม่พูดว่า “ทางนี้ 800 หลา ทางนั้น 1 ไมล์”
คนยุโรปอาจพูดว่า “ต้องแบกน้ำ 4L กระเป๋าเลยหนักขึ้น 4kg” ได้
คนอเมริกันอาจพูดได้ว่า “ขวดของฉัน 24 fluid ounces ก็ราว ๆ 24 ounces ตามน้ำหนัก” แต่ถ้าเป็นแกลลอน ก็น่าจะพูดไปเลยว่าน้ำหนักประมาณหนึ่งแกลลอน
สุดท้ายปัญหาการแปลงหน่วยน้อยกว่าที่จินตนาการไว้ เพราะคนอเมริกันไม่ได้เดินไปไหนมาไหนพร้อมแปลงหน่วยในทุกประโยค
ถ้ามีคนเกิน 50% ของประชากรรู้ว่าน้ำหนึ่งถ้วยมีกี่ออนซ์ หรือ 1 ไมล์มีกี่ฟุต ก็คงน่าประหลาดใจ
แต่ก็ยังดีที่ในสหรัฐฯ แวดวง วิทยาศาสตร์ ใช้ระบบเมตริกเป็นมาตรฐาน
chain ที่มาจากเครื่องมือสำรวจ มีค่า 22 หลา
chain หนึ่งเส้นยังเท่ากับ 4 rod ด้วย ดังนั้น rod หนึ่งจึงเท่ากับ 5½ หลา ซึ่งแปลกดี
10 chain เป็น furlong และ 8 furlong เป็น 1 ไมล์
อนึ่ง เอเคอร์คือ 1 furlong × 1 chain
ถึงจะดูบ้าคลั่ง แต่ข้างในมันก็มีระบบของมันอยู่
ทำไมต้องมีเรื่องให้แปลงนิ้วเป็นไมล์ด้วย?
ในชีวิตคงไม่มีเรื่องที่ต้องแปลงนิ้ว หรือฟุตกับนิ้ว ไปเป็นไมล์
ในงานไม้หรืองานหัตถกรรม อาจพอสมเหตุสมผลในแง่ต้นกำเนิด แต่ถ้าเป็นการใช้งานอื่นล่ะ?
ลองอ่าน 2 3/16" บนไม้บรรทัดระบบอิมพีเรียลให้เร็วเท่า 5.6cm ดูก็พอ
ขนาดสกรูก็ได้รับอิทธิพลจากเรื่องนี้ด้วย
ระยะทางที่แสงเดินทางใน 1 นาโนวินาที ก็ประมาณ 1 ฟุตเหมือนกัน
น่าประทับใจ :)
ผลลัพธ์ของ
$ units c ft/nsคือ* 0.983571061 kilochrono คือ 55 นาที และน่าจะมีประโยชน์มากในสถานการณ์อย่างการเดินทางในอวกาศ ที่ไม่สามารถผูกหน่วยไว้กับวันสุริยะได้
ถ้าโลกเป็น ทรงรีแป้น ความยาวส่วนโค้งจริงของละติจูด 1 องศาก็เปลี่ยนไปไม่ใช่หรือ?
สงสัยว่า “เชื่อถือได้” หมายถึงแค่ “ใกล้พอให้ใช้งานได้” หรือเปล่า
คงทำงานที่ไม่เกี่ยวกับภูมิศาสตร์มานานเกินไป จนลืมสิ่งที่เคยรู้ไปแล้ว
กรณีใช้งานที่ทำให้ฉันรู้ข้อเท็จจริงนี้ก็เขียนไว้บางส่วนตรงนี้ด้วย: https://twitter.com/mholt6/status/1695685022710477043
ต่อให้ในกรณีของฉันมีความคลาดเคลื่อนระดับหลาย km ก็มีโอกาสสูงว่าไม่ใช่แถวขั้วโลก และถ้าเป็นแถวขั้วโลกจริง ๆ ก็แค่ปล่อยผ่านไปประมาณว่า “โอเค เข้าใจแล้ว นายอยู่ที่ขั้วโลกสินะ”
วงโคจรของโลกก็คล้ายกัน
ในโรงเรียนเราเรียนว่ามันเป็นวงรี แต่แทบไม่ได้รับความรู้สึกถึงรูปทรงจริง ๆ และภาพประกอบส่วนใหญ่ก็ให้ความรู้สึกที่ผิดไปอย่างสิ้นเชิง
ถึงอย่างนั้นก็ใกล้พอสำหรับวัตถุประสงค์เชิงปฏิบัติจำนวนมาก
ในบทความนี้ยังมีหลักคร่าว ๆ ที่ดีว่า 111,111 * cos(latitude) m คือ 1 องศาของลองจิจูด
ชอบการชดเชยนี้
จริง ๆ แล้วใช้ค่าคงที่ง่าย ๆ ก็ได้ โดย 25° ประมาณ 100,000m, 44° ประมาณ 80,000m, 57° ประมาณ 60,000m