Python を使って地域メッシュコードから緯度経度ポリゴンを算出する
日本の地域メッシュコードから緯度経度ポリゴンを算出する Python3.7 のプログラムを作成しました。 前回の記事の逆バージョンです。
プログラム
3次メッシュコード(基準地域メッシュコード)から緯度経度ポリゴンを算出します。精度を出すためにミリ秒で計算しています。
# ミリ秒 MILLISECOND = 3600000 class Grid(object): def __init__(self, code, parent=None, divide=0): size = len(code) // 2 # コードの上位桁 self.upper = int(code[:size]) # コードの下位桁 self.lower = int(code[size:]) self.height_ms = MILLISECOND * (40 / 60) self.width_ms = MILLISECOND self.parent = parent if parent: self.height_ms = parent.height_ms / divide self.width_ms = parent.width_ms / divide def origin(self): if self.parent: p = self.parent.origin() lat_ms = p[0] + (self.height_ms * self.upper) lon_ms = p[1] + (self.width_ms * self.lower) else: # 親が存在しない=1次メッシュ lat_ms = self.upper * MILLISECOND / 1.5 lon_ms = (self.lower + 100) * MILLISECOND return lat_ms, lon_ms class Code2Polygon(object): def __init__(self, code): first_code = code[0:4] second_code = code[4:6] third_code = code[6:8] # 1次メッシュ self.__first = Grid(first_code) # 2次メッシュ(1次メッシュを8分割) self.__second = Grid(second_code, self.__first, 8) # 3次メッシュ(2次メッシュを10分割) self.__third = Grid(third_code, self.__second, 10) def __to_polygon(self, s, w, n, e): return [s, w], [s, e], [n, e], [n, w], [s, w] def __to_bounds(self, origin, height_ms, width_ms): south = origin[0] west = origin[1] north = south + height_ms east = west + width_ms return south / MILLISECOND, west / MILLISECOND, north / MILLISECOND, east / MILLISECOND def third_bounds(self): origin = self.__third.origin() return self.__to_bounds(origin, self.__third.height_ms, self.__third.width_ms) def third(self): t = self.third_bounds() return self.__to_polygon(t[0], t[1], t[2], t[3])
3次メッシュのみ算出してます。
使い方
Code2Polygon クラスのコンストラクタに地域メッシュコードを渡してポリゴンを取得します。
def test_code2polygon(): # 渋谷付近のメッシュコード c2p = Code2Polygon('53393595') print(c2p.third())
上記プログラムの出力結果は以下のようになります。
([35.65833333333333, 139.6875], [35.65833333333333, 139.7], [35.666666666666664, 139.7], [35.666666666666664, 139.6875], [35.65833333333333, 139.6875])