基于最小通视高度的通视性算法

基于最小通视高度的通视性算法

论文原文:基于最小通视高度的改进通视性算法-贾开吉

在已知观察点和观察点所在区域的地形下,计算观察点可视的地形表面集合。该算法不仅可以计算区域地形表面的通视情况,还能快速精确计算非地面目标的可视情况。
本文通过C++实现该算法,在采样点选择上做了点修改,增加并行计算,加快计算速度。

算法原理

遍历计算区域的轮廓,以轮廓点和观察点连线,从观察点开始以固定距离采样,计算采样点的最小可视高度并赋值给其周围的网格点。
最小可视高度定义:相对于观察点,目标点的最小可视高度。

算法流程

  1. 做区域在平面上的投影,对区域边界取外接矩形,从观察点的投影点到外界矩形上的所有网格点做连线;
  2. 在所有连线上均匀采样,采样点不是网格点的利用插值法求得该点的高程数据(牺牲精度的情况下可以直接对采样点坐标取整),最终对每一条连线生成一个剖面图;
  3. 从观察点开始,对每一个采样点利用最大斜率方法,计算该采样点的最小通视高度,将采样点的最小通视高度赋值给邻近网格点;
  4. 输入目标高度与对应网格点最小通视高度作比较,若目标高度大于最小通视高度,该目标可视,反之,不可视。
    在这里插入图片描述

算法实现

最大斜率法
从观察点依次向剖面图上的采样点做连线,计算采样点的斜率Kj​​,同时记录该剖面图上最大斜率Kmax​,和最大斜率的点n,比较Kj​和Kmax​的大小,当Kj​大于Kmax​时,j点可视,并设置Kmax​= Kj​,n= j,反之,不可视。当j点不可视时,利用j和n的比例计算该点的最小可视高度H(i,j)min,即H(i,j)min​=(j/ n)∗H(i,n)min​。
在这里插入图片描述

最邻近点近似法
对每一个网格点 ( X i , Y j ) (X_i,Y_j) (Xi,Yj),增加变量Δ d d d H ( x i , y i ) m i n H{(x_i,y_i)_{min}} H(xi,yi)min Δ d Δd Δd为距离网格点最近的采样点与该网格点的距离, H ( x i , y i ) m i n H{(x_i,y_i)_{min}} H(xi,yi)min为网格点当前的最小通视高度。当求得采样点 ( a i , b j ) (a_i,b_j) (ai,bj)的最小通视高度后,计算采样点与邻近网格点之间的距离 t d td td,并与网格点对应的Δ d d d进行比较,若 t d td td小于Δ d d d,则将 t d td td赋值给Δ d d d,并且将该采样点的最小通视高度 H ( a i , b i ) m i n H{(a_i,b_i)_{min}} H(ai,bi)min赋值给该网格点的最小通视高度 H ( x i , y i ) m i n H{(x_i,y_i)_{min}} H(xi,yi)min;反之,不操作。
在这里插入图片描述
快速近似法
在最大斜率法的基础上,计算采样点与观察点的斜率前,判断其对应网格点是否已经存在最大斜率,若是则采样点直接采用对应网格点的最大斜率,反之,进行计算。该方法的计算速度为最邻近点近似法的两倍。

接口说明

创建计算模块

/*
*@ return 索引号
*@err /
*/
int CreatMZCZBAL();

设置数字高程数据

/** 设置高程数据

  • pdata 高程矩阵数据,先行后列,从上到下从左到右
  • rows 矩阵行数
  • cols 矩阵列数
  • lat1 左上角纬度
  • lng1 左上角经度
  • lat2 右下角纬度
  • lng2 右下角经度
  • number 地图编号
  • index 索引号
  • return >0 成功 <=0 失败
    *err
    */

int SetDEM(int16_t *pdata, int rows, int cols, double lat1, double lng1, double lat2, double lng2, int number, int index);

计算观察点的区域通视性

/**计算观察点的通视性

  • cons 可视区域的连通域集合

  • consNum 可视区域数量

  • sensor 传感器参数

  • mode 计算模式

  • index 防区索引号

  • return >=0成功,若<0表示失败

  • err /
    */

int CalcPointVisibility_conts(CConnectedDomain* cons, int &consNum, CSensorInfo sensor, int mode, int index);

释放计算模块

/** 释放计算模块

  • index 防区索引号

  • return

  • err /
    */

int ReleaseVisibility(int index);

编码说明

项目用C++实现,有一个调用示例项目。https://download.csdn.net/download/weixin_45720771/12500231

算法效果

以90M高程为例,采样距离为90M,计算传感器探测半径为80公里时10001000(90千米90千米)的网格点最小通视高度。

最邻近点近似法

CPU 联想笔记本 i5-7300 3线程计算
计算速率 平均大约 1.5点/秒

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值