Postgis + Postgresql:如果集合A中的任何点位于任何点形式集合B的r邻域中

时间:2018-05-15 08:24:01

标签: sql postgresql postgis

我有一个使用Linestring的表来记录用户的轨迹:

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

我的问题是:给定一组B点,如何选择B点附近的所有用户(比距离B更近的用户到B中的任何一点)

如果在Linestring"中有任何一点,我试过googled" postgis但一无所获。我能想到的方法是创建一个这样的新表(在第一个表中拆分行,用户一直到一行的一行),然后在单点上使用函数:

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

有更好的方法吗?

2 个答案:

答案 0 :(得分: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)');

enter image description here

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

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)

答案 1 :(得分:0)

您可以使用ST_DWITHIN查找兴趣点附近的线条。让我们注意,这一点不必靠近行顶点。

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

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