Postgresql 接近多重约束的rgeo点

Postgresql 接近多重约束的rgeo点,postgresql,postgis,rgeo,Postgresql,Postgis,Rgeo,有一个几何列wkb_geometry,srid 4326是一个多行,我想确定这些记录中的哪些记录在几何对象点的预定距离(比如5000m)内 而以下方法允许确定多边形是否包含点 def self.containing_latlon(lat,lon, polygon) ewkb = EWKB.generate(RGeo::Geographic.simple_mercator_factory.point(lon, lat).projection) where("ST_Intersec

有一个几何列
wkb_geometry
,srid 4326是一个
多行
,我想确定这些记录中的哪些记录在几何对象
点的预定距离(比如5000m)内

而以下方法允许确定多边形是否包含点

def self.containing_latlon(lat,lon, polygon)
  ewkb = EWKB.generate(RGeo::Geographic.simple_mercator_factory.point(lon, lat).projection)
  where("ST_Intersects(polygon, ST_GeomFromEWKB(E'\\\\x#{ewkb}'))")
end
ST_Intersects
显然不是一个选项,因为它适用于“空间的任何部分,然后它们相交”。
我还没有找到确定直线是否在点的X距离内的文档。但问题可能反过来了?问题不应该是由多重线和缓冲区定义的多边形内的点

要执行此操作,需要如何修改上述方法?

请改用

对于使用仪表的距离,将参数转换为地理位置,例如5km:

SELECT * FROM t
WHERE ST_DWithin('POINT(7.00 51.82)'::geography,geom::geography,5000);
如果您对SRS的测量单位感到满意,只需坚持“几何”

SELECT * FROM t
WHERE ST_DWithin('POINT(7.00 51.82)'::geometry,geom,42);
WKT文本后面的
::
是用于转换数据类型的postgres语法。但是,正如在研究生中的惯例,有很多方法可以做同样的事情。下面的示例使用不同的技术将WKT文字强制转换为
几何体

SELECT 
  CAST('SRID=4326;POINT(1 2)' AS geometry),
  'SRID=4326;POINT(1 2)'::geometry,
  ST_GeomFromText('SRID=4326;POINT(1 2)'),
  ST_SetSRID(ST_MakePoint(1,2),4326);

-[ RECORD 1 ]---+---------------------------------------------------
geometry        | 0101000020E6100000000000000000F03F0000000000000040
geometry        | 0101000020E6100000000000000000F03F0000000000000040
st_geomfromtext | 0101000020E6100000000000000000F03F0000000000000040
st_setsrid      | 0101000020E6100000000000000000F03F0000000000000040

进一步阅读:

它是
ST\u DWithin
而不是
ST\u in
。考虑到条件,我已经抛弃了后者,但不知道前者。。。考虑到大写字母的使用,这需要更多的注意破译!我还可以问一下双冒号的语法吗?因为我在postgis.net/docs中还没有见过它。@Jerome
是postgres的语法。它是
CAST(值作为数据类型)
的缩写形式。我会在答覆中加上几个例子。ST_DWithin在您的用例中起作用了吗?我相信它会起作用(找到了它的文档-鞋子合脚);我正在制定一个工作计划,而这个元素是唯一的漏洞。我会在这些步骤实施后尽快尝试。是的,这很有效。需要对属性语法进行一些欺骗:
where(“ST#u DWITHIN('#{class.attribute.as_text}'::geography,wkb_geometry::geography,5000)”。全部