Як дістати відстань і опори між точкою та найближчою частиною багатокутника?


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) 

Як я можу опрацювати несучі функції та відстань?

Відповіді:


4

Ви можете використовувати ST_Azimuth для обчислення підшипника, але він приймає лише параметри геометрії точок як параметри, тож ви повинні вирішити, який підшипник ви дійсно хочете.

Ви можете вибрати найкоротшу лінію, як запропонував @Nicklas (це відстань, яку ви вже обчислили), що має сенс, якщо вам потрібен найшвидший "напрямок", щоб дістатися до полігону. Щодо іншого, я пропоную вам порахувати його по центру багатокутника (ST_Centroid), що має дати кращі результати для довільних фігур.


2

Використовуйте

ST_Azimuth (ST_Shortestline (geom1, geom2))

редагувати

Я щойно зрозумів, що ST_Azimuth не сприймає рядковий рядок як argumetn, тому вам потрібно буде надати йому два бали.

Якщо одна з геометрій є точкою, ви можете використовувати це безпосередньо та використовувати ST_ClosestPoint, щоб отримати точку на полігоні.


1

ST_Azimuth - це потрібна вам функція. Він повертає кут в радіанах за годинниковою стрілкою з півночі. Як ST_Azimuth()показує зразок на сторінці, просто загортаючи його у degrees()функції, ви отримаєте кут у градусах, якщо це те, що вам потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.