【追記2021/01/21】1/2メッシュ以降のコードに誤りがあったので訂正しました。
はじめに
位置が地域メッシュコードで提供されているビッグデータを扱う機会があり、プログラムで扱いやすい緯度経度の形に変換する関数を作成したので共有します。
参考にしたサイト
この記事は、こちらのブログに掲載されている第三次メッシュまでの変換コードを8分の1地域メッシュにまで対応させたものです。
地域メッシュコードとは
Wikipediaの記事によると、
地域メッシュ(ちいきメッシュ)とは、統計に利用するために、緯度・経度に基づいて地域をほぼ同じ大きさの網の目(メッシュ)に分けたものである。メッシュを識別するためのコードを地域メッシュコードと言う。
地図の製作や提供においては、地域メッシュごとに紙地図を用意し、あるいはデジタル的な地図データファイルを用意することが行われる。
とされており、JIS X 0410で規格化されています。Esriジャパンのサイトにわかりやすくまとまっています。
実行環境
- docker-anacondaイメージ
- Python 3.8.5
メッシュコードから緯度経度に変換する関数
def get_latlon(meshCode):
# 文字列に変換
meshCode = str(meshCode)
# 1次メッシュ用計算
code_first_two = meshCode[0:2]
code_last_two = meshCode[2:4]
code_first_two = int(code_first_two)
code_last_two = int(code_last_two)
lat = code_first_two * 2 / 3
lon = code_last_two + 100
if len(meshCode) > 4:
# 2次メッシュ用計算
if len(meshCode) >= 6:
code_fifth = meshCode[4:5]
code_sixth = meshCode[5:6]
code_fifth = int(code_fifth)
code_sixth = int(code_sixth)
lat += code_fifth * 2 / 3 / 8
lon += code_sixth / 8
# 3次メッシュ用計算
if len(meshCode) >= 8:
code_seventh = meshCode[6:7]
code_eighth = meshCode[7:8]
code_seventh = int(code_seventh)
code_eighth = int(code_eighth)
lat += code_seventh * 2 / 3 / 8 / 10
lon += code_eighth / 8 / 10
# 1/2メッシュ用計算
if len(meshCode) >= 9:
code_nineth = meshCode[8:9]
code_nineth = int(code_nineth)
if code_nineth % 2 == 0:
lon += 0.01250000 / 2
if code_nineth > 2:
lat += 0.00833333 / 2
# 1/4メッシュ用計算
if len(meshCode) >= 10:
code_tenth = meshCode[9:10]
code_tenth = int(code_tenth)
if code_tenth % 2 == 0:
lon += 0.01250000 / 2 / 2
if code_tenth > 2:
lat += 0.00833333 / 2 / 2
# 1/8メッシュ用計算
if len(meshCode) >= 11:
code_eleventh = meshCode[10:11]
code_eleventh = int(code_eleventh)
if code_eleventh % 2 == 0:
lon += 0.01250000 / 2 / 2 / 2
if code_eleventh > 2:
lat += 0.00833333 / 2 / 2 / 2
return lat, lon
関数の使い方
Pythonに詳しい方でしたら見ればわかると思いますが、
lat,lon = get_latlon(60413212422)
のようにすると、lat
に緯度が、lon
に経度が代入されます。