Как найти кратчайшее расстояние от точки до многоугольника? - PullRequest
0 голосов
/ 15 октября 2018

Собственно вопрос в названии.

Есть таблица (osm_buildings), в которой расположены адреса зданий и их полигонов.И есть точка, и вам нужно найти ближайшие полигоны к этой точке.

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

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Вы можете использовать ST_DISTANCE между точкой и многоугольником, он вернет кратчайшее расстояние.

SELECT ST_Distance(
        'SRID=4326;POINT(-70 42)'::geometry,
        'SRID=4326;POLYGON((-72 42, -73 42, -73 43, -72 43, -72 42))'::geometry
    );

--> 2
0 голосов
/ 15 октября 2018

Если вы хотите вернуть результат только на одно очко одновременно, тогда ответ Лоренца Альбе идеален.Но если вы хотите вернуть результаты для более чем одной точки одновременно, я предполагаю, что вы сохранили здания в некотором поле типа геометрии / географии, а не в виде текста.

select t2.*, a.*
  from target t2,
  lateral (select o.*
             from osm_buildings o, target t
            where t2.id=t.id
            order by st_distance(o.geom::geography, t.geom::geography) limit 1) a

Также, если ваш набор данных большой и вы принимаетечто из некоторых точек теперь есть близкий полигон в некотором допустимом диапазоне (например, 1 км), вы можете добавить st_dwithin (o.geom, t.geom, your_max_distance) в предложения where в боковом подзапросе.Если вы хотите вернуть более одного «ближайшего полигона», просто увеличьте лимит.

0 голосов
/ 15 октября 2018

Оператор расстояния <-> хорошо работает между точками и полигонами.

Вы можете сделать запрос следующим образом:

SELECT b.*
FROM osm_buildings AS b
ORDER BY b.polygon <-> 'POINT(3.14 2.78)'::geometry
LIMIT 10;

Это позволит получить 10 зданий, ближайших к этой точке.

Этот запрос может использовать индекс для столбца polygon.

...