Нарисуйте сектор по центру, радиусу, внутреннему углу и азимуту в postgis - PullRequest
0 голосов
/ 24 января 2019

Я создаю свое приложение javascript, используя API Карт Bing, и я хотел бы создать геометрию секторов из центральных точек и параметров секторов.

У меня есть таблица 'points' в базе данных PostgreSQL с PostGIS вверху, и она содержит геометрию точек:

id  st_astext(geom)
1   POINT(4.331 50.869)
2   POINT(4.323 50.832)
3   POINT(4.373 50.853)
4   POINT(4.356 50.837)

и другая таблица 'segemnts', где каждая запись имеет следующие атрибуты: азимут (в градусах), ширина луча (в градусах), диапазон (в метрах) и centerid, который в основном является внешним ключом для таблицы «точек»:

centerid    azimuth beamwidth   range
1           210     60          750
2           135     30          500
3           80      60          600
4           165     90          750

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

1 Ответ

0 голосов
/ 24 января 2019

Вы можете использовать st_buffer(), чтобы получить круг заданного радиуса вокруг ваших точек, чем построить треугольник с внутренним углом, равным вашей ширине луча, используя st_project(), чем вы можете пересечь их, чтобы получить геометрию сектора, например:

create view sectors as 
select s1.*, st_intersection(st_buffer(p1.geom::geography, s1.range, 50)::geometry, st_makepolygon(st_makeline(array[p1.geom, st_project(p1.geom::geography, s1.range*2, radians(s1.azimuth-s1.beam/2))::geometry, st_project(p1.geom::geography, s1.range*2, radians(s1.azimuth+s1.beam/2))::geometry, p1.geom]))) as geom
from sector s1
left join points p1
on p1.id=s1.centerid

Обратите внимание , я использовал приведение типов между geography и geometry для соответствия ожидаемым параметрам функции, также я умножил s1.range на два, так что он достаточно большой, чтобывырезать весь сектор, и я использовал 50 в качестве третьего st_buffer() параметра, чтобы ваш сектор был достаточно плавным.

Ваши данные выборки будут выглядеть примерно так:

enter image description here

...