2012-02-08 19 views
15

私は、いくつかの緯度/経度が必要なプログラムを作成しています。それらをメートル単位で内部的にUTMに変換しています。経度/緯度からUTMゾーンを決定する

緯度/経度の範囲自体は非常に小さく、約200m×200mです。それらはほとんどの場合、単一のUTMゾーン内に存在することができます(ただし、不運になることがなく、ゾーンの境界を越えている場合を除く)。

ただし、緯度/経度のゾーンは制限されていません。ある日、このプログラムはオーストラリアの人々のために実行されるかもしれません(そして、ああ、どれくらいのゾーンが単一の州に横たわっていて、どれくらいの苦痛が私に起こったのか...)、メキシコの人々のためにもう一日。

私の質問は、変換ライブラリ(私は現在proj4とRパッケージrgdalを使用しています)に入力できるように、特定のlong/latがあるゾーンを特定する方法があります。

私の言語はRですが、答えは簡単ではありません。多分簡単な計算です。あるいは、projへのシステムコールを埋め込むことができます。

歓声。

+0

http://stat.ethz.ch/R-manual/R-patched /library/base/html/timezones.html – aatrujillob

+0

これをgis.stackexchange.comに移動することをお勧めします。 – blindjesse

+0

@AndresT - タイムゾーンです。 UTMゾーンが必要です。 –

答えて

33

編集:のために、地球上のすべての非極性領域で動作します(非R)コードの場合hereまたはhereを参照してください。


あなたは異例のエリア(Svalbard and parts of Norway)のカップルからのデータを扱っている場合を除き、これはあなたにもちょうどRにそれを自分で行う可能性があり、単純な十分な計算はここ経度はUTMにどのように関連するかのWikipedia's descriptionですゾーン番号:

UTMシステムは、80°Sと84°Nの緯度の間で、地球の表面を幅が6°の60個のゾーンに分割します。ゾーン1は経度180°〜174°Wをカバーします。ゾーン番号は、東経174から180東を含むゾーン60まで増加します。

long2UTM <- function(long) { 
    (floor((long + 180)/6) %% 60) + 1 
} 

# Trying it out for San Francisco, clearly in UTM Zone 10 
# in the figure in the Wikipedia article linked above 
SFlong <- -122.4192 
long2UTM(SFlong) 
# [1] 10 

すなわち式:

したがって、Prime Meridianの西へのデータの中経度が-180 0度から実行として符号化されると仮定し、ここで上記のRコードバージョンです明らかに少し単純化することができますが、私はこの形でその構造の基礎となるロジックが最も明確であると思います。 %% 60ビットは、あなたの経度のいくつかが180より大きい場合、または-180より小さい場合のためにそこにあります。

+0

ああ、これは私が後にした計算だった - 私は年齢を過ごす "緯度/経度からUTMゾーンを計算する方法"とWikiをチェックするとは思わなかった。乾杯! –

+0

ええ、私はあまりにもずっと前と同じプロセスを行った。助けになるのはうれしい。ところで、空間データで多くのことを行うなら、[R-sig-geo](https://stat.ethz.ch/mailman/listinfo/r-sig-geo)のリストサービスは非常に貴重です。私は最近、そこに質問をし、Roger Bivand自身のすぐ近くの助けを借りてくれました。彼は私と彼といくつかのRコアメンバーが提供できなかった答えを私に出しました。乾杯! –

+0

@ToolmakerSteve - 提案された訂正(それをレビューした5人の編集者のうちの3人が間違って拒否した)をありがとう。 –

2

Iは、r-コードを知らないが、私は、このPL/SQLコードは、例外を除いて、あなたを助けることができるとします

UTMZone := Trunc((lon - Zone0WestMeridian)/d); 
    --Special Cases for Norway & Svalbard 
    CASE 
    WHEN (lat > 55) AND (UTMZone = 31) AND (lat < 64) AND (lon > 2) THEN UTMZone := 32; 
    WHEN (lat > 71) AND (UTMZone = 32) AND (lon < 9) THEN UTMZone := 31; 
    WHEN (lat > 71) AND (UTMZone = 32) AND (lon > 8) THEN UTMZone := 33; 
    WHEN (lat > 71) AND (UTMZone = 34) AND (lon < 21) THEN UTMZone := 33; 
    WHEN (lat > 71) AND (UTMZone = 34) AND (lon > 20) THEN UTMZone := 35; 
    WHEN (lat > 71) AND (UTMZone = 36) AND (lon < 33) THEN UTMZone := 35; 
    WHEN (lat > 71) AND (UTMZone = 36) AND (lon > 32) THEN UTMZone := 37; 
    ELSE UTMZone := UTMZone; 
    END CASE;