2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Rails]GeocodingAPI 使ってみた

Last updated at Posted at 2024-12-24

概要

おはこんばんにちわ。お疲れ様です。

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も使う機会が増えるかもです。

誰かの役に立つことを願って、また次の記事でお会いましょう。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?