Header
2019-11-18
2019-11-19

Ruby on RailsとGoogle Geocoding APIで住所から緯度・経度を取得する方法

2019 11 19 map

Ruby on RailsとGoogle Geocoding APIで住所から緯度・経度を取得する方法を公開します。

店舗名などからも緯度経度化が可能で、精度も微妙にずれるくらいなのでサービスレベルで精度が求められないなら、この設定だけでもいい気がします。

Railsバーション 5.1

Google Maps PlatformからApiKeyを取得する

Google Maps Platformに登録すれば、緯度経度取得のジオコードおよび、グーグルマップのAPIなども利用できます。

無料ですが2019年11月時点ではクレジットカードと住所の登録が必須です

月300ドル分の利用料が1年間無料になるという形で、300ドルを超えた場合は追加請求されることはありません。

ただ、これはグーグルの仕様なので後々変更されるかもしれませんのでご注意ください

サイトにアクセスする

アクセス後右上の使ってみるを選択

API公式サイト

利用機能選択画面 プレイスだけ選択すれば緯度経度変換は可能だが、一様全て登録

利用機能選択画面

プロジェクト名を入力

プロジェクト選択画面

請求先アカウントの作成を選択

請求先アカウントの作成1

国とプライバシーポリシーに同意

請求先アカウントの作成2

クレジットカードと住所を登録

請求先アカウントの作成3

次へを選択

APIアカウントの有効化

APIキーをコピーし保存

APIアカウントの有効化

APIキーを後から確認する場合

任意のAPIを選択(今回はジオコード)

APIキーの確認1

任意のAPIを選択(今回はジオコード)

APIキーの確認1

認証情報を選択

APIアカウントの有効化

右側のペンのマークを選択

APIアカウントの有効化

右上に表示されるAPIキーをコピー

APIアカウントの有効化

geocoderのgemをダウンロード

グーグルマップだけでなく、その他APIを利用して緯度経度化できる便利なgem グーグルのAPIを利用せずとも住所を入力すればある程度緯度経度化も可能

gem 'geocoder'

上記をインストール

geocoder公式サイト

latitude、longitudeカラムを追加

以下では、brancheテーブルに対して、 住所を格納するaddressカラムと緯度経度を自動登録する latitude、longitudeカラムを追加している。

latitude、longitudeカラムはfloat型である事が必須

class AddLatitudesToBranches < ActiveRecord::Migration
  def change
   add_column :address, :latitude, :string
    add_column :branches, :latitude, :float
    add_column :branches, :longitude, :float
  end
end

Modelを変更する

以下で、addressのカラムに新規登録や更新処理が走った場合に 自動で緯度経度の情報を新規登録・更新が実施されるようになります。

class MBranch < < ActiveRecord::Migration
  geocoded_by :address
  after_validation :geocode, if: :address_changed?

end

なお登録住所で緯度経度を取得できなかった場合、新規登録の場合はNullのまま 正常値から異常値に変更される場合は前回の値がそのまま残ります。

geocoder用のコンフィグファイルを作成

以下コマンドでコンフィグファイルを生成

rails g geocoder:config

config/initializers/geocoder.rbにコンフィグファイルが生成されるので、googlemap

ApiKeyを設定

事前にコピペしたのkeyをapi_keyの欄に設定

# config/initializers/geocoder.rb

Geocoder.configure(

    # street address geocoding service (default :nominatim)
    lookup: :google,

    # to use an API key:
    api_key: "キー",

    # geocoding service request timeout, in seconds (default 3):
    timeout: 5,

    # set default units to kilometers:
    units: :km

)

以上で、Rails cかフォームでaddressカラムを変更すると 緯度経度が登録・更新されます。

以上になります。

その他関連記事

Carrierwave+S3で複数画像をアップロードする|Ruby on Rails5

Gemを利用せずRailsで画像をDBに投稿する

kaminariのページネーションをerbからSlimにするとエラーになる

Ruby on Railsで大量データを繰り返し処理する場合findeachやinbatchesを使おう

未経験からエンジニアへ転職した人間が考える今からエンジニアに就職する方法

ユーザーのフラグ管理に使えるRuby On Railsのenumを紹介

【初心者・独学者向け】Ruby on RailsでテーブルやModelを削除する際のコマンド

【初心者・独学者向け】Ruby on Railsで中間テーブルを作成し、多対多を実現する

前の記事
次の記事
人気記事
カテゴリーから記事を探す