在 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))
正在为启用 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))