rubyで住所から最寄駅の情報を取得できる様にしてみました。
やったことざっくり
- Yahoo APIで住所からを緯度経度を取得
- Heart Rails APIで緯度経度から最寄駅情報を取得
## 実行環境
- ruby2.7.2
- mac catalina
- 実行日時 2021/01/01
1. Yahoo APIで住所からを緯度経度を取得
1.1 yahoo app ID 取得
ここで取得する
https://e.developer.yahoo.co.jp/dashboard/
1.2 リクエストする
・リクエストする住所をurl様にエンコード
・open-uriでリクエストする
レスポンスはこんな感じ
1.3 レスポンスから緯度経度をスクレイピング
REXMLを使って取得します。
coordinatesタグに格納されてます。
2. Heart Rails APIで緯度経度から最寄駅情報を取得
2.1 1.で取得した緯度経度でリクエストする
urlはこちら
http://express.heartrails.com/api/xml?method=getStations&x=#{lon}&y=#{lat}"
返ってくるレスポンスはこんな感じ (近い順に複数返ってきてます)
2.2 返ってきた最寄駅情報をスクレイピングする
上記の様にstationタグに駅情報が入っています。
複数の駅情報が含まれるので最初のstationタグを指定します。
完成したコード
コードはこんな感じになります。
require 'open-uri'
require 'uri'
require "rexml/document"
## 1. request Yahoo API
### 1.1
YAHOO_APP_ID = '[Yahoo app_id]'
### 1.2
ADDRESS ='東京都千代田区千代田1番1号'
p ADDRESS
query = URI.encode_www_form(query: ADDRESS) ## エンコーディング
request_url = "https://map.yahooapis.jp/geocode/V1/geoCoder?appid=#{YAHOO_APP_ID}&#{query}"
### 1.3
res = OpenURI.open_uri(request_url)
doc = REXML::Document.new(res.read)
coordinates = doc.elements['YDF/Feature/Geometry/Coordinates'].text
lon,lat = coordinates.split(',')
p "経度 = #{lon} , 緯度 = #{lat}"
## 2. Heart Rails API
### 2.1 1.で取得した緯度経度でリクエストする
heart_rails_request_url = "http://express.heartrails.com/api/xml?method=getStations&x=#{lon}&y=#{lat}"
### 2.2 返ってきた最寄駅情報をスクレイピングする
res = OpenURI.open_uri(heart_rails_request_url)
doc = REXML::Document.new(res.read)
station = doc.elements['response/station[1]']
name = station.elements['name'].text
line = station.elements['line'].text
distance = station.elements['distance'].text
p name
p line
p distance
実行結果
皇居(東京都千代田区千代田1番1号)で最寄駅をリクエストしてみた結果。
"経度 = 139.75381447 , 緯度 = 35.68382285"
"桜田門"
"東京メトロ有楽町線"
"740m"