LoginSignup
6
5

More than 5 years have passed since last update.

駅周辺のスーパーとコンビニを検索して距離と徒歩移動時間を出力する (Ruby + 駅すぱあとWebサービス + YOLP)

Posted at

サンプルコード

require 'json'
require 'uri'
require 'open-uri'

# 駅すぱあとWebサービス
# @see http://docs.ekispert.com/
class Ekispert

  # Ekispertオブジェクトを生成する
  # @param access_key [String] アクセスキー
  # @return [Ekispert]
  def initialize(access_key)
    @access_key = access_key
  end

  # 駅名称から駅情報を検索する
  # @see http://docs.ekispert.com/v1/api/station.html
  # @param name [String] 駅名称
  # @return [String] 駅情報
  def station(name)
    base_url = 'https://api.ekispert.jp/v1/json/station'
    params = {
      'key' => @access_key,
      'name' => name,
      'gcs' => 'wgs84',
    }
    url = base_url + '?' + URI.encode_www_form(params)
    json = open(url).read
    json2stations(json)
  end

  private

  # 駅情報検索レスポンスJSON文字列を駅データの配列にする
  # @param json [String] JSON文字列
  # @return [Array]
  def json2stations(json)
    data = JSON.parse(json)
    # 駅が複数の場合は配列、駅が1つの場合はHashで来る
    point = data['ResultSet']['Point']
    if !point.kind_of?(Array)
      point = [point] # 駅が1つの場合は配列化
    end
    stations = []
    point.each do |p|
      stations << {
        :name => p['Station']['Name'],
        :lat  => p['GeoPoint']['lati_d'],
        :lon  => p['GeoPoint']['longi_d'],
      }
    end
    stations
  end

end

# YOLP (Yahoo! Open Local Platform)
# @see https://developer.yahoo.co.jp/webapi/map/
class YOLP

  # YOLPオブジェクトを生成する
  # @param appid [String] アプリケーションID
  # @return [YOLP]
  def initialize(appid)
    @appid = appid
  end

  # 拠点情報(POI)を検索する
  # @see https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/localsearch.html
  # @param lat [String] 緯度
  # @param lon [String] 経度
  # @param dist [String] 検索距離(km)
  # @return [String] 拠点情報(POI)
  def localsearch(lat, lon, dist)
    base_url = 'https://map.yahooapis.jp/search/local/V1/localSearch'
    params = {
      'appid'  => @appid,
      'lat'  => lat,
      'lon'  => lon,
      'gc' => '0205', # スーパー、コンビニのYOLP業種コード
      'sort' => 'dist', # 距離が近い順に取得
      'results' => '3', # 3件取得
      'output' => 'json',
    }
    url = base_url + '?' + URI.encode_www_form(params)
    JSON.parse(open(url).read)
  end

end

begin

  # 駅すぱあとWebサービス アクセスキー
  ekispert_access_key = '<YOUR ACCESS KEY>'

  # Yahoo! JAPAN アプリケーションID
  yahoo_appid = '<APPLICATION ID>'

  # 検索パラメータ
  name = 'ささしまライブ' # 駅名
  dist = '0.5' # 検索距離(km)

  # 駅情報を取得
  stations = Ekispert.new(ekispert_access_key).station(name)

  if stations.size > 0

    # 最初にヒットした駅だけ使う
    station = stations[0]

    puts "駅名: #{station[:name]}"
    puts

    # 駅周辺の店舗を検索
    list = YOLP.new(yahoo_appid).localsearch(station[:lat], station[:lon], dist)
    list['Feature'].each do |poi|
      puts "名称: #{poi['Name']}"

      if poi['Property']['Station'].size > 0
        # 最寄り駅を1つだけ出力する
        s = poi['Property']['Station'][0]
        puts "- 最寄り駅: #{s['Name']}"
        puts "- 距離: #{s['Distance']}m"
        puts "- 徒歩: #{s['Time']}分"
      end
      puts
    end
  end

rescue Exception => e
  puts "ERROR: #{e.message}"
  puts "ERROR: #{e.backtrace}"
end

出力結果

駅名: ささしまライブ

名称: ファミリーマート ささしま店
- 最寄り駅: ささしまライブ
- 距離: 220m
- 徒歩: 2分

名称: ファミマグローバルゲート店
- 最寄り駅: ささしまライブ
- 距離: 213m
- 徒歩: 2分

名称: ミニストップ 愛知大学店
- 最寄り駅: ささしまライブ
- 距離: 271m
- 徒歩: 3分

参考資料

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5