最近は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使って任意の範囲内のデータを求める方法」と合わせて使うと面白いかと思います。