如何计算遮蔽角

1. 问题描述

对于指定地点(E94.36488,N29.29815)安置的雷达系统,假设已知雷达天线的安装高度,如10米,根据DEM数据,计算某一方位的遮蔽角随距离的变化情况。

遮蔽角是指由于地物影响,导致相应地物远方特定俯仰角以下的区域无法被雷达探测,该角度被称为遮蔽角,如下图所示。

如何计算遮蔽角_第1张图片

2. 问题分析

求解遮蔽角,首先,需要获得雷达站的站心坐标系中所求方位上的高程在该坐标系中的高程随距离的变化。然后,计算各点相对雷达天线的俯仰角。由于遮蔽的存在,远处较小俯仰角将由近处的较大俯仰角所替代,从而获得遮蔽角随距离的变化情况。

在上述分析中,还有一个问题需要解决。获取雷达站的站心坐标系中某一点的高程后,相应高程与其经纬度构成该点的大地坐标系的描述,需要将该点转换成站心坐标系的坐标,故需要利用博文覆盖范围分析中用到的坐标系统的方法进行处理。

3. 具体求解过程

1) 获取地物的大地坐标

假设要获取方位30^{\circ}的遮蔽角变化。根据SRTM3数据是90米的距离间隔,不防选取距离步进为100米,即,以雷达站为原点,沿方位\theta=30^{\circ}方向,每100米选取一点,来获取该点的大地坐标。

在站心坐标系中,在水平面上沿方位 \theta=30^{\circ}每100米选取一点,假设当前计算的点为第n点,P_n,该点在站心坐标系中的坐标为(100n\cdot\sin\theta, 100n\cdot\cos\theta, 0),单位为米。

考虑平面显示的位置是根据兰勃特变换而来的,因此,若获得该点所对应的经纬度(\lambda_n, \phi_n),需要利用利用逆兰勃特变换(详情参见博文兰勃特等角圆锥(Lambert Conformal Conic)投影正反变换)。

相应变换代码

/**
 * 单点Lambert反变换
 * @param Y 正东向坐标值,单位:米
 * @param X 正北向坐标值,单位:米
 * @param latitude0 参考点纬度,单位:度
 * @param longitude0 参考点经度,单位:度
 * @return 被变换点的经纬坐标,GroundPosition.x为经度,单位:度;
                             GroundPosition.y为纬度,单位:度。
 */
public static Point2D.Double arclambert(double Y, double X, 
        double latitude0, double longitude0) {
    //Y:纬度方向, X:经度方向
    double R_earth = 6378137.0;                 //地球半径
    double latitude1 = 25.0, latitude2 = 47.0;  //标准纬度(割纬度)
    Point2D.Double GroundPosition=new Point2D.Double() ;

    //圆锥常数: alpha = frac{ln(cos{latitude1})-ln(cos{latitude2})}
            ln(tan{45+latitude2/2})-ln(tan{45+latitude1/2})}
    double alpha = (Math.log(Math.cos(latitude1 * Math.PI / 180.0)) 
            - Math.log(Math.cos(latitude2 * Math.PI / 180.0)))
            / (Math.log(Math.tan((45.0 + latitude2 / 2.0) * Math.PI / 180.0)) 
            - Math.log(Math.tan((45.0 + latitude1 / 2.0) * Math.PI / 180.0)));
    //坐标原点对应纬圈投影圆弧半径
    double rho_original = (R_earth / alpha) * Math.cos(latitude1 * Math.PI / 180.0)
            * Math.pow(Math.tan((45.0 + latitude1 / 2.0) * Math.PI / 180.0) 
            / Math.tan((45.0 + latitude0 / 2.0) * Math.PI / 180.0), alpha);

    //需变换点对应纬圈投影圆弧半径
    double rho = Math.sqrt(Math.pow(X, 2) + Math.pow(Y, 2) 
            + Math.pow(rho_original, 2) - 2.0 * rho_original * Y);

    double latitude = (2 * Math.atan(Math.tan((45.0 + latitude1 / 2.0) * Math.PI / 180.0)
            / Math.pow(alpha * rho / (R_earth * Math.cos(latitude1 * Math.PI / 180.0)), 
            1 / alpha)) - Math.PI / 2.0) / Math.PI * 180.0;
    double longitude = longitude0 + Math.asin(X / rho) / alpha / Math.PI * 180.0;
    GroundPosition.x = longitude;
    GroundPosition.y = latitude;

    return GroundPosition;
}

根据点P_n所对应的经纬度(\lambda_n, \phi_n),采用最近邻法,可由SRTM3的文件中获得该点的高程数据(详情参见博文在Java GDAL环境中提取指定经纬度的高程数据),进而获得相应的大地坐标点{P}'_n: (\lambda_n, \phi_n, h_n)

2) 获取点{P}'_n的站心坐标

首先,由点{P}'_n的大地坐标(\lambda_n, \phi_n, h_n)计算出其在地心坐标系中的坐标(x_n, y_n, z_n),然后再变换为站心坐标(e_n, n_n, u_n).详情参见博文覆盖范围分析中用到的坐标系统。

这里需要注意的是,点{P}'_n的坐标e_nn_n和点P_n的坐标100n\cdot\sin\theta100n\cdot\cos\theta之间存在差异,不完全相等,但差值并不会太大。

3) 计算遮蔽角

根据 点{P}'_n的站心坐标(e_n, n_n, u_n),计算各点相对雷达天线的俯仰角。

在获得所有点的俯仰角后,再由天线处出发,由近及远,两两比较俯仰角,并用较大的俯仰角更新较远点的俯仰角,作为该点的遮蔽角。

你可能感兴趣的:(电磁波覆盖范围分析,算法,c++,开发语言)