【问题标题】:Postgis+Postgresql:If any point from set A is in the r-neighborhood of any point form set BPostgis+Postgresql:如果集合 A 中的任意点在任意点形式集合 B 的 r-neighborhood 中
【发布时间】:2018-05-15 08:24:00
【问题描述】:

我有一张表,使用 Linestring 记录用户的轨迹:

CREATE TABLE users
(
  id serial DISTINCT,
  trajectory Geometry(LINESTRING)
);

我的问题是:给定一组 B 点,如何选择所有靠近 B 点的用户。(距离 B 中任意点超过 n 米的用户)

我尝试用谷歌搜索“postgis if Linestring 中的任何点”,但什么也没找到。我能想到的方法是创建一个像这样的新表(拆分第一个表中的行,一行代表用户去过的一个点),然后在单点上使用函数:

CREATE TABLE users
(
  user_id serial,
  have_been_to_point Geometry(POINT)
);

有没有更好的方法来做到这一点?

【问题讨论】:

  • 能否再添加一些示例数据?

标签: sql postgresql postgis


【解决方案1】:

我认为CTE 就足够了。基于此LINESTRING ..

INSERT INTO users (trajectory) VALUES 
('LINESTRING(7.44 51.50,6.96 51.42,6.94 50.97,7.42 50.75)');

...您可以在 CTE 中使用 ST_DumpPoints 转储点,并在查询中使用它来检查使用 ST_Distance 的距离(或使用任何其他功能)。在下面的查询中,我使用GEOGRAPHY 只是为了将distance in meters 转换为POINT(7.02 50.92) - 这接近轨迹的第三个节点:

WITH j AS (
  SELECT id,(ST_DumpPoints(trajectory)).geom 
  FROM users)
SELECT j.id, ST_Distance(j.geom::GEOGRAPHY,
             ST_GeographyFromText('POINT(7.02 50.92)')) 
FROM j;


 id |  st_distance   
----+----------------
  1 |  70887.3073306
  1 | 55783.82586626
  1 |  7908.96974024
  1 |  33936.3582915
(4 Zeilen)

【讨论】:

    【解决方案2】:

    您可以使用ST_DWITHIN 查找兴趣点附近的线条。请注意,此点不必靠近线顶点。

    根据您使用的投影,您可能希望投射到地理以使用米。

    SELECT 
        id, 
        st_dwithin(trajectory,
              ST_GeogFromText('SRID=4326;POINT(-70 45)'),
              1000) as nearMyPoint
    FROM users;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多