postgresql - 在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
如何在我的数据库中获取表格或视图以选择以以上点为中心点、范围为半径、波束宽度为内角、方位角为方向的圆段?
解决方案
您可以使用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
2,所以它足够大,可以切割整个扇区,我使用 50 作为第三个st_buffer()
参数,所以你的扇区足够平滑。
您的示例数据呈现为某些内容,例如:
推荐阅读
- python - 如何从 Python 中的特定字母输出字符串的其余部分?
- c++ - 在 C++ 中的非托管可执行文件中运行托管可执行文件
- python - Alembic env.py 不读取 Flask 项目中的环境变量
- r - 导出为 pdf 时,ggsave 会更改图形
- dotnetnuke - Timelinejs, 2sxc 更改字体和语言
- reactjs - 与 GCP HTTP 端点反应
- kubernetes - 如何在 WSL 中访问 Kubernetes 集群节点
- angularjs - 使用 ng-repeat 和 $index 设置模型属性
- caching - 在 Snowflake 虚拟仓库的工作节点中如何处理缓存一致性?
- mysql - 使用 mysql 命令从一个 docker 容器到另一个