我正在尝试将地理位置保存到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在保存之前将点类型内部转换为字符串,但不应该是这种情况。我对错误的任何帮助表示赞赏。
答案 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),如果你需要另一个坐标系,你应该改变它。