😀

UTMゾーン番号の計算

2020/10/27に公開

はじめに

UTMゾーン番号は、UTM (https://ja.wikipedia.org/wiki/ユニバーサル横メルカトル図法) で、がっつり使いますが、ふと、ここのUTMゾーンで何番だったっけ?と思うことがあるかと思います(もしかしたら私だけかもしれませんがね)。

原則的には経度の割り算だけで計算できますが、若干特殊な計算が必要な部分があります。

通常の計算

経度をlon、緯度をlatとし、lonは[-180, 180)の区間にあり、latは[-90, 90]の区間にあるとします。

ほとんどは次の式ですみます。

utmzone = fix((lon+180)/6) + 1;

ここで、fix()は、小数点を切り捨てる関数とします。Cならintにキャストしますし、JavaScriptならparseInt()を使うとOKですね。

特殊な計算

特殊な計算では、UTMゾーンを見るよりUTMグリッドを見た方が良いかと思います。
経度6度で区切って数字で表し(ゾーン番号)、そのあとに、緯度8度で区切って文字で表します。

たとえば、http://www.dmap.co.uk/utmworld.htm を見てみてください。

32V (6°E 56°N - 12°E 64°N)に注目して下さい。ノルウェーの西海岸をカバーするために、32Vが西に伸びているのが分かると思います。

また、31X-37Xにも注目してみてください。Xは 72°N-84°N です。32X, 34X, 36X が存在しません。また、31Xと37Xは同じ横幅で、33Xと35Xは同じですが、31X,37X と 33X,35X とは異なる横幅です。

ここで、https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system#Exceptions を見てみましょう。

31Vの東側3°が32Vに入ると書かれています。また、31X, 33Xは、本来なら横幅が6°のところ9°であり、33Xと35Xの横幅は12°である、と書かれています。

もう少し整理すると、次のようになります。

V (56°N - 64°N)の調整
(3°E 56°N - 6°E 64°N)では31(V)から32に変更

X (72°N - 84°N)の調整
(6°E 72°N - 9°E 84°N)では32(X)から31に変更
(9°E 72°N - 12°E 84°N)では32(X)から33に変更
(18°E 72°N - 21°E 84°N)では34(X)から33に変更
(21°E 72°N - 24°E 84°N)では34(X)から35に変更
(30°E 72°N - 33°E 84°N)では36(X)から35に変更
(33°E 72°N - 36°E 84°N)では36(X)から37に変更

これらをプログラムとして書くと、たとえば次のようになります。

if( lat >= 56 && lat < 64 ) {
  if( lon >=  3 && lon <  6 ) {
    utmzone = 32;
  }
}
else if( lat >= 72 && lat < 84 ) {
  if( lon >=  6 && lon <  9 ) {
    utmzone = 31;
  }
  if( lon >=  9 && lon < 12 ) {
    utmzone = 33;
  }
  if( lon >= 18 && lon < 21 ) {
    utmzone = 33;
  }
  if( lon >= 21 && lon < 24 ) {
    utmzone = 35;
  }
  if( lon >= 30 && lon < 33 ) {
    utmzone = 35;
  }
  if( lon >= 33 && lon < 36 ) {
    utmzone = 37;
  }
}

おわりに

UTMゾーン番号を計算してみました。たいしたことないと思います。特にわが国をカバーするだけで済むなら、単純な計算で済みます。

本記事のライセンス

クリエイティブ・コモンズ・ライセンス
この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンス の下に提供されています。

Discussion