14

私は次の入力を試しました:緯度/経度データ次に、その周りのボックスを計算します。たとえば、50 m、つまり東座標/北座標値で+/-50mです。

今、私はそれをlat /lonにそしてスクリプトで再変換します:

http://robotics.ai.uiuc.edu/~hyoon24/LatLongUTMconversion.py私は、前は約7、その後は約2であるという結果を得ることができません。

zone, easting, northing = LLtoUTM(23, location.get_lat(), location.get_lon()) 

topUTM = northing + error
bottomUTM = northing - error
leftUTM = easting - error
rightUTM = easting + error
left, top = UTMtoLL(23, leftUTM, topUTM, zone)

コードにエラーがありますか、それともスクリプトに欠陥がある可能性がありますか?

だから私はpyprojを使ってみました。lat/lonからutm、lat / lonまで、何が起こるか見てみました。

>>> p = pyproj.Proj(proj='utm', zone=32, ellps='WGS84')
>>> p
<pyproj.Proj object at 0x7ff9b8487dd0>
>>> x,y = p(47.9941214, 7.8509671)
>>> print x,y
5159550.36822 1114087.43925
>>> print p(x,y,inverse=True)
(47.971558538495991, 7.8546573140162605)

そして、ここでは上からのスクリプトほど極端に遠くはありませんが、それでもそれを使用できないほど強く間違っているようです。どうして?より正確な結果を得るにはどうすればよいですか?

編集:

test()を実行したところ、すべてのテストに合格しました。

epsgファイルにはそのようなものはありません。私が見つけた最も近いものはこれでした:

<32632> +proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <>

tmercはありません。また、towgs84をパラメーターとして渡すために何が必要ですか?上記のもの?

4

4 に答える 4

52

先週、Python 用の小さな UTM 変換ライブラリを作成し、Python パッケージ インデックスにアップロードしました: http://pypi.python.org/pypi/utm

pyproj の使用と比較しましたが、より高速で正確です。サンプル データが与えられた場合、これが結果です。

>>> import utm

>>> u = utm.from_latlon(47.9941214, 7.8509671)
>>> print u
(414278, 5316285, 32, 'T')

>>> print utm.to_latlon(*u)
(47.994157948891505, 7.850963967574302)

更新:以下のRichardsの回答では、この問題の実際の解決策について説明しています。

于 2013-01-05T20:23:06.297 に答える
29

エラーはコードにあります。

まず、他の回答の1つにリストされているPyProjの問題は本物です。epsg ファイルをチェックして、次の行が含まれていることを確認してください。

<2392> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs no_defs <>

パラメータに注意してtowgs84ください。

PyProj の問題は、射影コマンドの誤用に起因します。

47.9941214N、7.8509671Eを UTMに変換すると、Zone 32、414278 Easting、5316286 Northing が得られます。

次の PyProj 操作を実行します。

p = pyproj.Proj(proj='utm', zone=32, ellps='WGS84')
>>> x,y = p(47.9941214, 7.8509671)
>>> print x,y
5159550.36822 1114087.43925
>>> print p(x,y,inverse=True)
(47.971558538495991, 7.8546573140162605)

しかし、PyProj のドキュメントを参照すると、次のことがわかります。

引数 lon、lat を指定して Proj クラス インスタンスを呼び出すと、lon/lat (度単位) が x/y ネイティブ マップ投影座標 (メートル単位) に変換されます。

OP の PyProj 操作をもう一度実行してみましょう。ただし、lon/lat 引数の順序を切り替えます。

p = pyproj.Proj(proj='utm', zone=32, ellps='WGS84')
>>> x,y = p(7.8509671, 47.9941214)
>>> print x,y
414278.16731 5316285.59492
>>> print p(x,y,inverse=True)
(7.850967099999812, 47.994121399999784)

操作は (かなり) 完全に反転します!

質問の最初の部分に答えるためにhttp://robotics.ai.uiuc.edu/~hyoon24/LatLongUTMconversion.py、 の定義を見るとUTMtoLL、次のことがわかります。

UTMtoLL(ReferenceEllipsoid, northing, easting, zone)

それでもUTMtoLL(23, leftUTM, topUTM, zone)、leftUTM が東座標で、topUTM が北座標である場所を使用します。

したがって、最初のスクリプトと PyProj の両方の場合、間違った引数の順序を使用しています。

他の誰かが間違っていると示唆する前に、自分の作業を常に 2 回 (または 3 回) チェックすることを忘れないでください。とは言っても、Python のドキュメントは最高のものではなく、この場合の PyProj のドキュメントはせいぜい不可解です。このコマンドの素晴らしい Web ベースの説明と、その使用例が付随していれば、おそらくあなたの不安は防げたでしょう。

于 2013-09-04T18:10:30.803 に答える
2

pyProj に関する問題は、ここで説明されている問題のように聞こえます。

http://code.google.com/p/pyproj/issues/detail?id=3

これは解決されます:

solved! in epsg file there must be

<2392> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs no_defs <>

note the towgs84 parameter!

pyproj を引き続き使用する場合は、そのスレッドを確認してください。

また、test()モジュールの機能は動作しますか?testディレクトリにあるスクリプトを試しましたか?

于 2011-07-21T15:28:54.070 に答える