【问题标题】:rgeo point near MULTILINESTRINGMULTILINESTRING 附近的 rgeo 点
【发布时间】:2021-07-31 16:06:37
【问题描述】:

有一个几何列wkb_geometry,srid 4326 是MULTILINESTRING 我想确定这些记录中的哪些在几何对象POINT 的预定距离内(比如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 距离内。但问题可能反过来了?如果问题不是由 MULTILINESTRING 和缓冲区定义的多边形内的点。

上面的方法需要如何修改才能执行?

【问题讨论】:

    标签: postgresql postgis rgeo


    【解决方案1】:

    请改用ST_DWithin

    对于使用米的距离,将参数转换为geography,例如5公里:

    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 语法。但是按照 postgres 的惯例,有很多方法可以做同样的事情。以下示例使用不同的技术将 WKT 文字转换为 geometry

    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
    

    延伸阅读:Getting all Buildings in range of 5 miles from specified coordinates

    【讨论】:

    • 它是 ST_DWithin 而不是 ST_Within。鉴于条件,我已经抛弃了后者,但不知道前者……鉴于使用了大写字母,这需要更多的注意力来破译!我还可以问一下双冒号的语法,因为我在 postgis.net/docs 中还没有遇到过它吗?
    • @Jerome :: 是一种 postgres 语法。它是CAST(value AS datatype) 的缩写形式。我将在我的回答中添加一些示例。 ST_DWithin 在您的用例中有效吗?
    • 我相信它会(找到它的文档 - 鞋子合脚);我正在制定一个工作计划,而这个元素是唯一的漏洞。随着步骤的实施,我会尽快尝试。
    • 是的,这行得通。需要对属性语法进行一些修改:where("ST_DWITHIN('#{class.attribute.as_text}'::geography,wkb_geometry::geography,5000)").all
    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多