Pythonパッケージpyprojを使って2つの座標の距離を求める

最近はPython使って位置情報をごりごり加工してますコンバンハ。

以前はMongoDBを使って半径XXKm以内にある建物を求めるってことをやりました。今回は2つの座標間の距離を求めてみます。すっごく簡単なのでオススメ。

パッケージはpyprojを使います。

pyprojインストール
$ pip install pyproj

コード

[python title="getdistance.py"]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from pyproj import Geod

class GetDistance:
    def get_distance(self, start, to):
        """
        pyprojを使って距離を求める
        """
        res = u'[ %(from)s ]から[ %(to)s ]まで %(distance_str)s (%(distance)s)'

        q = Geod(ellps='WGS84')
        fa, ba, d = q.inv(start['lon'], start['lat'], to['lon'], to['lat'])

        print res % {
            'from'  : start['name'],
            'to'    : to['name'],
            'distance_str'  : self._cutdown(d),
            'distance'      : d,
        }


    def _cutdown(self, num):
        """
        距離に単位をつけて返す

        1000m以下の時はメートル表記、
        それ以上の時はキロメートル表記で返す。
        """
        val = int(round(num))
        if val < 1000:
            return '%sm' % val
        else:
            km = val * 0.001
            return '%sKm' % round(km, 1)





if __name__ == '__main__':
    # 東京タワー
    tokyo_tw = {
        'name': u'東京タワー',
        'lat' : 35.65861,
        'lon' : 139.745447,
    }

    # 芝公園
    shiba_park = {
        'name': u'芝公園',
        'lat' : 35.654071,
        'lon' : 139.749838,
    }

    # スカイツリー
    skytree = {
        'name': u'スカイツリー',
        'lat' : 35.71007,
        'lon' : 139.80948,
    }

    # 富士山
    mt_fuji = {
        'name': u'フジサーン',
        'lat' : 35.360556,
        'lon' : 138.727778,
    }

    g = GetDistance()
    g.get_distance(tokyo_tw, shiba_park)
    g.get_distance(tokyo_tw, skytree)
    g.get_distance(skytree, mt_fuji)
    g.get_distance(tokyo_tw, mt_fuji)
[/python]

実行結果:

[ 東京タワー ]から[ 芝公園 ]まで 642m (641.660523655)
[ 東京タワー ]から[ スカイツリー ]まで 8.1Km (8136.21631144)
[ スカイツリー ]から[ フジサーン ]まで 105.5Km (105484.921113)
[ 東京タワー ]から[ フジサーン ]まで 98.1Km (98064.787889)

お手軽ー(・∀・)!

以前書いた「MongoDB使って任意の範囲内のデータを求める方法」と合わせて使うと面白いかと思います。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください