Geo                 Ruby  (           Rails)      @tetsutan (    )
about:me• @tetsutan•• 83          82
http://gihyo.jp/news/report/01/rubykaigi2011/0001
Today’s Recipe• RGeo• Rails/ActiveRecordSpatialAdapter• Rails/GeoHash• Rails/Mongoid
RGeo• http://virtuoso.rubyforge.org/rgeo/• gem install rgeo• RGeo is a geospatial data library for Ruby.• “At its core is ...
OpenGIS• http://www.opengeospatial.org/• The Open Geospatial Consortium, Inc.• GIS •   GIS   Geographic Information System
GeoRuby• http://georuby.rubyforge.org/• “The data model roughly follows the OGC  Simple Features for SQL specification”• “T...
EWKT, EWKB,         HexEWKB• EWKT/EWKB • Extended Well-Known Text/Binary   •   Point(35.739406 139.653755)   •   x00000000...
Create WKB w MySQL
MySQL/PostgreSQL•• PostgreSQL                  PostGIS  MySQL                            GIS• MySQL           Doc •   http...
• RGeo ‣ Ruby   GIS• MySQL ‣ WKT/WKB
Today’s Recipe• RGeo• Rails/ActiveRecordSpatialAdapter• Rails/GeoHash• Rails/Mongoid
Spatial Adapter• gem search --remote spatial • spatial_adapter (1.2.0) • activerecord-spatialite-adapter (0.3.3) • activer...
Spatial Adapter• gem search --remote spatial • spatial_adapter (1.2.0) • activerecord-spatialite-adapter (0.3.3) • activer...
spatial_adapter•• GeoRuby•
Spatial Adapter• gem search --remote spatial • spatial_adapter (1.2.0) • activerecord-spatialite-adapter (0.3.3) • activer...
MySQL
Gemfilegem "activerecord-mysql2spatial-adapter"
Migratecreate_table :locations do |t| t.string :name, :null => false, :limit => 255 t.point :geom, :null => false t.timest...
Controllerfactory = RGeo::Cartesian.factory@location.geom = factory.point(3,4)
“130.0, 30.0”                   Point(130.0 30.0)                  RGeo                              SpatialAdapterINSERT ...
SpatialAdapter
SpatialAdapter•   ActiveRecord•   Mysql•   OGC    •    •              Point    •   z
Today’s Recipe• RGeo• Rails/ActiveRecordSpatialAdapter• Rails/GeoHash• Rails/Mongoid
GeoHash• http://geohash.org/• “It is a hierarchical spatial data structure which  subdivides space into buckets of grid sh...
(@masuidrive)  http://blog.masuidrive.jp/index.php/2010/01/13/geohash/
GeoHash• AABBCCDDEE ∈ AABBCCDD• also AABBCCDDFF ∈ AABBCCDD               AABBCCDDEE                        AABBCCDDFF     ...
• ”GAE   DataStore                                Geohash             ”                 http://blog.masuidrive.jp/index.ph...
GeoHash•   String   OK
Today’s Recipe• RGeo• Rails/ActiveRecordSpatialAdapter• Rails/GeoHash• Rails/Mongoid
Mongodb••       indexing••• etc
Geospatial Indexing!!
Geospatial Indexing• mongoDB 1.3.3 or later•         { loc : [ 50 , 30 ] }         { loc : { x : 50 , y : 30 } }         {...
OR• MongoMapper• Mongoid
Mongoid• http://mongoid.org/• MongoMapper•          id:babie        “        Rails3             Mongoid             ”     ...
• Document
• Spatial Index• devise
• Spatial Index  -   Mongoid  -   MM• devise  -   Mongoid  -   MM
Model
Controller
Conclusion• 4sq              GeoHash MongoDB•    MongoDB• Mongoid/MongoMapper        Mongoid
activerecord-mysql2spatial-adapter      (0.3.2)
activerecord-mysql2spatial-          adapter (0.3.2)fixture geometry
17     https://gist.github.com/1093641
•   RGeo    •  http://virtuoso.rubyforge.org/rgeo/•   OpenGIS    •  http://www.opengeospatial.org•   GeoHash    •  http://...
rubykaigi2011_spatial.key
rubykaigi2011_spatial.key
rubykaigi2011_spatial.key
rubykaigi2011_spatial.key
rubykaigi2011_spatial.key
rubykaigi2011_spatial.key
rubykaigi2011_spatial.key
Upcoming SlideShare
Loading in...5
×

rubykaigi2011_spatial.key

1,234

Published on

Ruby会議2011内の!Rubykaigiでの発表資料

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,234
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Rubyで位置情報のデータを扱う場合に着いて話をします\n
  • 前職はKoozytという会社でARのプラットフォーム開発やってましたが、もともと位置情報好きでKoozytへ入社しました。\n4月末に会社をやめてから3ヶ月ほどニートしています。\n自分でも位置情報系のサービスを作っているんですが、\n位置情報系のサービスを位置情報関連の美味しいお仕事あればご連絡ください\nプレゼンソフトもってなかったので昨日keynote買いました\nなので文字ばっかのプレゼンなので眠いと思います\n\n\n
  • とか闇の方から聞こえてきた気がきがしますが気ににしません\n
  • 今日のプレゼンではこのあたりの話をします\n今作っているサービスのバックエンドの変遷\nでもあります。\n先に結論を話すと、この順番に試して結局Mongoにたどり着きました。\n練習したら20分とかかかったので、頭3つは少し飛ばし気味に話していきます\n
  • coreはOGCで標準化されたsimple features の仕様に基づいて実装されている\n
  • KMLとかもここで決めてます\n
  • RGeoの一世代前のライブラリはこれです。\nこいつはまたあとで顔を出してきます。使わないですが\n
  • ちなみにこのlat/lonは練馬文化センターの位置情報です\nWKTはPoint(x y)の間がスペースなので気をつけてください。\n
  • ポスグレは知りませんが似たようなことはできると思います。\nMySQLの話がでたのでつぎはMysqlについて\n
  • さっき見てもらったとおり\n\nたぶんsqliteでもデータ突っ込むだけなら単純に配列なのでOK(indexがはれないとかあるかも。重要なのはspatial index)\n
  • となるとORマッパーが欲しいですね\n
  • \n
  • Spatial ってのは空間っていう意味です\n
  • \n
  • \n
  • 新しいのはこいつら。\n名前でわかると思いますが、\nsqlite, mysql, mysql2, postgresql\nのアダプタです。\n
  • \n
  • \n
  • このへんはspatialadapterのおかげです\n
  • GeorubyのときはPoint.newとかできたんですが、RGeoになってからファクトリーをつくらなくてはならなくなりました\n
  • \n
  • \n
  • 一応出来るんですが、複雑な計算式をSQLでかかないといけない\n
  • OGC準拠ってのは利点があってDB側でいろんな操作が可能\n
  • \n
  • 階層構造で、グリッドに分割される\n
  • \n
  • \n
  • ということなのでGAEを使うか、自前で前方一致が早い検索エンジンを使うとかしないとSQLでLike文使うとかになっちゃいます。Solrとかならできると思います\n\nGeoHashのruby用ライブラリも増井さんが作成してくれています\n
  • なので、頭から2文字づつとか保存しれやればインデックスも効くし、ひとつの方法としてはありかなと思っています。\n
  • やっと本題です\n
  • \n
  • まずはMongodbについて、このあたりはさらっと流します\n詳しくはdoryokujinさんのブログで\n\nほんといいことずくめのDBです。KVSとは違うって行ってるんですが、まあ考え方は一緒です。\n
  • \n
  • \n
  • \n
  • 最近のmongodbだったら問題ないです\n\n1.3.3 Releasedってのが2010/3/2にメールが流れているのでここ1年くらいに導入したなら対応しています\n\nこのあたりはMysqlがspatial indexのサポートをしているのと同じ\n\nこの例の場合、placesテーブルにlocカラムがあって、それが2D Index => Geospatial Indexとなる\n
  • 僕はMongoidを使いました\n
  • \n
  • \n
  • deviseはメールアドレスなどでログインするフォームなどを簡単に作成してくれるライブラリ。\n位置情報とは関係ないですが、このプラグインがあるのを前提に他を作ってしまってました。\nこれも詳しくはbabieさんのブログ参照\n
  • \n
  • \n
  • 最終的に\n\nこのindexのつけ方もドキュメントにあります。\n
  • こんな感じでfinderとか使えます。\narelと同じ感じでメソッドチェーンできます。\n特にnearの部分が位置情報には大事\ngeomには0にlat、1にlonが入ってます\n
  • \n
  • \n
  • 残念ながら使わなくなったんですが、こいつのパッチを書きました\n何が問題かというと\n
  • これ、多分、だれもコレ使ってテストしてないってことだと思うんですが、どうなんでしょうかね?\n
  • しかも完全じゃない\nwktだけの対応です。\nでもコレ見つけるのかなり苦労しました。\nActiveRecordの中とか読みました\n
  • \n
  • \n
  • rubykaigi2011_spatial.key

    1. 1. Geo Ruby ( Rails) @tetsutan ( )
    2. 2. about:me• @tetsutan•• 83 82
    3. 3. http://gihyo.jp/news/report/01/rubykaigi2011/0001
    4. 4. Today’s Recipe• RGeo• Rails/ActiveRecordSpatialAdapter• Rails/GeoHash• Rails/Mongoid
    5. 5. RGeo• http://virtuoso.rubyforge.org/rgeo/• gem install rgeo• RGeo is a geospatial data library for Ruby.• “At its core is an implementation of the industry standard OGC Simple Features Specification,”
    6. 6. OpenGIS• http://www.opengeospatial.org/• The Open Geospatial Consortium, Inc.• GIS • GIS Geographic Information System
    7. 7. GeoRuby• http://georuby.rubyforge.org/• “The data model roughly follows the OGC Simple Features for SQL specification”• “The library inputs and outputs EWKB, HexEWKB and EWKT.”
    8. 8. EWKT, EWKB, HexEWKB• EWKT/EWKB • Extended Well-Known Text/Binary • Point(35.739406 139.653755) • x000000000101000000AC3B16DBA4DE414016139B8FEB746140• HexEWKB • EWKB with Hex • “000000000101000000AC3B16DBA4DE414016139B8FEB746140”
    9. 9. Create WKB w MySQL
    10. 10. MySQL/PostgreSQL•• PostgreSQL PostGIS MySQL GIS• MySQL Doc • http://dev.mysql.com/doc/refman/5.1/ja/spatial-extensions.html
    11. 11. • RGeo ‣ Ruby GIS• MySQL ‣ WKT/WKB
    12. 12. Today’s Recipe• RGeo• Rails/ActiveRecordSpatialAdapter• Rails/GeoHash• Rails/Mongoid
    13. 13. Spatial Adapter• gem search --remote spatial • spatial_adapter (1.2.0) • activerecord-spatialite-adapter (0.3.3) • activerecord-mysqlspatial-adapter (0.3.2) • activerecord-mysql2spatial-adapter (0.3.2)• postgres • activerecord-postgis-adapter (0.3.5)
    14. 14. Spatial Adapter• gem search --remote spatial • spatial_adapter (1.2.0) • activerecord-spatialite-adapter (0.3.3) • activerecord-mysqlspatial-adapter (0.3.2) • activerecord-mysql2spatial-adapter (0.3.2)• postgres • activerecord-postgis-adapter (0.3.5)
    15. 15. spatial_adapter•• GeoRuby•
    16. 16. Spatial Adapter• gem search --remote spatial • spatial_adapter (1.2.0) • activerecord-spatialite-adapter (0.3.3) • activerecord-mysqlspatial-adapter (0.3.2) • activerecord-mysql2spatial-adapter (0.3.2)• postgres • activerecord-postgis-adapter (0.3.5)
    17. 17. MySQL
    18. 18. Gemfilegem "activerecord-mysql2spatial-adapter"
    19. 19. Migratecreate_table :locations do |t| t.string :name, :null => false, :limit => 255 t.point :geom, :null => false t.timestampsend
    20. 20. Controllerfactory = RGeo::Cartesian.factory@location.geom = factory.point(3,4)
    21. 21. “130.0, 30.0” Point(130.0 30.0) RGeo SpatialAdapterINSERT INTO LOC (geom) values( Point(130.0 30.0) ); MySQL
    22. 22. SpatialAdapter
    23. 23. SpatialAdapter• ActiveRecord• Mysql• OGC • • Point • z
    24. 24. Today’s Recipe• RGeo• Rails/ActiveRecordSpatialAdapter• Rails/GeoHash• Rails/Mongoid
    25. 25. GeoHash• http://geohash.org/• “It is a hierarchical spatial data structure which subdivides space into buckets of grid shape”
    26. 26. (@masuidrive) http://blog.masuidrive.jp/index.php/2010/01/13/geohash/
    27. 27. GeoHash• AABBCCDDEE ∈ AABBCCDD• also AABBCCDDFF ∈ AABBCCDD AABBCCDDEE AABBCCDDFF AABBCCDD
    28. 28. • ”GAE DataStore Geohash ” http://blog.masuidrive.jp/index.php/2010/01/13/geohash/
    29. 29. GeoHash• String OK
    30. 30. Today’s Recipe• RGeo• Rails/ActiveRecordSpatialAdapter• Rails/GeoHash• Rails/Mongoid
    31. 31. Mongodb•• indexing••• etc
    32. 32. Geospatial Indexing!!
    33. 33. Geospatial Indexing• mongoDB 1.3.3 or later• { loc : [ 50 , 30 ] } { loc : { x : 50 , y : 30 } } { loc : { foo : 50 , y : 30 } } { loc : { long : 40.739037, lat: 73.992964 } }• db.places.ensureIndex( { loc : "2d" } )
    34. 34. OR• MongoMapper• Mongoid
    35. 35. Mongoid• http://mongoid.org/• MongoMapper• id:babie “ Rails3 Mongoid ” http://d.hatena.ne.jp/babie/20100809/1281316971
    36. 36. • Document
    37. 37. • Spatial Index• devise
    38. 38. • Spatial Index - Mongoid - MM• devise - Mongoid - MM
    39. 39. Model
    40. 40. Controller
    41. 41. Conclusion• 4sq GeoHash MongoDB• MongoDB• Mongoid/MongoMapper Mongoid
    42. 42. activerecord-mysql2spatial-adapter (0.3.2)
    43. 43. activerecord-mysql2spatial- adapter (0.3.2)fixture geometry
    44. 44. 17 https://gist.github.com/1093641
    45. 45. • RGeo • http://virtuoso.rubyforge.org/rgeo/• OpenGIS • http://www.opengeospatial.org• GeoHash • http://geohash.org/ • masuidrive http://blog.masuidrive.jp/index.php/2010/01/13/geohash/• Mongoid • http://mongoid.org • babie http://d.hatena.ne.jp/babie/20100809/1281316971• my gist • https://gist.github.com/1093641

    ×