При использовании activerecord-postgis-adapter точка не является сферической

Я пытаюсь создать базовое приложение, используя гем activerecord-postgis-adapter, и следую инструкциям в файле readme.

Согласно readme, точка должна использовать сферическую фабрику, но я получаю тип 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, рельсы 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 ответа

Я решил это путем явного создания сферической фабрики и создания точки из нее - так

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

Похоже, что есть ошибка, либо в геме activerecord-postgis-adapter, либо в геме rgeo-activerecord. Я не мог понять ошибку, хотя SpatialFactoryStore выглядел так, как будто был правильно настроен, но просто не использовался.

Похоже, это ошибка в 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

Это работает для меня.

Другие вопросы по тегам