Я использую 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)