2

Addressモデルに RGeo 属性がある場合の典型的なスキーマがあります。

t.st_point :coordinates,   geographic: true, srid: 4326

そして通常、それはRGeo::Geographic::SphericalPointImplクラスにラップされています

Realty.last.address.coordinates
#<RGeo::Geographic::SphericalPointImpl:0x2b1a364b429c "POINT (106.5 10.5)">

ただし、場合によっては、完全に不適切なデカルト ラッパーでラップされます。RGeo::Cartesian::PointImpl

Realty.joins(:address).select('realties.id, addresses.coordinates::geometry').first.coordinates
#<RGeo::Cartesian::PointImpl:0x2b1a364a691c "POINT (106.0 10.0)">

最新のものを使用'activerecord-postgis-adapter 3.1.4'していますrails 4.2.4

多分誰かがこれを修正する方法を知っていcoordinatesますRGeo::Geographic::SphericalPointImpl

4

1 に答える 1

2

で列を選択するとaddresses.coordinates::geometry、Postgres にジオメトリ タイプの列が返されます。を実行するとRealty.last.address.coordinates、別の SQL タイプ (ポイント) が返されます。

::geometrySQL クエリからを削除します。

https://github.com/rgeo/rgeo-activerecord#spatial-factories-for-columnsのドキュメントから:

activerecord-postgis-adapterSpatialFactoryStoreルックアップ型へのレジストリとしてクラスを使用して、SQL 型を ruby​​ 型に変換します。

SpatialFactoryStoreシングルトン クラスに空間ファクトリを登録します。ActiveRecord モデルの各空間型は、 を使用してSpatialFactoryStore、その型のプロパティに一致するファクトリを取得します。たとえば、ポイント タイプ、特定の SRID に一致するタイプ、Z 座標を持つタイプ、または属性の任意の組み合わせに対して、異なる空間ファクトリを設定できます。

空間タイプを登録するときにサポートされるキーは、デフォルト値とその他の許可された値とともにここにリストされています。

geo_type: "geometry", # point, polygon, line_string, geometry_collection, 
                      # multi_line_string, multi_point, multi_polygon
has_m:    false,      # true
has_z:    false,      # true
sql_type: "geometry", # geography
srid:     0,          # (any valid SRID)

デフォルトのファクトリはRGeo::Geographic.spherical_factory、地理的タイプとRGeo::Cartesian.preferred_factory幾何学的タイプ用です。

設定例を次に示します。

RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config|
  # By default, use the GEOS implementation for spatial columns.
  config.default = RGeo::Geos.factory_generator

  # But use a geographic implementation for point columns.
  config.register(RGeo::Geographic.spherical_factory(srid: 4326), geo_type: "point")
end
于 2016-03-10T18:19:19.833 に答える