[英]Trouble adding st_point column with activerecord-postgis-adapter
[英]Convert an ActiveRecord column to PostGIS Point
我的设置:
pg
宝石 activerecord-postgis-adapter
宝石 rgeo-geojson
gem 我几天前也问过类似的问题。 ( 需要将布尔值从Postgres(== String)转换为Ruby Boolean )。 在那里,我必须将值从自定义选择转换为布尔值。 通过将其添加到我的模型中,这非常简单:
def value_name
ActiveRecord::ConnectionAdapters::Column.value_to_boolean(self[:value_name])
end
但是现在我收到一个Point
类型的值(这是PostGIS的类型)。 它在数据库中的字符串表示形式类似于"0101000000EE7C3F355EF24F4019390B7BDA011940"
,但它必须成为(我认为) RGeo::Feature::Point
或RGeo::Geos::CAPIPointImpl
现在,我查看了ActiveRecord::ConnectionAdapters::Column
( http://rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column ),我只能找到value_to_boolean
和value_to_decimal
。
然后,我意识到也有ActiveRecord::ConnectionAdapters::PostgreSQLColumn
( http://rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/PostgreSQLColumn ),但是它似乎没有任何有用的方法。
谢谢!
试试这样的事情:
def value_name
point_regex = /POINT \(([0-9]*\.[0-9]*) ([0-9]*\.[0-9]*)\)/
match_data = self[:value_name].match(point_regex)
match_data[1], match_data[2]
end
它将返回代表您的点的几个值[x,y]。 您必须进行逆运算,即定义一个value_name =(x,y)。
我找到了一个解决方案(搜索rgeo
和parse
):
def my_value
a = RGeo::WKRep::WKBParser.new
a.parse(self[:my_value])
end
我只需要知道这是正确的方法。 来自Java世界,我这样阅读:
my_value
:创建my_value
的新实例 在这种情况下:如何创建它的一个实例,并在每次调用该方法时重用它?
或更详细地说:自动解析器如何处理呢? 它在哪里叫?
我认为它是在这里创建的: https : //github.com/dazuma/activerecord-postgis-adapter/blob/master/lib/active_record/connection_adapters/postgis_adapter/spatial_column.rb (179和181行)
但是如何在我的模型中重用呢?
背景信息:解析器自动适用于真实表列,但在查询中创建了我的列。
找到正确的方法:
def my_value
RGeo::Geos.factory.parse_wkb(self[:my_value])
end
:)
是的,postgis适配器确实可以工作,并且提供了更为优雅的解决方案。
在我的Gemfile中:
gem 'rails', '3.2.12'
gem 'pg'
gem 'rgeo-activerecord'
gem 'activerecord-postgis-adapter'
然后在模型中:
class MyPoint < ActiveRecord::Base
set_rgeo_factory_for_column(:geom, RGeo::Geos.factory(srid: 4326))
attr_accessible :geom
end
查找您的RGeo安装中是否支持Geos:
>> RGeo::Geos::supported?
true
这就是您所得到的-模型的属性geom,在本例中为RGeo::Geos::CAPIPointImpl
(根据工厂类的不同而不同)。 要使该工厂正常工作,您需要在安装RGeo之前安装带有开发文件的Geos。 不必是Geos工厂和4326,RGeo拥有使用纯Ruby实现的工厂,可以在文档中找到最匹配的工厂类和SRID: http ://rubydoc.info/github/dazuma/rgeo/master/index
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.