位置情報を扱うためのSpatial Adapter for Rails

RailsでMySQLのgeometry型などを扱うためのちょいメモ。

Spatial Adapter for Railsを使うとマイグレーションとかでgeometry型を扱えるようになる。
geometry型とか絡むところは生のSQL書いてますよという場合でも、schema.rbにテーブル定義がちゃんと出力されるようになるので、それだけでも便利。

PostgreSQLでも使えるらしいです。

インストール

GeoRubyに依存しているのでまずGeoRubyを入れる。
READMEではgeorubyになっているが、これは情報が古いようだ。

sudo gem install GeoRuby

そのあとプラグインを入れる

ruby script/plugin install git://github.com/fragility/spatial_adapter.git

マイグレーション

マイグレーションは以下のように。

create_table :facilities, :options=>'ENGINE=MyISAM' do |t|
  t.string :name, :null => false, :limit => 50
  t.string :kana, :limit => 50
  t.column :latlng, :geometry, :null => false
end

add_index :facilities, :latlng, :spatial => true 

なつかしのt.columnを使わなくてはならないのは仕様っぽいです。
型は:geometryでも:pointでも。

インデックスを張るときは「:spatial => true」をつける。

なおMySQLのバージョンが5.0.16以下の場合はMyISAMにしないとダメ。
それより後のバージョンではInnoDBでも問題ない。

データの取得とか

作成

 Facility.create(:name => 'なめ', :kana => 'かな', :latlng => Point.from_x_y(43.194, 140.351))

取得

f = Facility.find_by_latlng([[43, 140], [42, 141]])
fs = Facility.find_all_by_latlng([[43, 140], [42, 141]])

参照

f.latlng.x #=> 43.194
f.latlng.y #=> 140.351

ほかREADME参照。

前の記事

Rails 2.3.5リリースされてた

次の記事

デブサミ2010 19日 感想