2012年8月22日水曜日

[other]現在の緯度経度からタイムゾーン取得

やりたいことはまさにこれ。

http://qa.atmarkit.co.jp/q/2309

qa内での引用元はstackoverflowのこれ。

http://stackoverflow.com/questions/5584602/determine-timezone-from-latitude-longitude-without-using-web-services-like-geona

  • Download the database of cities from geonames.org
  • convert it to a compact lat/lon -> timezone list
  • use an R-Tree implementation to efficiently lookup the nearest city (or rather, its timezone) to a given coordinate
って言ってる。

この都市情報はすげー役に立つ。
データはタブ区切りのデータになっているのでExcelやらawkやらで必要なところだけを切り取る。
私は3行目の都市名、5行目の緯度、6行目の経度、18行目のタイムゾーンだけの簡易リストを作る。

この次が…。
R-Treeのロジック作れってあるんだけど
二分木レベルお勉強中の自分のレベルじゃわからず…。

pythonにはrtreeなんてパッケージもあるよう。
これみてないけど、これつかっても解決できるかもしれない。
http://shibaok.net/index.php?prog%2Fpython%2Frtree

データをMySQLとかにつっこんでとりあえずプロトタイプを作りたいのでオーダーやフルスキャンをおそれずにこれを参考にさせてもらった。
http://ziddy.japan.zdnet.com/qa6032321.html

DBに保存している緯度経度リストが格納されているテーブル名が「location」
緯度が「latitude」フィールド、経度が「longitude」フィールドに格納されていたとしまして
以下のようなSQL文を実行すれば結果はだいたい近い順に並びますので
その一番上が一番近い1件となります。

SELECT * FROM `location` ORDER BY ABS(`latitude` - [調べたい緯度]) + ABS(`longitude` - [調べたい経度]) ASC
適当にテーブルを作る。


mysql> create table location ( city varchar(255), latitude double(10,5), longitude double(10,5));

さっき作った簡易リストをロードデータにして取り込み。


mysql> LOAD DATA LOCAL INFILE 'C:\\Users\\user\\Desktop\\city_lat_long_timezone.txt' INTO TABLE location FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

これで引用したクエリにlimit 1 とかつけて投げれば期待値は返る。
パフォーマンス…。



0 件のコメント:

コメントを投稿