구형 메르카토르 대 존 UTM에서의 거리 측정


11

나는 WGS84 위도 / 경도로 포인트를 가지고 있으며 그들 사이의 "작은"(5km 미만) 거리를 측정하고 싶습니다.

http://www.movable-type.co.uk/scripts/latlong.html 에서 haversine 공식을 사용할 수 있으며 매우 잘 작동합니다.

그래도 Python Shapely 라이브러리를 사용하고 싶습니다. 따라서 거리보다 더 많은 작업을 수행 할 수 있으며 작업하는 규모에서 평평한 지구는 충분히 근사합니다. 지리 좌표를 직교 좌표로 안정적으로 투영하기 위해 Python을 사용 proj4하고 있지만 원하는 것보다 더 큰 오류가 발생하는 것 같습니다.

로컬 UTM 영역을 사용하면 몇 미터의 허세 인 사이에 차이가 생깁니다. 그러나 UTM 영역을 해결하고 싶지는 않지만 (전 세계적으로 포인트가 될 수 있음) "구형 메르카토르"를 사용해 보았지만 이제는 거리와 투사 거리의 차이가 100 % 이상입니다. 구형 메르카토르에게 정말 맞습니까? 내가 정말로 원하는 것은 전 세계 어디에서나 서로 5km 이내에있는 두 지점에 대해 실행 가능한 직교 투영입니다.

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를 사용합니다. 그러나 구형 메르카토르를 사용하면 데카르트 거리는 904m입니다.


UTM 영역은 경도를 기준으로 "운동"하기 쉽습니다. 일반적인 경도 람다 -180 <= lambda <180을 선택하고이를 사용하여 영역 번호를 Int ((180 + lambda) / 6) +1로 계산하십시오. 위도의 부호를 사용하여 북쪽과 남쪽을 결정하십시오. 위도가 높은 특수 극 지대를 사용할 필요는 없습니다. 실제로 극에 가깝기 때문에 거의 모든 UTM 영역을 사용할 수 있습니다.
whuber

답변:


17

그렇습니다. 세계적인 메르카토르 투영법으로 이러한 종류의 오류가 발생합니다. 적도에서 정확하고 적도에서 위도가 멀어 질수록 왜곡이 기하 급수적으로 증가합니다. 거리 왜곡은 위도 60도에서 정확히 2 (100 %)입니다. 귀하의 테스트 위도 (64.14도)에서 나는 904/394 = 2.294의 비율과 정확히 일치하는 2.294의 왜곡을 계산합니다. (초기 2.301을 계산했지만 WGS84 타원체가 아닌 구를 기준으로 계산되었습니다. 차이 (0.3 %)는 타원체 기반 투영법과 구 기반 Haversine 수식을 사용하여 얻을 수있는 정확도를 제공합니다. )

전 세계적으로 매우 정확한 거리를 산출하는 글로벌 프로젝션은 없습니다. 이것이 UTM 존 시스템이 사용되는 이유 중 하나입니다!

한 가지 해결책은 모든 계산에 구형 지오메트리를 사용하는 것입니다.

또 다른 해결책은 비교할 지점에 투영적용하는 것 입니다. 예를 들어, 관심 영역의 중앙 근처에 자오선이 놓여있는 가로 메르카토르 (UTM 시스템에서와 같이)를 안전하게 사용할 수 있습니다. 자오선 이동은 간단한 작업입니다. 모든 경도에서 자오선의 경도를 빼고 Prime Meridian (UTM 시스템의 0.9996이 아닌 배율 1)을 중심으로 단일 TM 투영법을 사용하십시오 . 당신의 일을 위해 이것은 경향이 있습니다UTM 자체를 사용하는 것보다 정확합니다. 정확한 각도를 제공하고 (TM은 등각) 단 수십 킬로미터로 분리 된 포인트에 대해 매우 정확합니다. 6 자리보다 더 나은 정확도를 기대하십시오. 실제로, 나는이 적응 된 TM 거리와 Haversine 거리 사이의 작은 차이가 타원체 (TM 투영에 사용됨)와 구 (Haversine에 의해 사용됨) 사이의 차이에 기인하는 경향이 있습니다. 투사.


그것은 완벽하게 들립니다. 기존 EPSG 문자열을 사용하지 않고 proj4에 대한 자체 초기화 문자열을 만들어야한다고 생각합니까?
Karl P

1
점에 투영을 +1합니다. 나는 횡 메르카토르보다 횡판 카레를 선호하지만, 작은 영역 ( "대규모")에 걸쳐 관심 영역 근처에 "가운데있는"거의 모든 투영이 좋은 정확도를 제공 할 것입니다.
David Cary

@David 재미있는 아이디어. 구에서 가로 판 Carree (Cassini)는 gis.stackexchange.com/posts/2964/edit 에서 제공 한 대략의 공식에 가깝습니다 (여기에서 수용 가능한 솔루션 일 수 있음). TM 및 TPC의 공식은 구에서 유사합니다. 타원체에서 TPC는 약간 더 간단합니다. TM은 더 많은 소프트웨어에서 지원 될 것입니다.
whuber

@Karl 원한다면 TM 존을 사용할 수 있습니다. 관심 지역의 중심점이 선택한 영역의 중심 자오선과 일치하도록 모든 경도를 이동하십시오. 모든 거리에 1 / 0.9996을 곱하고 (모든 영역에이 계수의 제곱을 곱) 각도 나 방위를 변경하지 말고 계산에 새로운 점이 생성되면 경도를 원래 좌표계로 다시 이동하십시오. .
whuber

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.