我有一个使用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)
);
有更好的方法吗?
答案 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)');
...您可以在CTE中使用ST_DumpPoints
转储点,并在查询中使用它来使用ST_Distance
检查距离(或使用任何其他功能)。在下面的查询中,我使用GEOGRAPHY
只是为了获得distance in meters到POINT(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;