2013/12/10

天気予報の地域細分コードとGPSの緯度・軽度をマッピングしてみる

天気予報を使ったアプリをちょっと考えていたのですが、一次細分区域と地図上の緯度・軽度のマッピングってどこにもないんですね ... そこで、Google Mapを使って作ってみました。

対応データを作ってみる

まずは、対応データを作る方法です。JavaScriptからGoogle MapのAPIを呼び出し、142地域分の地名から緯度・経度を取得します。アプリからGoogle Map APIを呼び出すと、微調整がきかないので、予め142地域の緯度・経度を取得しておいて、データベース登録しておきます。ちなみに、142の地域とは気象法?で定められている天気予報の区域なのものなので、どの天気予報APIを使っても同じだと思います。
地域名は、livedoorの天気RSSから一覧を作りました。なぜか地域によっては、Google APIが複数の緯度・経度が返すパターンあるみたいで、とりあえず先頭のやつを使うことにしていますが、もしかしたら全部取り込んだ方がいいかもしれません(形がいびつな県もあるからかな ...)。

↑で作成した一覧をテーブルにでも取り込めばとりあえず、対応マップ(緯度・経度→地域細分コード)の完成です。

<取得したデータ>
#一次細分区域コード, 地名,緯度,経度
1, 北海道 稚内, 45.4156641,141.67308219999995
2, 北海道 旭川, 43.7706355,142.364819
3, 北海道 留萌, 43.9409868,141.63701190000006
4, 北海道 札幌, 43.0620958,141.3543763
...

実際の検索方法

作成したマッピングデータを検索するには、ユークリッド距離を使います。要は、GPSから取得した現在の緯度・経度に近い一次細分区域コードを取得して、そのコードを使って天気予報のAPIを呼び出せばいいわけです。

SQLで取得するイメージはこんな感じです。ここら辺が参考になります。条件で適当な距離でしぼっておくといい感じになります。
mysql> select distinct 
   一次細分区域コード,
   sqrt(power((GPSの緯度2 - 緯度) / 0.0111, 2) 
      + power((GPSの経度2 - 経度) / 0.0091, 2)) as distance
FROM マッピングデータ
WHERE 
  distance <= 20 -- 適当な距離で絞る(20Km)
ORDER BY 
  distance ASC;


まとめ

直線距離で取得する場合、県境に住んでいる人なんか微妙ですね。都道府県の形って変なものがありますからね。UIの設計としては、近いもの順にいくつか候補として選択させる方が無難かもしれませんね。

0 件のコメント:

コメントを投稿