pyproj 및 Proj.4를 사용하여 X, Y 좌표를 위도 / 경도로 변환하면 잘못된 좌표가 반환됩니다.


10

x 및 y 좌표를 포함하는 여러 XML 파일을 읽고 모두 단일 csv 파일로 결합하는 python 스크립트를 작성 중입니다. CSV의 위도 및 경도는 필수 필드이지만 Ohio North State Plan usFt의 x, y 좌표를 WGS84로 변환하는 데 어려움이 있습니다.

>>> p = Proj(r'+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs') #Nad83 State Plane Ohio North US Feet Proj object using parameters
>>> p(739400.91,2339327.3,inverse=True)
(-80.138057868777224, 60.278230707978487)
>>> p1 = Proj(init="epsg:3734") #Nad83 State Plane Ohio North US Feet Proj object using EPSG code
>>> p1(739400.91,2339327.3,inverse=True)
(-80.138057868777224, 60.278230707978487)

위의 두 방법 모두 동일한 결과를 반환하지만이 지연 시간은 Hudson Bay 어딘가에 있습니다. ArcMap에서 좌표를 플롯 할 때 올바른 위도 길이는 -81.142311,41.688205입니다.

*이 모든 Pro는 Long, Long이 제공됩니다.

누구든지 내가 Proj.4와 pyproj에서 잘못된 좌표를 얻는 이유를 알고 있습니까?

답변:


8

내가 실행할 때 @geographika와 같은 결과를 얻었고 gdaltransformproj.4 도구를 사용했습니다 cs2cs.

$ gdaltransform -s_srs EPSG:3734 -t_srs EPSG:4326
739400.9 2339327.3             
-87.3195485720169 45.9860670658218 0

cs2cs +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs +to +proj=lonlat +datum=WGS84
739400.9 2339327.3
87d19'10.375"W 45d59'9.841"N 0.000

그러나 포인트의 x 및 y 좌표를 반대로하면 ArcMap에서 볼 수있는 결과가 나타납니다.

gdaltransform -s_srs EPSG:3734 -t_srs EPSG:4326
2339327.3 739400.9
-81.1423086719059 41.6882035384526 0

따라서 x 및 y 좌표가 올바른 방향으로 조정되도록 육안 검사를 수행해야합니다. 반올림 오류 또는 무언가에 넣을 정도로 비슷한 두 가지 결과를 얻을 때 과거에 겪었던 문제입니다.


19

PyProj는 좌표가 미터 단위라고 가정합니다. 피트 / 미터와 관련된 것이 문제의 원인이라고 생각합니다.

lon 인수로 Proj 클래스 인스턴스를 호출하면 lat은 lon / lat (도)를 x / y 기본 맵 투영 좌표 (미터)로 변환합니다

선택적 키워드 'preserve_units'가 True 인 경우 맵 투영 좌표의 단위는 미터가되지 않습니다.

http://pyproj.googlecode.com/svn/trunk/docs/pyproj.Proj-class.html

초기 좌표는 피트입니까? ArcMap에 데이터를로드 할 때지도는 어떤 단위를 사용합니까?

좌표가 조금 더 가깝습니다.

p1 = Proj(init="epsg:3734")
#1 foot = 0.3048 meters
conv = 0.3048
print p1(739400.91 * conv,2339327.3 * conv,inverse=True)
(-87.3195533069909, 45.98605408134072)

비슷한 문제가 여기에서 찾을 수 있습니다 .


대단히 감사합니다. preserve_units 인수는 분명히 트릭을 수행했지만 좌표는 여전히 올바르지 않습니다. @MerseyViking이 답변은 정확한 좌표를 제공했습니다. 두 답변 모두 도움이 되었기 때문에 두 답변을 모두 답변으로 표시 할 수 있기를 바랍니다.
Brian

사람들이 @geographika의 대답을 내 것보다 더 많이 찬성했다면 모두 사라질 것입니다. :) 다행입니다.
MerseyViking

링크가 끊어 p1 = Proj( init="epsg:3734", preserve_units=True )
BenjaminGolder

4

나는 실제로 OH 남쪽 비행기 그리드를 제외하고는 똑같은 일을하려고 노력했으며 귀하의 질문에 부딪 쳤습니다. 3735로 잘못된 결과를 얻었습니다. 이제 3729로 올바른 결과를 얻습니다. 3734에서 3728으로 변경하면 올바른 결과를 얻을 것으로 기대합니다.

EPSG : 3728 : NAD83 (NSRS2007) / 오하이오 노스 (ftUS) EPSG : 3729 : NAD83 (NSRS2007) / 오하이오 사우스 (ftUS) EPSG : 3734 : NAD83 / 오하이오 노스 (ftUS) EPSG : 3735 : NAD83 / 오하이오 사우스 (ftUS)

나는 당신의 제공된 위도를 길게 사용했으며 1 피트 미만으로 벗어났습니다.

p2 = pyproj.Proj (init = "epsg : 3728", preserve_units = True)

p2 (-81.142311,41.688205)

(2339326.6558868014, 739401.4226131936)

vs 2339327.3, 739400.91

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