Program
Pythonパッケージpyprojを使って2つの座標の距離を求める
最近はPython使って位置情報をごりごり加工してますコンバンハ。
以前はMongoDBを使って半径XXKm以内にある建物を求めるってことをやりました。今回は2つの座標間の距離を求めてみます。すっごく簡単なのでオススメ。
パッケージはpyprojを使います。
pyprojインストール
$ pip install pyproj
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
[crayon-604362108cef6136210944 lang="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) |
[/crayon]
実行結果:
1 2 3 4 |
[ 東京タワー ]から[ 芝公園 ]まで 642m (641.660523655) [ 東京タワー ]から[ スカイツリー ]まで 8.1Km (8136.21631144) [ スカイツリー ]から[ フジサーン ]まで 105.5Km (105484.921113) [ 東京タワー ]から[ フジサーン ]まで 98.1Km (98064.787889) |
お手軽ー(・∀・)!
以前書いた「MongoDB使って任意の範囲内のデータを求める方法」と合わせて使うと面白いかと思います。
関連記事
2012年05月16日 | Posted in Program | No Comments »
コメントを残す