ST_Distance между несколькими точками - PullRequest
1 голос
/ 10 января 2020

У меня есть две таблицы, public.street_lights и public.roads.

В обеих колонках есть столбец wkb_geometry (тип geometry).

Это мой запрос:

SELECT 
    ST_Distance(ST_Transform((SELECT wkb_geometry 
                              FROM public.street_lights 
                              WHERE ogc_fid = 1), 2855),
    ST_Transform((SELECT wkb_geometry 
                  FROM public.roads 
                  WHERE ogc_fid = 1), 2855))

Возвращает расстояние между дорогой (id = 1) и светом (id = 1).

Мой вопрос: как я могу изменить свой запрос, чтобы проверить расстояние между светом (id = 1) и каждая дорога?

Второй вопрос: как мне изменить запрос, чтобы добавить новый столбец в public.street_lights, где будет road_id с минимальным расстоянием. Другими словами: мне нужно найти для каждого источника света - road_id из roads, где расстояние минимально.

1 Ответ

0 голосов
/ 10 января 2020

Я считаю, что вам нужно избавиться от подзапросов и просто поместить таблицы в предложение WHERE. Если я вас правильно понял, вы хотели получить единственное значение с ближайшей дорогой к данному свету, поэтому все, что вам нужно, это вычислить расстояние до всех возможных дорог, ORDER BY результат и получить первое значение, например:

Пример данных

CREATE TABLE public.street_lights (ogc_fid INT, wkb_geometry GEOMETRY);
CREATE TABLE public.roads (ogc_fid INT, wkb_geometry GEOMETRY);

INSERT INTO street_lights VALUES (1,'SRID=4326;POINT(1 2)');
INSERT INTO roads VALUES (1,'SRID=4326;POINT(1 2.50)'),
                         (2,'SRID=4326;POINT(1 2.42)');

Запрос

SELECT roa.ogc_fid, ST_Distance(ST_Transform(lig.wkb_geometry, 2855),
                                ST_Transform(roa.wkb_geometry, 2855)) AS distance
FROM public.street_lights lig, public.roads roa
WHERE lig.ogc_fid = 1
ORDER BY distance LIMIT 1;

 ogc_fid |     distance     
---------+------------------
       2 | 61533.2214579388
(1 Zeile)

Вопрос 2:

как мне изменить запрос для добавления нового столбца в publi c .street_lights где будет road_id с минимальным расстоянием.

Вы можете создать новый столбец с помощью оператора ALTER TABLE, например,

ALTER TABLE public.street_lights ADD COLUMN road_id_min_dist INT;

И заполнить этот новый столбец road_id вы можете использовать тот же запрос в CTE:

WITH j AS (
  SELECT lig.ogc_fid AS light_id, roa.ogc_fid AS road_id, 
    ST_Distance(ST_Transform(lig.wkb_geometry, 2855),
                ST_Transform(roa.wkb_geometry, 2855)) AS distance
  FROM public.street_lights lig, public.roads roa
  ORDER BY distance LIMIT 1)
UPDATE public.street_lights SET road_id_min_dist = j.road_id
FROM j WHERE j.light_id = ogc_fid;

А вот ваши данные ..

SELECT ogc_fid,ST_AsText(wkb_geometry), road_id_min_dist 
FROM street_lights;

 ogc_fid | st_astext  | road_id_min_dist 
---------+------------+------------------
       1 | POINT(1 2) |                2
(1 Zeile)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...