様々なサービスによく出てくるあのアクセス情報。
食べログ様など、飲食店の情報を表示するサービスにももちろんある、いつものあれです。
※食べログ様のスクショ
でも、実際に数十万件にも及ぶデータ(今回は施設と呼ぶ)全てに対して、1件1件入力していくのは猫の手を借りても一苦労です。
今回は、そんなアクセスデータをGoogleAPIを用いて自動で生成する方法を紹介します。
まずはなんと言っても緯度経度
アクセス情報を自動で生成する上で最も肝となるのが、駅データと施設への緯度経度情報です。
緯度経度情報は、11桁の数字なので、RubyOnRailsで言ったらdecimal型を使いましょう。
間違って、float型を使うと後でおかしなアクセス情報になります。
駅の情報を取得
自動アクセスは、基本的には「どこの駅から徒歩(or車)で◯◯分」という情報が作成されます。
そのため、まずは駅のデータが必要です。
駅のデータは、駅データ.jpから会員登録し、無料データダウンロードできる範囲のデータで正確な緯度経度情報が取得できます。
施設の緯度経度情報を挿入
もともと緯度経度情報が挿入されている場合は問題ないのですが、多くの場合そんなものを入力させる登録フォームはありません。
そのため、住所→緯度経度情報へと変換する必要があります。
これは、Google様のGoogle Maps Geocording APIを使って変換しましょう。(これが1番精度よかった)
{
"results" : [
{
....
....
....
"formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
"geometry" : {
"location" : {
"lat" : 37.4224764,
"lng" : -122.0842499
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 37.4238253802915,
"lng" : -122.0829009197085
},
"southwest" : {
"lat" : 37.4211274197085,
"lng" : -122.0855988802915
}
}
},
"place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
"types" : [ "street_address" ]
}
],
"status" : "OK"
}
こんなデータが返ってくるので、うまく緯度経度の情報だけ抜き出してあげましょう。
次に、施設から近い駅を検索
rubyにはgeokit-rails
とgemがあって、このgemによって半径◯◯kmの施設を取得することができる。
下記のような設定をしてあげる。
acts_as_mappable(default_units: :kms,
default_formula: :sphere,
distance_field_name: :distance,
lat_column_name: :latitude,
lng_column_name: :longitude)
そして、大事なのが対象となる施設を駅として扱うことである。
scope :find_candidate_stations, lambda { |from, num|
Station.where(id: Station.within(num, origin: from))
.by_distance(origin: from)
}
# というようなscopeを使い
# 対象施設(destination)
from = Station.new(lat: destination.lat, lon: destination.lon)
near_stations = find_candidate_stations(from, 10) # 対象施設から半径10kmの駅を取得している
これで、対象施設から半径10kmの候補となる駅を取得することに成功したはず。
駅からのアクセス情報を取得
下準備が整ったので、ついにアクセスデータを取得していきます。
Google Maps Direction APIを使います。
https://maps.googleapis.com/maps/api/directions/json?origin={始点の緯度経度}&destination={終点の緯度経度}&mode={walking or driving}&key={APIキー}
※APIキーはここで取得するGoogle Developer Console
こうして得られたデータはjson形式で、必要な部分を抜き出すと下記の部分。
{
....
....
....
"routes" : [
....
....
....
"legs" : [
{
"distance" : {
"text" : "0.4 km",
"value" : 425
},
"duration" : {
"text" : "5分",
"value" : 315
},
"end_address" : "日本, 〒101-0062 東京都千代田区神田駿河台4丁目 東京復活大聖堂",
"end_location" : {
"lat" : 35.6980715,
"lng" : 139.7660134
},
"start_address" : "日本, 〒113-0034 東京都文京区湯島1丁目5 外堀通り",
"start_location" : {
"lat" : 35.7006197,
"lng" : 139.7639851
},
....
....
....
}
この部分を抽出すれば、
◯◯駅から徒歩(or車)で☓☓分というアクセス情報が感性する。
まとめ
数万施設も手でいちいち手で入力するのは現実問題無理なので、自動化しないとやってられない。
そのため、今回GoogleのAPIを使ったアクセス情報の自動生成方法について書いた。
手順をまとめると
- 駅データの取得
- 目的データの緯度経度情報取得
- 候補となる最寄り駅(半径◯◯kmの駅)候補を取得
- Google Map Direction APIで経路情報を取得
である。
手入力で数万件のアクセス情報を入れるのは辛いので、ぜひこの方法で
「奥様、そう思うでしょ?でもね、・・・・」と言い返してあげてください。
※ダーツの対戦相手・スポンサー募集してます。よろしくお願いします!