在rails查询中调用postgis ST_DWithin

时间:2015-12-25 13:46:44

标签: postgis postgresql-9.3 ruby-on-rails-4.2

在控制台中尝试使用postgis启用的rails4.2应用程序。

@target = Target.last
@meter_radius = 1000
@valid_points = Target.where("ST_DWithin(#{@target.lat}, #{@target.lon},  #{@meter_radius}))

lat和lon定义为十进制值。这转换为以下查询

SELECT "targets".* FROM "targets"  WHERE (ST_DWithin(38.656679, 15.984094, 1000))

错误: PG::UndefinedFunction: ERROR: function st_dwithin(numeric, numeric, integer) does not exist

我认为我需要声明这些值的数据类型(几何或地理),但不确定如何。我也想知道ST_DWithin函数是否可以用于3857数据类型,即使文档没有说明这一点。

note @target对象还有一个lonlat属性在postgresql中定义为空间值:srid => 3857,:type =>" point&# 34;定义

更新

@valid_points = Target.where("ST_DWithin(lonlat, ST_PointFromText('#{@target.lonlat}',  #{@meter_radius}))

返回结果,因此在语法上有效。

SELECT "targets".* FROM "targets"  WHERE (ST_DWithin(lonlat, ST_PointFromText('POINT (15.984094 38.656679)', 3857), 1000))

但结果不正确。它基本上找到了表的所有要点。属于SRID类型,需要以度数表示,而不是米。

1 个答案:

答案 0 :(得分:0)

一个答案,利用存储的lonlat空间点:

@target = Target.last
@degree_radius = 0.2249
@valid_points = Target.where("ST_DWithin(lonlat, ST_PointFromText('#{@target.lonlat}',  #{@degree_radius}))

返回结果,因此在语法上有效。

SELECT "targets".* FROM "targets"  WHERE (ST_DWithin(lonlat, ST_PointFromText('POINT (15.984094 38.656679)', 3857), 0.2249))