使用activerecord-postgis-adapter将Point类型保存为postgres

时间:2014-12-06 10:23:49

标签: ruby-on-rails-4 gis postgis

我正在尝试将地理位置保存到postgis启用的postgres表。该表如下所示:

address:string
longlat: point

rails应用程序正在使用activerecord-postgis-adapter。当我尝试做的时候:

l = Location.new
l.longlat = 'POINT(28.72292 77.123434)'
l.address = "My Address"
l.save

Activerecord正在抛出错误

ActiveRecord :: StatementInvalid:PG :: InvalidTextRepresentation:ERROR:类型点的输入语法无效:" 0020000001000010e6403774bc6a7ef9db405347ef9db22d0e

似乎activerecord-postgis-adapter在保存之前将点类型内部转换为字符串,但不应该是这种情况。我对错误的任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:4)

除非您使用sql语句,否则WKT格式不能直接用于更新几何体。

最简单的方法是使用Rgeo(可能需要明确包含gem):

l = Location.new
# POINT(28.72292 77.123434)
l.longlat = RGeo::Cartesian.factory(:srid => 4326).point(28.72292, 77.123434)
l.address = "My Address"
l.save

或者,如果您收到WKT格式,并且不想解析它,您可以执行类似

的操作
l = Location.new
l.longlat = RGeo::Cartesian.factory(:srid => 4326).parse_wkt('POINT(28.72292 77.123434)')
l.address = "My Address"
l.save

如果您不想使用rgeo,可以直接使用数据库:

l = Location.new
l.address = "My Address"
l.save

Location.connection.execute("update locations set longlat=St_GeomFromText('POINT(28.72292 77.123434)', 4326) where id=#{l.id}")

但这需要两个查询。

注意:我假设你的srid都是4326(wgs84),如果你需要另一个坐标系,你应该改变它。