3歩歩くと忘れるぶろぐ

ついに大学生から社会人になってしまった、地理系・情報系大学生だった人のぶろぐ。えんじにあえんじにあ。

地域メッシュコードから緯度経度に変換する。

よく考えるとこれがプログラミングといえるのか怪しいけれど。

 

前回の日記のなかで使った

メッシュコードから緯度経度算出する部分

 

緯度経度→地域メッシュ変換のプログラムはいろいろとみつかったけれど

地域メッシュコード→緯度経度はあんまりみつからなかったのでメモ。

 

基準メッシュ(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連続が記法上使えないので全角になってる)

 

// 

(度数変換してることを書き忘れてた。。。

地域メッシュコードを算出する際に度分秒が使われているので、全部度に変換して計算してます。

 

 

--------------

アルゴリズムを勉強するなら: