位置情報を扱うための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参照。