Rails / PostGIS / RGeo Ошибка: NoMethodError: неопределенный метод `factory 'для RGeo :: GeoJSON :: Feature - PullRequest
0 голосов
/ 28 мая 2018

Я использую Ruby on Rails и PostGIS для хранения картографических данных GeoJSON в модели под названием «Карта».Когда я сохраняю объект, успешно загруженный с помощью простой функции GeoJSON, я получаю сообщение об ошибке «NoMethodError: неопределенный метод` factory 'for # ».

См. Ниже примеры, настройки, то, что я пробовал, и ссылкик ресурсам.

Пример 1 (с использованием консоли Rails)

irb(main):007:0> feature = '{ "type": "Feature", "properties": {  "name": "Coors Field",  "amenity": "Baseball Stadium",  "popupContent": "This is where the Rockies play!" }, "geometry": {  "type": "Point",  "coordinates": [-104.99404, 39.75621] }}'
=> "{ \"type\": \"Feature\", \"properties\": {  \"name\": \"Coors Field\",  \"amenity\": \"Baseball Stadium\",  \"popupContent\": \"This is where the Rockies play!\" }, \"geometry\": {  \"type\": \"Point\",  \"coordinates\": [-104.99404, 39.75621] }}"

irb(main):008:0> geom_feature = RGeo::GeoJSON.decode(feature)
=> #<RGeo::GeoJSON::Feature:0x304e48c id=nil geom="POINT (-104.99404 39.75621)">

irb(main):009:0> Map.create(name: 'demo', geometry: geom_feature)
   (0.9ms)  BEGIN
   (0.6ms)  ROLLBACK
NoMethodError: undefined method `factory' for #<RGeo::GeoJSON::Feature:0x000000000609c918>
  from (irb):9

Настройка

  • Rails 5.1.4
  • PostGIS 9.6
  • Docker DB src: карта / postgis: 9.6-2.4
  • Docker web src: ruby ​​2.3.5

Файлы

config / initializers / rgeo.rb

RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config| 
  config.default = RGeo::Geographic.spherical_factory(srid: 4326) 
end

Gemfile

# Mapping
gem 'activerecord-postgis-adapter'
gem 'rgeo'
gem 'rgeo-geojson'
# need this? found on random post - willing to try anything
gem 'rgeo-activerecord'

db / migrate / 20182039293939_create_maps.rb

create_table :maps do |t|
  t.string :name
  t.st_polygon :polygon
  t.geometry :geometry
  t.multi_polygon :multi_polygon
  t.references :mappable, polymorphic: true, index: true

  t.timestamps
end

Источники

Среди прочих, через которые я прошелследующие источники без везения:

оригинальный пост Даниэля Азумы о настройке с 2011 года

пост StackOverflow, в котором рассказывается, почему часть этого устарела 2015-06-26

  • Обратите внимание на комментарий под принятым ответом, в котором разъясняется, как установить сферическую фабрику по умолчанию для каждоговещь - это хорошо для меня и то, что я сделал выше.

Ответ на вопрос Github, который не выглядит актуальным, учитывая, что это уже одна функция

Более свежий и активный ответ Github activerecord-postgis-adapter, который затрагивает все точки выше

Предполагает, что, несмотря на то, что Geos не используется, установка требует борьбы с 2015

  • Я все еще не могу воспользоваться этой опцией, несмотря на то, что она не выглядит уместной
  • Пробовал и не имел никакого эффекта (см. Ниже)

Попытки

Я также пытался установить Geos, но это не имело значения.

В контейнере:

apt install libgeos-dev
gem uninstall rgeo && gem install rgeo

В консоли Rails: (после перезапуска)

irb(main):001:0> RGeo::Geos.supported?
=> true

Попыткаи результат такой же, как указано выше (пример 1)

1 Ответ

0 голосов
/ 08 ноября 2018

Вам необходимо использовать геометрию объекта (вызвать Feature # geometry):

json = '{ "type": "Feature", "properties": { "name": "Coors Field",  "amenity": "Baseball Stadium", "popupContent": "This is where the Rockies play!" }, "geometry": { "type": "Point",  "coordinates": [-104.99404, 39.75621] }}'

feature = RGeo::GeoJSON.decode(json)

Map.create(name: 'demo', geometry: feature.geometry)
...