繁体   English   中英

将ActiveRecord列转换为PostGIS Point

[英]Convert an ActiveRecord column to PostGIS Point

我的设置:

  • Ruby 2.0.0
  • 导轨3.2.12
  • 最新的pg宝石
  • 最新的activerecord-postgis-adapter宝石
  • 最新的rgeo-geojson gem
  • PostgreSQL 9.1.6
  • PostGIS 2

我几天前也问过类似的问题。 需要将布尔值从Postgres(== String)转换为Ruby Boolean )。 在那里,我必须将值从自定义选择转换为布尔值。 通过将其添加到我的模型中,这非常简单:

def value_name
  ActiveRecord::ConnectionAdapters::Column.value_to_boolean(self[:value_name])
end

但是现在我收到一个Point类型的值(这是PostGIS的类型)。 它在数据库中的字符串表示形式类似于"0101000000EE7C3F355EF24F4019390B7BDA011940" ,但它必须成为(我认为) RGeo::Feature::PointRGeo::Geos::CAPIPointImpl

现在,我查看了ActiveRecord::ConnectionAdapters::Columnhttp://rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column ),我只能找到value_to_booleanvalue_to_decimal

然后,我意识到也有ActiveRecord::ConnectionAdapters::PostgreSQLColumnhttp://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)。

我找到了一个解决方案(搜索rgeoparse ):

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM