การวัดระยะทางในทรงกลม Mercator กับ Zoned UTM


11

ฉันได้รับคะแนนเป็น WGS84 lat / long และฉันต้องการวัดระยะทาง "เล็ก" (น้อยกว่า 5km) ระหว่างพวกเขา

ฉันสามารถใช้สูตร haversine ได้จากhttp://www.movable-type.co.uk/scripts/latlong.htmlและใช้งานได้ดีมาก

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

ถ้าฉันใช้โซน UTM ในพื้นที่ฉันจะได้รับความแตกต่างระหว่างแฮเวอรีนสักสองสามเมตรซึ่งใช้ได้ แต่ฉันไม่ต้องการที่จะทำงานในโซน UTM (คะแนนอาจเป็นทั่วโลก) ดังนั้นฉันจึงลองกับ "spherical Mercator" แต่ตอนนี้ความแตกต่างระหว่าง haversine และระยะทางที่คาดการณ์นั้นดีกว่า 100% มันเหมาะกับ Mercator ทรงกลมจริงๆเหรอ? ทั้งหมดที่ฉันต้องการคือการฉายคาร์ทีเซียนที่สามารถใช้งานได้สำหรับสองจุดภายในระยะ 5 กม. จากกันทุกที่ในโลก

from shapely.geometry import Point
from pyproj import Proj

proj = Proj(proj='utm',zone=27,ellps='WGS84')
#proj = Proj(init="epsg:3785")  # spherical mercator, should work anywhere...

point1_geo = (-21.9309694, 64.1455718)
point2_geo = (-21.9372481, 64.1478206)
point1 = proj(point1_geo[0], point1_geo[1])
point2 = proj(point2_geo[0], point2_geo[1])

point1_cart = Point(point1)
point2_cart = Point(point2)

print "p1-p2 (haversine)", hdistance(point1_geo, point2_geo)
print "p1-p2 (cartesian)", point1_cart.distance(point2_cart)

ณ จุดนี้ระยะทางของแฮเวอรีนคือ 394m และใช้ utm zone 27, 395m แต่ถ้าฉันใช้ทรงกลม Mercator ระยะทาง Cartesian คือ 904m ซึ่งเป็นวิธีปิด


โซน UTM นั้นง่ายต่อการ "หาผลงาน" ตามความยาว เลือกแลมบ์ดาลองจิจูดทั่วไป -180 <= แลมบ์ดา <180 และใช้เพื่อคำนวณหมายเลขโซนเป็น Int ((180 + lambda) / 6) +1 ใช้เครื่องหมายละติจูดเพื่อตัดสินใจระหว่างเหนือและใต้ คุณไม่จำเป็นต้องใช้โซนขั้วโลกพิเศษในละติจูดสูง จริง ๆ แล้วใกล้กับเสาคุณสามารถใช้เกือบทุกโซน UTM
whuber

คำตอบ:


17

ใช่คุณจะได้รับข้อผิดพลาดประเภทนี้ด้วยการประมาณการ Mercator ทั่วโลก: มันแม่นยำที่เส้นศูนย์สูตรและการบิดเบือนจะเพิ่มขึ้นแบบทวีคูณโดยมีละติจูดอยู่ห่างจากเส้นศูนย์สูตร การบิดเบือนระยะทางเท่ากับ 2 (100%) ที่ละติจูด 60 องศา ที่ละติจูดทดสอบของคุณ (64.14 องศา) ฉันคำนวณความผิดเพี้ยนของ 2.294 ซึ่งสอดคล้องกับอัตราส่วน 904/394 = 2.294 (ก่อนหน้านี้ฉันคำนวณ 2.301 แต่มันขึ้นอยู่กับทรงกลมไม่ใช่ WGS84 ellipsoid ความแตกต่าง (0.3%) ให้ความรู้สึกถึงความแม่นยำที่คุณอาจได้รับจากการใช้การฉายภาพทรงรีกับทรงกลมเมื่อเทียบกับทรงกลมสูตร Haversine )

ไม่มีสิ่งใดเช่นการคาดการณ์ระดับโลกที่ให้ระยะทางที่แม่นยำสูงทุกที่ นั่นเป็นเหตุผลหนึ่งที่ใช้ระบบโซน UTM!

ทางออกหนึ่งคือการใช้รูปทรงกลมทรงกลมสำหรับการคำนวณทั้งหมดของคุณ แต่คุณได้ปฏิเสธสิ่งนั้น (ซึ่งมีเหตุผลถ้าคุณกำลังจะทำการดำเนินการที่ซับซ้อน

ทางออกก็คือการปรับตัวให้เข้าฉายไปยังจุดที่มีการเทียบ ตัวอย่างเช่นคุณสามารถใช้ Mercator ขวาง (เช่นในระบบ UTM) ได้อย่างปลอดภัยโดยมีเส้นเมอริเดียนอยู่ใกล้กับศูนย์กลางของภูมิภาคที่น่าสนใจ การย้ายเส้นแวงนั้นเป็นเรื่องง่ายที่จะทำเพียงแค่ลบลองจิจูดของเส้นแวงจากลองจิจูดทั้งหมดและใช้การฉายภาพ TM เดี่ยวที่อยู่กึ่งกลางที่ Prime Meridian (ด้วยสเกลแฟกเตอร์ที่ 1 แทนที่จะเป็น 0.9996 ของระบบ UTM) สำหรับการทำงานของคุณนี้จะมีแนวโน้มที่จะมากขึ้นแม่นยำกว่าการใช้ UTM มันจะให้มุมที่ถูกต้อง (TM สอดคล้องกัน) และจะแม่นยำอย่างน่าทึ่งสำหรับจุดที่คั่นด้วยระยะทางเพียงไม่กี่สิบกิโลเมตร: คาดหวังได้ดีกว่าความแม่นยำหกหลัก ในความเป็นจริงฉันจะโน้มน้าวให้เห็นความแตกต่างเล็ก ๆ น้อย ๆ ระหว่างระยะทางที่ปรับกับ TM เหล่านี้และระยะทาง Haversine กับความแตกต่างระหว่างทรงรี (ใช้สำหรับการฉายภาพ TM) และทรงกลม (ใช้โดย Haversine) แทนที่จะบิดเบือน ติ่ง


ฟังดูสมบูรณ์แบบฉันคิดว่าฉันต้องสร้างสตริง init ของตัวเองสำหรับ proj4 ก่อนแทนที่จะสามารถใช้สตริง EPSG ใด ๆ ที่มีอยู่ได้
Karl P

1
+1 ปรับการฉายภาพไปยังจุดต่างๆ ฉันชอบจานหมุนตามขวางมากกว่า Mercator ขวาง แต่ในพื้นที่ขนาดเล็กพอ ("ขนาดใหญ่") การฉายภาพเกือบทั้งหมด "กึ่งกลาง" ใกล้บริเวณที่น่าสนใจจะให้ความแม่นยำที่ดี
เดวิดแครี

@David ไอเดียที่น่าสนใจ บนจานทรงกลม Plate Carree (Cassini) จะใกล้เคียงกับสูตรโดยประมาณที่ฉันให้ไว้ที่gis.stackexchange.com/posts/2964/edit (ซึ่งอาจเป็นวิธีการแก้ปัญหาที่ยอมรับได้ที่นี่) สูตรสำหรับ TM และ TPC คล้ายกันกับทรงกลม บนรูปวงรี TPC นั้นง่ายกว่าเล็กน้อย TM อาจได้รับการสนับสนุนโดยซอฟต์แวร์เพิ่มเติม
whuber

@Karl คุณสามารถใช้โซน TM ใดก็ได้หากต้องการ เพียงแค่เลื่อนลองจิจูดทั้งหมดเพื่อให้จุดศูนย์กลางในภูมิภาคที่คุณสนใจตรงกับเส้นแวงกลางของโซนที่เลือก ทวีคูณทุกระยะทาง 1 / 0.9996 (และคูณทุกพื้นที่ด้วยจตุรัสของปัจจัยนี้) อย่าเปลี่ยนมุมหรือแบริ่งและ - หากการคำนวณของคุณสร้างจุดใหม่ - เพียงแค่เลื่อนลองจิจูดของพวกเขากลับไปที่ระบบพิกัดดั้งเดิม .
whuber

0

ฉันไม่ได้ลองสิ่งนี้ แต่จากเอกสารดูเหมือนว่าคุณสามารถใช้http://search.cpan.org/~grahamc/Geo-Coordinates-UTM-0.08/UTM.pm#latlon_to_utmเพื่อรับคู่ lat / lon (รวมถึงทรงรี) กับโซน UTM และรายการพิกัด จากนั้นคุณสามารถดำเนินการคำนวณต่อไปเหมือนเดิม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.