Найти два полигона, ближайших друг к другу postgis - PullRequest
0 голосов
/ 23 ноября 2018

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

Building_name | Building_ID | Geom
A             | 1           | *polygon object
B             | 2           | *polygon object
C             | 3           | *polygon object

Как определить, какие 2 здания находятся ближе всего друг к другу, используя прямолинейное расстояние?

Вывод должен быть, например: A и B - здания, расположенные ближе всего друг к другу.

Возможно ли это для полигонов?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Для образца коллекции геометрии

enter image description here

Следование SQL будет выполнено немного быстрее, чем st_distance, для большого числа геометрий, поскольку в нем используютсяиндекс ближайшего соседа.Кроме того, вы можете рассматривать «true» в качестве третьего параметра st_distance, чтобы получить сферическое расстояние, если по какой-то причине решите его использовать.

select x1.name, x2.name
from (values (1,'A',st_geomfromtext('Polygon ((325 708, 348 768, 424 758, 481 653, 421 589, 340 628, 325 708))')),
(2,'B',st_geomfromtext('Polygon ((643 891, 692 808, 769 825, 793 885, 786 923, 730 939, 705 902, 643 891))')),
(3,'C',st_geomfromtext('Polygon ((692 620, 669 553, 767 523, 882 548, 893 622, 834 683, 692 620))')),
(4,'D',st_geomfromtext('Polygon ((519 703, 549 676, 586 707, 585 751, 555 778, 526 745, 519 703))'))) x1(id,name,geom)
join (values (1,'A',st_geomfromtext('Polygon ((325 708, 348 768, 424 758, 481 653, 421 589, 340 628, 325 708))')),
(2,'B',st_geomfromtext('Polygon ((643 891, 692 808, 769 825, 793 885, 786 923, 730 939, 705 902, 643 891))')),
(3,'C',st_geomfromtext('Polygon ((692 620, 669 553, 767 523, 882 548, 893 622, 834 683, 692 620))')),
(4,'D',st_geomfromtext('Polygon ((519 703, 549 676, 586 707, 585 751, 555 778, 526 745, 519 703))'))) x2(id,name,geom)
on x1.id<>x2.id
order by x1.geom<->x2.geom
limit 1
0 голосов
/ 24 ноября 2018
SELECT
    a."Building_name" "Building name A",
    b."Building_name" "Building name B",
    ST_Distance(a."Geom", b."Geom") distance
FROM
    polygons a, polygons b
WHERE
    a."Building_ID" <> b."Building_ID"
    -- optionally add a ST_DWithin condition to improve performance:
    -- AND ST_DWithin(a."Geom", b."Geom", 1000)    
ORDER BY
    distance
LIMIT 1;

ST_Distance вычисляет расстояние самой короткой линии (в единицах SRID), тогда как ST_ShortestLine возвращает фактическую геометрию самой короткой линии.

...