私は多くの緯度/経度点を期待するプログラムを書いています、そして私はメートルでいくつかの計算をするためにそれらを内部的にUTMに変換します。
緯度/経度のポイント自体の範囲は非常に狭く、約200m x200mです。それらは、ほとんどの場合、単一のUTMゾーン内にあると信頼できます(運が悪く、ゾーンの境界を越えている場合を除く)。
ただし、lat/longsが含まれるゾーンは制限されていません。ある日、このプログラムはオーストラリアの人々のために実行されるかもしれません(そして、ああ、1つの州でさえいくつのゾーンがあり、どれだけの痛みが私をすでに引き起こしました...)、そして別の日はメキシコの人々のために実行されるかもしれません。
私の質問は-特定のlong/latがどのゾーンにあるかを判断して、変換ライブラリにフィードできるようにする方法はありますか(現在、proj4とRパッケージrgdal
を使用しています)。
私の言語はRですが、答えは必ずしもそうである必要はありません。単純な計算であるか、proj
実行可能ファイルにシステムコールを埋め込むことができます。
乾杯。
編集:地球上のすべての非極性領域で機能する(非R)コードの場合、 here または here を参照してください。
いくつかの例外的な領域( スバールバルとノルウェーの一部 )からのデータを扱っているのでない限り、これは十分に単純な計算なので、Rで自分で行うのもよいでしょう。 ウィキペディアの説明 経度とUTMゾーン番号の関係:
UTMシステムは、緯度80°Sから84°Nの間の地球の表面を60のゾーンに分割し、各ゾーンの幅は経度6°です。ゾーン1は経度180°から174°Wをカバーします。ゾーン番号は東に向かって増加し、経度174から180東をカバーするゾーン60になります。
したがって、データの経度で 本初子午線 が-180度から0度まで実行されるようにエンコードされていると仮定すると、上記のRコードバージョンは次のようになります。
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
その表現は明らかに少し単純化できますが、この形式では、その構成の基礎となるロジックが最も明確だと思います。 %% 60
ビットは、経度の一部が180より大きいか、-180より小さい場合に備えてあります。
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;