基于最小通视高度的通视性算法
论文原文:基于最小通视高度的改进通视性算法-贾开吉
在已知观察点和观察点所在区域的地形下,计算观察点可视的地形表面集合。该算法不仅可以计算区域地形表面的通视情况,还能快速精确计算非地面目标的可视情况。
本文通过C++实现该算法,在采样点选择上做了点修改,增加并行计算,加快计算速度。
算法原理
遍历计算区域的轮廓,以轮廓点和观察点连线,从观察点开始以固定距离采样,计算采样点的最小可视高度并赋值给其周围的网格点。
最小可视高度定义:相对于观察点,目标点的最小可视高度。
算法流程
- 做区域在平面上的投影,对区域边界取外接矩形,从观察点的投影点到外界矩形上的所有网格点做连线;
- 在所有连线上均匀采样,采样点不是网格点的利用插值法求得该点的高程数据(牺牲精度的情况下可以直接对采样点坐标取整),最终对每一条连线生成一个剖面图;
- 从观察点开始,对每一个采样点利用最大斜率方法,计算该采样点的最小通视高度,将采样点的最小通视高度赋值给邻近网格点;
- 输入目标高度与对应网格点最小通视高度作比较,若目标高度大于最小通视高度,该目标可视,反之,不可视。
算法实现
最大斜率法
从观察点依次向剖面图上的采样点做连线,计算采样点的斜率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.youkuaiyun.com/download/weixin_45720771/12500231
算法效果
以90M高程为例,采样距离为90M,计算传感器探测半径为80公里时10001000(90千米90千米)的网格点最小通视高度。
最邻近点近似法
CPU 联想笔记本 i5-7300 3线程计算
计算速率 平均大约 1.5点/秒