使用activerecord-postgis-adapter和point不会被转换为球形

时间:2017-03-15 18:07:04

标签: postgresql activerecord rubygems postgis rgeo

我正在尝试使用activerecord-postgis-adapter gem创建一个基本应用程序,并遵循自述文件中的说明。

根据自述文件,一个点应该使用球形工厂,但我得到一个CAPIPointImpl类型而不是一个点的SphericalPointImpl。这意味着距离计算不起作用。

以下是我的尝试:

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

我使用的是ruby 2.3.1,rails 5,postgres 9.6和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 } %

2 个答案:

答案 0 :(得分: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 :(得分:1)

我通过明确创建一个球形工厂并从中创建点来解决它 - 所以

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

似乎有一个bug,无论是在activerecord-postgis-adapter gem还是rgeo-activerecord gem中。我无法想象这个错误。 SpatialFactoryStore看起来像是设置正确,但它没有被使用。