Вы можете использовать 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()
параметра, чтобы ваш сектор был достаточно плавным.
Ваши данные выборки будут выглядеть примерно так: