概要
おはこんばんにちわ。お疲れ様です。
RailsでGoogleが提供するGeocodingAPIを使ってみましたので、
備忘録として残しておこうと思います。
環境
Ruby 3.0.3
Rails 6.1.4
はじめに
Geocoding APIの公式ページをそっと置いておきます。
今回は、経度と緯度の情報をDBに保存したいので、
バックエンド側で送られてきた住所を元にAPIから経度と緯度を取得しようと思います。
(1ヶ月の使用上限が、1000件のため)
結論
以下のようになります。
geocoding_api.rb
require "faraday"
require "json"
require 'uri'
class GeocodingApi
def fetch_map_coordinate(address)
# address = "100-8111 東京都千代田区千代田1−1" など
api_key = ENV['GEOCODING_API_KEY']
begin
coordinate = {}
# そのままの文字列ではエラーになるため、エンコードする
uri_encode_address = URI.encode_www_form_component("#{address}")
# パスに格納
target_url = "https://maps.googleapis.com/maps/api/geocode/json?address=#{uri_encode_address}&language=ja&components=country:JP&key=#{api_key}"
response = Faraday.get(target_url)
body = JSON.parse(response.body)
if response.success? && body_hash['results'].present? && body['results'][0]['geometry']['location'].present?
coordinate = {
# 緯度座標
latitude: body['results'][0]['geometry']['location']['lat'],
# 経度座標
longitude: body['results'][0]['geometry']['location']['lng']
}
end
coordinate
rescue => e
puts(Array(e.message).join("\n"))
return
end
end
end
解説
https://maps.googleapis.com/maps/api/geocode/json?address=#{uri_encode_address}&language=ja&components=country:JP&key=#{api_key}
- address: 取得したい座標の住所を指定します
- language: 結果を返す言語を指定します。今回は日本語です。
- components: エリアを絞ることができます。今回は日本国内の座標が欲しいので、指定は日本です。詳しくはこちらを参照してください。
-
key: ご自身の
GeocodingAPI
のAPIキーを指定してください。よく使われるGoogle Maps API
とは別である点に注意してください。
addressに関して
エンコード
今回は、引数で受け取った値はフォームなどから送られてきた文字列を想定しています。
この場合、直接文字列をパスに指定すると以下のように怒られますので
認識できるように文字列をエンコードする必要があります。
URI must be ascii only \"https://maps.googleapis.com/...
誤字
住所の多少の誤字は許容してくれます。
ほぼ欲しい位置の座標を返してくれます。(厳密にいえば、座標は多少ズレる)
# 入力値: 100-8111 東京都千代田区千代田1−1
# レスポンス
{
"latitude" => 35.68858013029149,
"longitude" => 139.7497355802915
}
# 入力値: 1000000 東京千代田区千代1
# レスポンス
{
"latitude" => 35.689025,
"longitude" => 139.7578666
}
住所指定
郵便番号
のみでも都道府県のみ
でも問題ありません。
しかし、正確さを求めるのであれば、住所全体を使用した方が良いです。
取得した座標を元に、Googleマップで検索するとずれていることがあります。
最後に
今回は、さらっと紹介してみました。
マップ表示は今じゃ当たり前みたいになっているので、GeocodingAPIも使う機会が増えるかもです。
誰かの役に立つことを願って、また次の記事でお会いましょう。