首页 > 解决方案 > 在postgis中按中心点、半径、内角和方位角绘制扇区

问题描述

我正在使用 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)

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

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

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

在此处输入图像描述

标签: postgresqlgispostgisbing-mapsbing-api

解决方案


您可以使用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.range2,所以它足够大,可以切割整个扇区,我使用 50 作为第三个st_buffer()参数,所以你的扇区足够平滑。

您的示例数据呈现为某些内容,例如:

在此处输入图像描述


推荐阅读