在equirectangular投影上绘制卫星covarage区域

时间:2018-01-11 16:26:21

标签: c++ distortion satellite

我需要在equirectangular投影上绘制卫星观测区的边界。我找到了这个公式(1)和图:

sin(fi) = cos(alpha) * sin(fiSat) – sin(alpha) * sin (Beta) * cos (fiSat);

sin(lambda) = (cos(alpha) * cos(fiSat) * sin(lambdaSat)) / cos(asin(sin(fi))) +
              (sin(alpha) * sin(Beta) * sin(fiSat) * sin(lambdaSat)) / cos(asin(sin(fi))) -
              (sin(alpha) * cos(Beta) * cos(lambdaSat))/cos(asin(sin(fi)));

cos(lambda) = (cos(alpha) * cos(fiSat) * cos(lambdaSat)) / cos(asin(sin(fi))) +
              (sin(alpha) * sin(Beta) * sin(fiSat) * cos(lambdaSat)) / cos(asin(sin(fi))) -
              (sin(alpha) * cos(Beta) * sin(lambdaSat)) / cos(asin(sin(fi)));

地球在不同平面上的横截面: Cross-sections of the Earth in various planes

方程式系统(2)与图:

if sin(lambda) > 0, cos(lambda) > 0 then lambda = asin(sin(lambda));
if sin(lambda) > 0, cos(lambda) < 0 then lambda = 180 - asin(sin(lambda));
if sin(lambda) < 0, cos(lambda) < 0 then lambda = 180 - asin(sin(lambda));
if sin(lambda) < 0, cos(lambda) > 0 then lambda = asin(sin(lambda));

地球经度的参考角度方案: Scheme of reference angles for the longitude of the Earth

Where:  alpha – polar angle;
    fiSat, lambdaSat – latitude, longitude of satellite;
    Beta – angle which change from 0 to 2*Pi and help to draw the observation zone;
    fi, lambda – latitude, longitude of point B on the border of observation zone;

我在循环中从0到2 * Pi重复(1)和(2)公式以绘制观察区域的边界。但我不完全确定(2)方程组。

内部间隔[-180; -90],[ - 90; 90],[90; 180]区域正确绘制。

中心在-35; 45: Center at -35;45

中心120; 60: Center at 120;60

中心在-120; -25 Center at -120;-25

但是在-90和90度的边界上它会变得混乱:

居中于-95; -50 Center at -95;-50

居中于95; 30 Center at 95;30

你能帮我解决公式(1)和(2)还是写另一个公式?

double deltaB = 1.0*M_PI/180;
observerZone.clear();
for (double Beta = 0.0; Beta <= (M_PI * 2) ; Beta += deltaB){
    double sinFi = cos(alpha) * sin(fiSat) - sin(alpha) * sin(Beta) * cos(fiSat);
    double sinLambda = (cos(alpha) * cos(fiSat) * sin(lambdaSat))/cos(asin(sinFi)) +
                             (sin(alpha) * sin(Beta) * sin(fiSat) * sin(lambdaSat))/cos(asin(sinFi)) -
                            (sin(alpha) * cos(Beta) * cos(lambdaSat))/cos(asin(sinFi));
    double cosLambda = (cos(alpha) * cos(fiSat) * cos(lambdaSat))/cos(asin(sinFi)) +
                            (sin(alpha) * sin(Beta) * sin(fiSat) * cos(lambdaSat))/cos(asin(sinFi)) -
                            (sin(alpha) * cos(Beta) * sin(lambdaSat))/cos(asin(sinFi));
    if (sinLambda > 0) {
        if (cosLambda > 0 ){
            sinLambda = asin(sinLambda);
            sinFi = asin(sinFi);
        }
        else {
            sinLambda = M_PI - asin(sinLambda);
            sinFi = asin(sinFi);
        }
    }
    else if (cosLambda > 0) {
        sinLambda = asin(sinLambda);
        sinFi = asin(sinFi);
    }
    else {
        sinLambda = -M_PI - asin(sinLambda);
        sinFi = asin(sinFi);
    }
    Point point;
    point.latitude = qRadiansToDegrees(sinFi);
    point.longitude = qRadiansToDegrees(sinLambda);
    observerZone.push_back(point);
}

1 个答案:

答案 0 :(得分:0)

我解决了我的问题。在(1)式中,计算cosLambda时应该是+而不是 - 。

double cosLambda = (cos(alpha) * cos(fiSat) * cos(lambdaSat))/cos(asin(sinFi)) +
                            (sin(alpha) * sin(Beta) * sin(fiSat) * cos(lambdaSat))/cos(asin(sinFi)) +
                            (sin(alpha) * cos(Beta) * sin(lambdaSat))/cos(asin(sinFi));

抱歉令人不安。