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
設定
- レール 5.1.4
- PostGIS 9.6
- Docker DB ソース: kartoza/postgis:9.6-2.4
- Docker Web ソース: ルビー 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'
デシベル/移行/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 年のセットアップに関する Daniel Azuma の元の投稿
その一部が廃止された理由について語る StackOverflow の投稿 2015-06-26
- すべてのデフォルトの球状ファクトリを設定する方法を明確にする、受け入れられた回答の下のコメントに注意してください-これは私にとっては問題なく、上記で行ったことです。
これがすでに単一の機能であることを考えると、関連性がないように思われる Github の問題の応答
上記のすべてのポイントにヒットした、より最近のアクティブな Github activerecord-postgis-adaptor 応答
Geos を使用していないにもかかわらず、インストールには 2015 と取り組む必要があることを示唆しています
- 関連性がないように見えるにもかかわらず、私はまだこのオプションをいじっています
- 試してみましたが効果がありませんでした(以下を参照)
試み
Geos もインストールしてみましたが、違いはありませんでした。
コンテナ内:
apt install libgeos-dev
gem uninstall rgeo && gem install rgeo
Rails コンソール: (再起動後)
irb(main):001:0> RGeo::Geos.supported?
=> true
上記と同じ試みと結果(例1)