総務省基準地域メッシュ(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
こんな感じ。