geocoder + Sinatra (+ ActiveRecord) で位置情報を使ってみる

Sinatra, ActiveRecord, SQliteなどは設定済みの条件です。
インストールされてなければこちらなどを参考にインストールしてみてください。

SinatraとActiveRecord,SQLite,Haml等を使ってWebアプリの雛形を作ってみた

参考

Google Map APIキーの取得

Google Maps API ウェブ向け Maps JavaScript API
このページ中下ほどの「キーの取得」からAPIキーを取得しておく。

インストール

Gemfileに追加し、インストール


$ emacs Gemfile

+ gem 'geocoder'

$ bundle install --path vendor/bundle

DB

config/database.ymlの設定


development:
  adapter: sqlite3
  database: db/location.db

Migrationファイルの作成


$ bundle exec rake db:create_migration NAME=create_location VERSION=001
$ emacs db/migrate/001_create_location.rb

class CreateLocation < ActiveRecord::Migration[5.0]
  def change
    create_table :locations do |t|
+     t.text :address
+     t.float :latitude
+     t.float :longitude
    end
  end
end

DBに反映


$ bundle exec rake db:migrate

データベースに登録部分はまだ作ってないので、DB Browser for SQLiteなどで手動登録をしました。

Sinatraファイルに記述

geoapp.rb

Sinatraファイルはgeoapp.rbという名前にしました。

モデルに以下を記入する。


  class Location < ActiveRecord::Base
+   geocoded_by :address
+   after_validation :geocode, if: :address_changed?
  end

Sinatraのルート( geoapp.rb )はこんな感じになってます。


require 'bundler'
Bundler.require

module MyHandling
  class App < Sinatra::Base

    [モデル定義は省略]

    configure :development do
      register Sinatra::Reloader

      config = YAML.load_file('config/database.yml')
      ActiveRecord::Base.establish_connection config['development']
    end
    
    get '/' do
      @listing = Location.find(1)

      erb :index
    end

  end
end

ちなみにconfig.ruの設定は


require './geoapp.rb'
run MyHandling::App

Viewの設定

ここは
Google Maps API ウェブ向け Maps JavaScript API (JSのサンプル)
をマルマル参考にしています。


$ emacs views/layout.erb



  
    
    
    Geocoding
    
  
  

      <%= yield %>
      
  


$emacs views/index.erb

アプリの起動


$ bundle exec rackup -p 8088

こんなエラーが出ました。

bundler: failed to load command: rackup (/Users/toshi/Documents/Work/Ruby/geocoder/vendor/bundle/ruby/2.3.0/bin/rackup)
NoMethodError: undefined method `geocoded_by' for #
  /Users/toshi/Documents/Work/Ruby/geocoder/vendor/bundle/ruby/2.3.0/gems/activerecord-5.0.2/lib/active_record/dynamic_matchers.rb:21:in `method_missing'

geocoded_byというメソッドがないと言ってるようです。
こんな時はextend Geocoder::Model::ActiveRecordをモデルに追加してあげれば良いみたいです。
Problems implementing ruby geocoder using Sinatra


  class Location < ActiveRecord::Base
+   extend Geocoder::Model::ActiveRecord
    
    geocoded_by :address
    after_validation :geocode, if: :address_changed?
  end

再度起動してブラウザでlocalhost:8088にアクセスしたら、表示されるようになりました。

今後の課題として

geocodingのキモは、住所<=>緯度経度の結びつきだと思うのですが、肝心なところがまだなので対応していきたいです。

鹿児島県の出水市という所に住んでいまして、インターネット周辺で色々活動して行きたいと思ってるところです。 Webサイト作ったり、サーバ設定したり、プログラムしたりしている、釣りと木工好きなMacユーザです。 今はデータサイエンスに興味を持って競馬AI予想を頑張ってます。

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください