pyprojとProj.4を使用してX、Y座標を緯度/経度に変換すると、誤った座標が返される


10

私は、x座標とy座標を含む複数のXMLファイルを読み取り、それらをすべて1つのcsvファイルに結合するpythonスクリプトを作成しています。緯度と経度はcsvの必須フィールドですが、オハイオ北部州平面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)

上記のどちらの方法でも同じ結果が返されますが、この緯度経度はハドソン湾のどこかにあります。ArcMapで座標をプロットすると、正しい緯度経度は-81.142311,41.688205になります。

*これは、Projが使用する順序であるため、すべての緯度経度が長く提供されていることに注意してください。

Proj.4とpyprojから間違った座標を取得する理由を誰かが知っていますか?

回答:


8

私が実行gdaltransformし、proj.4ツールを実行すると、@ geographikaと同じ結果が得られます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座標が正しく調整されていることを確認するために、視覚的なチェックを行う必要があります。丸め誤差または何かにそれを置くのに十分に類似している2つの結果が得られたときに、私が過去に経験した問題です。


19

PyProjは、座標がメートル単位であることを前提としています。フィート/メートルに関連する何かが問題の原因だと思います。

引数lon、latを使用してProjクラスインスタンスを呼び出すと、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この答えは私に正しい座標を与えました。両方の回答が役に立ったので、両方の回答を回答としてマークできればと思います。
ブライアン、

まあ、@ geographikaの回答を私の意見よりも賛成すると、すべてうまくいきます:)うまくいきました。
MerseyViking 2011年

リンクが壊れているので、あなたが書くことができることを示すために役に立つかもしれません: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.