2011-03-14 55 views
10

首先,我使用Rails3和Ruby 1.9.2。使用PostGIS的Rails

我在使用PostgreSQL和PostGIS時遇到了問題。我已經試過兩種寶石:

的問題是,從nofxx效果很好,但它不提供耙的任務,第一個使得PostGIS的.sql和spatial_ref_sys.sql被插入到數據庫中。我需要這個,因爲它使用測試是很舒適和必不可少的(自動創建數據庫,插入postgis sql並在運行「rake test」時執行遷移)。奇怪的是,在github的README中,作者寫了一些關於PostGIS助手和耙子任務的東西。但他們沒有實現(或我是盲人)。

上面列出的第二個gem完美地爲rake提供了這個功能!但是我遇到了一個我無法解決的問題。我跟着自述文件的說明,但每次當我嘗試設置空間列的位置,我得到下面的輸出:

ruby-1.9.2-p136 :010 > v = Venue.new :location => "POINT(102.0, 47.2)" 
=> #<Venue id: nil, last_updated: nil, created_at: nil, updated_at: nil, location: nil> 
ruby-1.9.2-p136 :011 > v.location 
=> nil 

正如你所看到的,我將使用WKT位置(衆所周知的文本),但它總是零。我也嘗試將它保存到數據庫,但它也是零。 我想通了,當我嘗試使用由RGeo

RGeo::Geos.factory.point(-122, 47) 

它說提供的對象,該工廠是零。所以,創建RGeo提供的工廠肯定會有問題。作爲ActiveRecord的-PostGIS的適配器的自述文件中提到我用下面一行在我的場館模型來提供這種支持:

self.rgeo_factory_generator = RGeo::Geos.factory_generator 

,但它不工作。

所以要找到解決方案,有兩種方法:找到一種方法將rake任務放入nofxx的georuby gem中,或者用activerecord-postgis-adapter的工廠解決問題。

希望有人能幫助我, thx!

回答

12

最後我自己解決了它。我正在玩耙子任務,並且遇到了一些問題(比如,您無法通過腳本提供psql的密碼......)使我惱火。 但我發現,你可以提供一個模板選項到database.yml文件。所以,我只是寫道:

development: 
    adapter: postgresql 
    pool: 5 
    encoding: unicode 
    database: myDatabase 
    username: root 
    password: ***** 
    su_username: root 
    su_password: ***** 
    port: 5432 
    template: template_postgis 

test: 
    adapter: postgresql 
    pool: 5 
    encoding: unicode 
    database: myDatabase_test 
    username: root 
    password: ***** 
    su_username: root 
    su_password: ***** 
    port: 5432 
    template: template_postgis 

production: 
    adapter: postgresql 
    pool: 5 
    encoding: unicode 
    database: myDatabase_production 
    username: root 
    password: ***** 
    su_username: root 
    su_password: ***** 
    port: 5432 
    template: template_postgis 

現在每次我創建我的數據庫(在測試等過程中)所有的PostGIS的東西被添加!是啊!

+4

您可以向數據庫添加一個「script_dir」變量,該變量將執行兩個必需的sql腳本以使用postgis。在activerecord-postgis-adapter中搜索「script_dir」。我使用它,它效果很好。不需要模板。 – jevy 2011-09-03 14:07:29

12

我花了大約4小時解決與「activerecord-postgis-adapter」相同的問題。答案很簡單:「永遠不要用戶在WKT上」。在你的情況下,它必須是v = Venue.new :location => "POINT(102.0 47.2)"然後,一切正常!