在postgis中按中心点、半径、内角和方位角绘制扇形

use*_*529 5 gis postgresql postgis bing-maps bing-api

我正在使用 Bing Maps API 构建一个 javascript 应用程序,我想根据中心点和扇区参数构建扇区几何形状。

我在 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)
Run Code Online (Sandbox Code Playgroud)

我有另一个表“segemnts”,其中每个条目都有以下属性:方位角(以度为单位)、波束宽度(以度为单位)、范围(以米为单位)和centerid,它基本上是“点”表的外键:

centerid    azimuth beamwidth   range
1           210     60          750
2           135     30          500
3           80      60          600
4           165     90          750
Run Code Online (Sandbox Code Playgroud)

如何获取数据库中的表格或视图来选择以以上点为中心点、范围为半径、波束宽度为内角、方位角为方向的圆段?

在此输入图像描述

小智 5

您可以使用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
Run Code Online (Sandbox Code Playgroud)

请注意geography,我在和之间使用了类型转换geometry来匹配预期的函数参数,并且我还乘以了s1.range两倍,因此它足够大以切割整个扇区,并且我使用 50 作为第三个st_buffer()参数,因此您的扇区足够平滑。

您的示例数据呈现为某种形式,例如:

在此输入图像描述