Как определить расстояние и расстояние между точкой и ближайшей частью многоугольника?

9

Я довольно новичок в написании SQL и использовании PostGIS, поэтому прошу прощения, если это кажется немного простым или очевидным. У меня есть таблица полигональных объектов, хранящихся в базе данных postGIS, и мне нужно написать SQL-запрос, чтобы выбрать все атрибуты, расстояние и направление полигональных объектов на определенном расстоянии от предварительно определенной точки. Мне удалось выбрать объекты и рассчитать расстояние (используя ST_Distance), но я не могу понять, как получить направление.

Это сценарий, который я использую до сих пор:

SELECT *,
  ST_Distance (Geometry, ST_GeomFromText ('POINT(292596 90785)', 27700))
FROM mytable
WHERE
  ST_DWithin(
    Geometry,
    ST_GeomFromText('POINT(292596 90785)', 27700),
    250) 

Как я могу рассчитать как характеристики, так и расстояние?

JamesC
источник

Ответы:

4

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

Вы можете выбрать самую короткую линию, как предложила @Nicklas (это та, с расстоянием, которое вы уже рассчитали), что имеет смысл, если вам нужно самое быстрое «направление» для достижения многоугольника. Для чего-то еще, я предлагаю вам рассчитать его по центру многоугольника (ST_Centroid), что должно дать лучшие результаты для произвольных форм.

lynxlynxlynx
источник
2

использование

ST_Azimuth (ST_Shortestline (geom1, geom2))

редактировать

Я только что понял, что ST_Azimuth не принимает линейную строку в качестве аргумента, поэтому вам нужно вместо этого дать ей два балла.

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

Никлас Авен
источник
1

ST_Azimuth - это функция, которую вы хотите. Возвращает угол в радианах по часовой стрелке с севера. Как ST_Azimuth()показывает пример на странице, простое включение в degrees()функцию даст вам угол в градусах, если это то, что вам нужно.

MerseyViking
источник