yosshiee’s diary

日々の仕事、生活からのTIPS等をだらだらと書いていきます。たぶん役に立つ人にとって役に立つことを書いているつもり。

総務省基準地域メッシュ(3次メッシュ)の求め方 その1

背景

 総務省が定めた「基準地域メッシュ」なるものがあり、概ね1kmメッシュとなっていることから、各種統計で使われる地域メッシュコードとして用いられている。

 当然、緯度経度から求める公式があるのだが、仕事で使っているコードにバグを見つけたので、まとめておく。

バグの原因

 理由は単純で、緯度経度を浮動小数として計算していくと、四則演算の途中で誤差が発生し、最後に切り捨て(int。rubyだと .to_i)する際に微妙に足りなくて、一つ手前の格子番号が割り当てられてしまう。

対処済みrubyコード

 なので、その点を注意してコーディングする。大して桁がないので整数演算することにする。

def mesh3( lat, lon )
#latとlonは、緯度経度を少数で表したもの。小数点以下4桁程度の精度を想定。
epsilon=1e-8
lat_i = (lat.to_f * 10000 +epsilon).to_i
lon_i = ((lon.to_f-100) * 10000 +epsilon).to_i
p=(lat_i*1.5).to_i / 10000
q=((lat_i*1.5).to_i % 10000) * 8 / 10000
r=((lat_i*1.5).to_i % 10000) * 8 % 10000 / 1000
u=lon_i / 10000
v=(lon_i % 10000) * 8 / 10000
w=((lon_i % 10000) * 8 % 10000 ) / 1000

return sprintf("%02d%02d%01d%01d%01d%01d",p,u,q,v,r,w )

end 

  こんな感じ。