Postgis + Postgresql: если любая точка из множества A находится в r-окрестности любого точечного множества B - PullRequest
0 голосов
/ 15 мая 2018

У меня есть таблица, использующая Linestring для записи траектории пользователей:

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

У меня вопрос: учитывая набор точек B, как выбрать всех пользователей, которые были рядом с точками в B. (Пользователи, которые были ближе, чем n метров к любой точке в B)

Я пробовал гуглить "postgis, если есть точка в Linestring", но ничего не нашел. Я могу думать о том, чтобы создать новую таблицу, подобную этой (разделить строку в первой таблице, одну строку на одну точку, в которой был пользователь), а затем использовать функции в одной точке:

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

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы можете использовать ST_DWITHIN, чтобы найти линии рядом с достопримечательностью.Отметим, что эта точка не обязательно должна находиться рядом с вершиной линии.

В зависимости от используемой вами проекции вы можете привести к географии, чтобы использовать метры.

SELECT 
    id, 
    st_dwithin(trajectory,
          ST_GeogFromText('SRID=4326;POINT(-70 45)'),
          1000) as nearMyPoint
FROM users;
0 голосов
/ 15 мая 2018

Я бы сказал, что 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

... вы можете сбросить очки с помощью ST_DumpPointsв CTE и используйте его в своем запросе для проверки расстояния, используя ST_Distance (или используйте любую другую функцию).В приведенном ниже запросе я использую GEOGRAPHY только для получения расстояния в метрах до 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)
...