yosshiee’s diary

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

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

背景

 総務省が定めた「基準地域メッシュ」なるものがあるのだが、いろいろとあるので、前回の続き。

新たなバグの原因

 前回は10進数で緯度経度を浮動小数としての表記だった場合の計算方法だったが、緯度経度の資料原本が度分秒の小数点以下60進法表記だと、10進法変換の際に60の割り算がありメッシュコードを求める計算に3/2倍があることから、不要な3割り算と3掛け算を行うことによる誤差が発生する。

対処済みrubyコード

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

def dms2mesh3( dms_lat_s, dms_lon_s )
#dms_lat_sとdms_lon_sは度分秒の文字列として"ddd.mmss"の形式で処理。

lat_deg_s,lat_ms_s = dms_lat_s.split(".")
lat_ms_s = lat_ms_s[0,4] + "0" * (lat_ms_s[0,4].length-4)
dms_lat=lat_deg_s.to_i * 3600 + (lat_ms_s[0,2].to_i) * 60 + (lat_ms_s[2,2].to_i)

lon_deg_s,lon_ms_s = dms_lon_s.split(".")
lon_ms_s = lon_ms_s[0,4] + "0" * (lon_ms_s[0,4].length-4)
ms_lon=(lon_ms_s[0,2].to_i) * 60 + (lon_ms_s[2,2].to_i)

p=dms_lat / 2400
q=(dms_lat - p * 2400) / 300
r=((dms_lat - p * 2400) - q * 300) / 30

u=lon_deg_s.to_i - 100
v=ms_lon / 450
w=(ms_lon - v * 450) / 45

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

end

 とまあこんな感じ。