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