質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

1回答

394閲覧

rake taskで2地点の緯度経度から「徒歩でかかる時間」をはじきだしてDBに保存したい

NN77

総合スコア59

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

2クリップ

投稿2019/08/17 04:08

編集2019/08/17 04:16

前提・実現したいこと

◾︎前提

緯度経度を取得済の施設と駅のテーブルが存在している

施設の住所テーブル(addresses)
|id|施設名|緯度|経度|最寄駅id(station_id)|徒歩距離(distance)
|:--|:--:|--:|
|1|施設1|35.699|139.777|3|NULL

駅テーブル(stations)
|id|駅名|緯度|経度|
|:--|:--:|--:|
|3|秋葉原|139.773|35.698|

◾︎実現したいこと
施設1と、最寄駅(id=3)の徒歩距離を取得し、施設テーブルの徒歩距離に格納するrake taskを作成したい

現在トライしている方法とわからないこと

以下の記事を参考にコードを書いてみているのですが、
https://qiita.com/izmth/items/3574c8d435c289a41955
おはずかしながら、色々検索して調べてみても、rake task内でのDirections APIの呼び出しかたがわからず、実行してみてもエラーが出てしまいます。

namespace :get_nearest_station_access do desc "get_nearest_station_access" task get_nearest_station_access: :environment do addresses = Address.all addresses.each do |address| nearest_station = Station.find(address.station_id) duration_result = gmaps.distance_matrix(origins=(address.latitude, address.longitude), destinations=(station.latitude, station.longitude),mode='walking') duration = duration_result['rows'][0]['elements'][0]['duration']['value'] address.distance = duration address.save end end end

rake task内でのGoogle map APIの呼び出し方や、
別の方法での実現方法、コードの書き方のアドバイスなど、
断片的な情報でも構いませんので、何かアドバイスいただける方がいらっしゃれば、ぜひお力添え願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
自分でこのAPIを叩いたことはないので、的確ではないと思いますが、rake task での実行を踏まえてコメントさせていただきますね。

前提

こちらのAPIを叩きたい
- https://developers.google.com/maps/documentation/directions/intro

2地点の緯度経度はすでにDBに入っているものを使うので、上記APIにこんなリクエストを出すことを想定

# 緯度経度なので、origin=41.43206,-81.38992 みたいに渡す # modeは徒歩だったらwalkingとか? curl https://maps.googleapis.com/maps/api/directions/json? origin=Toronto&destination=Montreal &avoid=highways &mode=bicycling &key=YOUR_API_KEY

結果はJSONで返ってくるので、そのJSONからdurationの項目の値を取る


もし前提を外していたら、ご容赦ください。

前提がOKな場合

  • まずは、curlコマンドで上記のような感じでリクエストをなげてみる
  • curlで試してみて、想定しているデータが取れそうなら、次はrubyで。

  • いきなりrake task用のファイルにソースコードを書かずに、可能ならrails consoleやirbのようなインタラクティブモードで試してみる
  • httpclientのようなHTTPを処理できるライブラリを使ってみる
  • httpclientで試す場合にも、getのURLはcurlでリクエストしたURLと同じにして、まずは単純にためし、うまくいきそうなら緯度経度のところを変数に置き換える

  • うまくいきそうなら、2地点の緯度経度を引数にして、Direction APIを叩いて結果を取得するメソッドを作ってみる
  • 可能ならクラスとして作ってみる
  • rake taskではこのクラスを呼び出す形にする

APIを叩いているケースのご質問をされているので、HTTPClientや類似のライブラリを使って結果を取得する、というあたりは大丈夫かなと思っています。

rake taskでの注意点とすると、そのままではデバッグとか動作確認がしづらいというあたりでしょうか。

rake taskの中で処理を全て押し込んでしまうよりは、rails consoleなどでも呼び出せるように、models/とかlib/の下に、移動時間をはじき出すメソッドやクラスを作っておくといいかなあと思います。
単体テストもしやすくなりますので。

投稿2019/08/17 05:53

suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NN77

2019/08/18 06:37 編集

こちら非常にご丁寧にありがとうございました。 デバックを加味したコードの書き方なども非常に勉強になりました。 私が前提条件の環境を伝え漏れていたのですが、 実はcloud9を用いて開発を行なっており、curlが利用できないようでした。 色々と調べて以下のコードで必要なJSONの結果が返ってくることが確認できました。 uri = URI.escape("https://maps.googleapis.com/maps/api/directions/json?origin=渋谷&destination=恵比寿&mode=walking&key=API KEY”) res = HTTP.get(uri).to_s response = JSON.parse(res) しかしながら、上記に変数を入れると今度はうまく動かなくなる新しい問題にぶち当たっています。 uri = URI.escape("https://maps.googleapis.com/maps/api/directions/json?origin=#{address.latitude},#{address.longitude}&destination=#{station.latitude},#{station.longitude}&mode=walking&key=API KEY”) res = HTTP.get(uri).to_s response = JSON.parse(res) として実行すると、 [1] pry(main)> response => {"geocoded_waypoints"=>[{}, {"geocoder_status"=>"ZERO_RESULTS"}], "routes"=>[], "status"=>"NOT_FOUND"} のように結果無しと言われてしまう。 本件については別の質問スレをたてますので、もし変数の入れ方の問題などおわかりになりましたら、またアドバイスいただけますと幸いですm_ _m よろしくお願い申し上げます。
winterboum

2019/08/18 06:40

origin=#{address.latitude},#{address.longitude} この書き方で、googleが要求する書式の経緯になっているか確認してみました?
NN77

2019/08/18 07:03

いえ、まだです。 「googleが要求する書式の経緯になっているか」がうまく見つけられず・・・ この後公式ページなど探し調べて見ます。
suama

2019/08/18 08:39

実装はご自身でされて進めてらっしゃるので、ほんの少しですがお役に立てたらなによりです。 Cloud9はAWS Cloud9を利用されていますか? もしかすると、sudo yum install curl (もしくは sudo apt install curl) でcurlもインストールできるのでは、と思います。 もしくは、お手元のPC(Macとか)のcurlで試すといいかもしれません。 よかったら試してみてくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問