地域メッシュコードから緯度経度に変換する。
よく考えるとこれがプログラミングといえるのか怪しいけれど。
前回の日記のなかで使った
メッシュコードから緯度経度算出する部分
緯度経度→地域メッシュ変換のプログラムはいろいろとみつかったけれど
地域メッシュコード→緯度経度はあんまりみつからなかったのでメモ。
基準メッシュ(3次メッシュ)から緯度経度(南端、西端)
こことか(http://www.erde.co.jp/blog/?p=646)
総務省統計局のPDF(http://www.stat.go.jp/data/mesh/gaiyou.htm)とか
参考にした。
参考サイトの上のサイトによると
緯度:=(LEFT(M1,2)/1.5*3600+MID(M1,5,1)*5*60+MID(M1,7,1)*30)/3600
経度:=((MID(M1,3,2)+100)*3600+MID(M1,6,1)*7.5*60+MID(M1,8,1)*45)/3600
で終わるらしいけど
自分なりに書いてみた。
総務省のによると
3次メッシュコードは8桁からなっていて
1次メッシュ4桁(①)+2次メッシュ2桁(②)+3次メッシュ2桁(③)
になってる。
①部分
1次メッシュ4桁は上2桁と下2桁に分割できる
上二桁で緯度(メッシュの南端)
下2桁で経度(メッシュ西端)
を表示している。
上2桁=緯度×1.5という変換なので、上2桁/1.5をすると緯度が算出できる。
下2桁は経度-100で算出されているので下2桁+100で算出できる。
(下2桁の経度適当すぎるやろ…。)
これが1次メッシュの南端緯度、西端経度となる。
②部分
2次メッシュは2桁からできていて、1次と同じように上部分が緯度、下部分が経度を表している。
緯度部分
1次メッシュで緯度=上2桁/1.5という計算がされていると説明したが、計算的にはこれには余りを足したものが緯度となる。
その余り部分/5をしたものが2次の上部分になっているため、上部分*5をする。
①で算出した緯度に2次メッシュで算出した緯度部分を加えると、2次メッシュの緯度が求められる。
経度部分
緯度と同じように、1時メッシュの余り部分が使われている。
余り部分*8で2次の下部分になっているため、下部分/8する。
①で算出した経度に2次メッシュで算出した経度部分を足すと2次メッシュの経度が求められる。
③部分
基準メッシュ部分も2次メッシュのものと同様に上と下に分ける。
緯度部分
2次メッシュの緯度の余り部分×2が上部分になっているので、上部分/2で余りが求められる。
②までで算出したものにこれを加えると、基準メッシュの緯度が求められる。
経度部分
2次メッシュの経度の余り部分×4/3が下部分になっているので、下部分×3/4で余りが求められる。
②までで算出したものにこれを加えると。基準メッシュの経度が求められる。
ということで
1次地域メッシュ・コード | 2次地域メッシュ・コード | 基準地域メッシュ・コード | 2分の1地域メッシュ・コード |
5137 | 75 | 97 | 4 |
5137 | 75 | 98 | 3 |
5137 | 75 | 98 | 4 |
5137 | 75 | 99 | 1 |
(と、1次2次基準メッシュ…とセルごとに分割されてる場合の)
(ループ文:CSVから読み込んだやつから算出する用)
For i = 0 To num - 2
'1次メッシュ分解 上2桁と下2桁
p = Fix(Cells(i + 2, 1) / 100)
s = Fix(Cells(i + 2, 1) - (p * 100))
'2次メッシュ分解
q = Fix(Cells(i + 2, 2) / 10)
t = Fix(Cells(i + 2, 2) - (q * 10))
'3次メッシュ分解
r = Fix(Cells(i + 2, 3) / 10)
u = Fix(Cells(i + 2, 3) - (r * 10))
'度分秒変換で度に統一する
ido = (p * 40 / 60) + ((5 * q) / 60) + ((r * 30 / 60) / 3600)
keido = 100 + s + ((t * 15 / 120) / 60) + ((u * 45 / 60) / 3600)
’セルに代入
Cells(i + 2, 15) = ido
Cells(i + 2, 16) = keido
Next i
LEFTとMIDを使うともっと綺麗になると思う。
夜中にぐちゃぐちゃ書いてたのでぐちゃぐちゃ
(半角括弧2連続が記法上使えないので全角になってる)
//
(度数変換してることを書き忘れてた。。。
地域メッシュコードを算出する際に度分秒が使われているので、全部度に変換して計算してます。
--------------
アルゴリズムを勉強するなら: