2009-03-06
GeoPoをPythonで
緯度経度を文字列で表現する方式GeoPo、というのがあるらしいというのを知った。んで、サンプルコードにPythonがなかったのでついかっとなってPHPをそのまんまPythonに移植してみた。
http://geopo.at/intl/ja/developer/sample_code.html
import math def geopoEncode(latitude, longitude, scale): # 64characters (number + big and small letter + hyphen + underscore) chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_" geopo = "" # Change a degree measure to a decimal number latitude = (latitude + 90) / 180 * pow(8, 10) longitude = (longitude + 180) / 360 * pow(8, 10) # Compute a GeoPo code from head and concatenate for i in range(scale): geopo += chars[int(math.floor(latitude / pow(8, 9 - i) % 8) + math.floor(longitude / pow(8, 9 - i) % 8) * 8)] return geopo; def geopoDecode(geopo): # 64characters (number + big and small letter + hyphen + underscore) chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; latitude = 0 longitude = 0 for i in range(len(geopo)): # What number of character that equal to a GeoPo code (0-63) order = chars.find(geopo[i]) # Lat/Lng plus geolocation value of scale latitude = latitude + math.floor(order % 8) * pow(8, 9 - i); longitude = longitude + math.floor(order / 8) * pow(8, 9 - i); # Change a decimal number to a degree measure, and plus revised value that shift center of area latitude = latitude * 180 / pow(8, 10) + 180 / pow(8, len(geopo)) / 2 - 90 longitude = longitude * 360 / pow(8, 10) + 360 / pow(8, len(geopo)) / 2 - 180 scale = len(geopo) return (latitude, longitude, scale) if __name__ == '__main__': print geopoEncode(35.658578, 139.745447, 6) # -> Z4RHXX print geopoEncode(48.858271, 2.294512, 6) # -> C1qn6P print geopoEncode(31.658578, 139.745447, 3) # -> Z3O print geopoDecode("Z4RHXX") print geopoDecode("C1qn6P") print geopoDecode("Z30")
間違ってるというご指摘お待ちしております。転載、使用する方がいらっしゃいましたらご自由にどうぞ。ってほんとうに単に写しただけですが。
トラックバック - http://d.hatena.ne.jp/faw/20090306/1236306272
リンク元
- 70 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP:unofficial&hs=dRl&q=FreeBSD+dbus&btnG=検索&lr=lang_ja
- 39 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBR_jaJP309JP309&q=freebsd+dbus
- 34 http://geopo.at/intl/ja/developer/sample_code.html
- 33 http://d.hatena.ne.jp/cooldaemon/20070720/1184903937
- 19 http://www.google.co.jp/search?hl=ja&q=svnadmin+コマンド&btnG=検索&lr=
- 18 http://mixi.jp/view_diary.pl?url=http://d.hatena.ne.jp/faw/20090306/1236306272&owner_id=891290
- 18 http://www.google.co.jp/search?hl=ja&safe=off&client=firefox-a&rls=org.mozilla:ja:official&num=30&q=zfs pdf freebsd&btnG=検索&lr=lang_ja
- 18 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=rSh3ll&num=50
- 17 http://tatsuya.info/pukiwiki/?memo/FreeBSD/ZFS
- 13 http://www.google.co.jp/search?hl=ja&client=firefox-a&channel=s&rls=org.mozilla:ja:official&hs=FT5&q=imapsync+フォルダ&btnG=検索&lr=
ジオポの実装していただきありがとうございます、早速サンプルコードのページにリンクさせていただきました。
僕の書いたコードだとmathライブラリ使ってないんですけど、使うのと使わないのとどう違うのかも分かってなかったり><
そうだね。意識して同じようにしようとしてるということもあるけど、これぐらいなら差はでないね。たとえばHaskellで書こうとしたらかなり変わるだろうけどね。
> shinagakiさん
どうぞどうぞ、ご自由にお使いください。ジオポがもっと広まるといいですね。
pythonでmathライブラリを使っているのは、floorが標準では含まれていないように見えたから、というだけです。