在控制台中尝试使用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类型,需要以度数表示,而不是米。
答案 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))