2017-03-15 27 views
2

我想創建一個基本的應用程序使用activerecord-postgis適配器寶石,並按照自述文件中的說明。使用activerecord-postgis適配器和點不被投爲球形

根據自述,一個點應該使用球形工廠,但我得到一個CAPIPointImpl類型,而不是SphericalPointImpl的一個點。這意味着距離計算不起作用。

這裏就是我想:

record = MySpatialTable.create 
record.lonlat = 'POINT(-122 47)' 
record.lonlat 
returns #<RGeo::Geos::CAPIPointImpl:0x3ff57d7645c8 "POINT (-122.0 47.0)"> 

我使用的紅寶石2.3.1,軌5,9.6 Postgres的PostGIS的和2.3

這是我的架構:

create_table "my_spatial_tables", force: :cascade do |t| 
    t.geography "lonlat",  limit: {:srid=>4326, :type=>"point", :geographic=>true} 

    t.index ["lonlat"], name: "index_my_spatial_tables_on_lonlat", using: :gist 
    end 

我的初始化:

RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config| 
    config.default = RGeo::Geos.factory_generator 
    config.register(RGeo::Geographic.spherical_factory(srid: 4326), geo_type: "point") 
end 

和我的數據庫配置:

default: &default 
    adapter: postgis 
    encoding: unicode 
    schema_search_path: public, postgis 
    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } % 

回答

1

看起來像是activerecord-postgis-adapter中的一個錯誤。唯一的解決辦法,我發現 - 設置球形出廠默認工廠初始化:

RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config| 
    config.default = RGeo::Geographic.spherical_factory(srid: 4326) 
    config.register(RGeo::Geographic.spherical_factory(srid: 4326), geo_type: "point") 
end 

這對我的作品。

1

我解決它通過明確創建一個球形的工廠,並從它創建點 - 所以

geofactory = RGeo::Geographic.spherical_factory(srid: 4326) 
MySpatialTable.lonlat = geofactory.point(user.longitude, user.latitude) 

它似乎像有一個bug,無論是在ActiveRecord的-PostGIS的適配器寶石或rgeo-積極記錄寶石。儘管如此,我仍然無法找出錯誤。 SpatialFactoryStore看起來像它被正確設置,但它沒有被使用。