Минимальное расстояние PostGIS для двух наборов, включая другие переменные из обеих таблиц - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть две таблицы (table1 и table2) с тремя столбцами: id, value и geometry.Геометрии являются точечными объектами.

Я хочу сделать соединение между обеими таблицами, где результирующая таблица содержит для каждой точки таблицы table1, минимальное расстояние до точки table2, значение table1 и значениесоответствующая точка таблицы 2.

Я попробовал следующий код, но, по логике, это дает для каждой точки таблицы1 расстояние до каждой точки таблицы2.Однако я не могу оставить v2 из группы по предложению.Как я могу получить желаемый стол?

SELECT t1.value AS v1,
    t2.value AS v2,
    MIN(st_distance(t1.eometry, t2.geometry)) AS dis                        
   FROM table1 t1, table2 t2
GROUP BY v1, v2

1 Ответ

0 голосов
/ 18 декабря 2018

Для простоты я просто взял целочисленные значения и их различия вместо расстояния между точками (но оно должно быть точно таким же: просто измените вычитание на функцию st_distance):

demo: db <> fiddle

SELECT DISTINCT ON (v1.point) 
     v1.point, 
     v2.point, 
     abs(v1.point - v2.point) 
FROM
table1 v1
CROSS JOIN table2 v2
ORDER BY v1.point, abs(v1.point - v2.point)

Мои таблицы:

table1.point: 1, 2, 4, 8, 16
table2.point: 2, 3, 5, 7, 11, 13

Результат:

| point | point | abs |
|-------|-------|-----|
|     1 |     2 |   1 |
|     2 |     2 |   0 |
|     4 |     3 |   1 |
|     8 |     7 |   1 |
|    16 |    13 |   3 |

Объяснение:

Вы должны вычислить все различия, чтобы узнать, какая из них наименьшая.Это причина для CROSS JOIN.Теперь вы можете ORDER BY точки таблицы1 и различия (или расстояния).Обратите внимание на функцию abs(): она делает все отрицательные значения положительными.В противном случае будет взята разница -42 вместо +1.

DISTINCT ON (v1.point) принимает первую упорядоченную строку для каждой точки v1.point.

Примечание:

Из-за CROSS JOIN и тяжелой математики в st_distance это может быть очень медленным для огромных наборов данных!

...