A Day In The Life

とあるプログラマの備忘録

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])

参考記事