ここの誰かが助けてくれることを願っている、本当に奇妙なバグがあります。Rails postgis データベースにシェープ ファイルをインポートしました。次の列が含まれます。
- 探す
- ソース
- 検索2
- 重複
- ジオム
geom 列には、RGeo MultiPolygon 座標が含まれています。
奇妙なことに、私のローカル Rails アプリケーションはすべてのレコード geom フィールドを問題なく読み取ることができますが、本番サーバーには geom フィールドに nil を持つレコードがいくつかあります。
どちらのアプリケーションも git にまったく同じコードがあり、まったく同じデータベースを参照しています。
2 つのアプリの唯一の違いは、本番環境が Ubuntu 12.04 で実行されているのに対し、私のローカルは OSX で実行されていることです。
問題の診断に役立つコード スニペットを次に示します。
config/database.yml
development:
adapter: postgis
encoding: unicode
database: coflood_production
host: opensource1
port: 5432
pool: 5
username: xxxxxxx (hidden)
password: xxxxxxx (hidden)
app/models/gazetteer.rb
class Gazetteer < ActiveRecord::Base
self.table_name = 'gazetteer'
self.primary_key = 'gid'
attr_accessible :geom, :search, :search2, :source
end
Gemfile
source 'https://rubygems.org'
gem 'rails', '3.2.13'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'pg', '0.17.1'
gem 'activerecord-postgis-adapter', '0.6.5'
gem 'devise', '3.2.2'
gem 'rgeo-geojson', '0.2.3'
gem 'js-routes', '0.9.6'
gem 'annotate', '2.5.0'
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', :platforms => :ruby
gem 'uglifier', '>= 1.0.3'
gem "therubyracer", '0.12.0'
gem "less-rails", '2.4.2' #Sprockets (what Rails 3.1 uses for its asset pipeline) supports LESS
gem "twitter-bootstrap-rails", '2.2.8'
end
gem 'jquery-rails', '3.0.4'
他に役立つものが思いつく場合は、お知らせください。できるだけ早く提供します。
更新 1
そのため、両方のシステムに postgresql と postgis をインストールした方法に違いがあります。OSX (ローカル) では、必要なすべてのコンポーネントを含む opengeo ソフトウェア スイートをインストールしました。Ubuntu (本番) では、apt-get を使用して postgresql-9.3 をインストールしました。
ここのコメントのおかげで、本番サーバーに geos や gdal などをいくつかインストールしていないことに気付きました。両方をインストールしましたが、残念ながらまだ同じエラーが発生します。
更新 2
そこで、実稼働サーバーをローカル マシンと同じ環境に近づけて、問題が解決するかどうかを確認することにしました。postgres/postgis/geos の適切なインストールを削除し、Ubuntu opengeo ソフトウェア スイートをインストールしました。これは、ローカルマシンで使用しているものです。
残念ながら、これで問題は解決しませんでした。
その後、別のバージョンの Ruby を使用していることに気付きました。そこで、同じバージョン (ruby 2.0.0p247) を使用するように実稼働サーバーを更新しました。
それでもエラーは解決しませんでした。
私はまだこのバグに完全に当惑しています。これは、Rails、rgeo、または activerecord-postgis-adapter gem と関係があるようです。
アップデート 3
そのため、両方のシステムでジオメトリを作成するレコードに違いがあることに気付きました。データベースの最初のレコードを調べたところ、どちらも geom フィールドにジオメトリがありましたが、プラットフォーム間で Rgeo タイプが異なっていました。
ローカル サーバー (OSX)
RGeo::Geos::CAPIMultiPolygonImpl:0x3fc7af864fdc "マルチポリゴン ..."
本番サーバー (Ubuntu 12.04)
RGeo::Geographic::SphericalMultiPolygonImpl:0x1b07a4c "マルチポリゴン ..."
RGeo::Geographic オブジェクトを RGeo::Geos 座標に変換するのに失敗しているようです。