在 rails 查询中调用 postgis ST_DWithin

Calling postgis ST_DWithin in a rails query

正在为启用 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 数据类型,即使文档没有说明。

注意 @target 对象也有一个 lonlat 属性,在 postgresql 中定义为空间值:srid=>3857, :type=>"point"定义。

更新

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

returns 结果,因此在句法上有效。

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

然而结果不正确。它基本上找到了 table 的所有点。由于是SRID类型,需要用度表示,不能用米表示。

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

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

哪个 returns 结果在句法上是有效的。

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