【问题标题】:draw satellite covarage zone on equirectangular projection在等角投影上绘制卫星覆盖区
【发布时间】:2018-01-11 16:26:20
【问题描述】:

我需要在等角投影上绘制卫星观测区的边界。我找到了这个公式(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)));

地球在不同平面上的横截面:

及方程组(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));

地球经度参考角方案:

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:

中心在 120;60:

中心在 -120;-25

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

中心在 -95;-50

中心在 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);
}

【问题讨论】:

  • 你在公式(2)的第3行声明if sin(lambda) &lt; 0, cos(lambda) &lt; 0 then lambda = 180 - asin(sin(lambda));,但你的代码是sinLambda = -M_PI - asin(sinLambda);。这使它成为-180 - asin(sin(lambda))。这会导致问题吗?
  • 不,它不是,在代码中我这样做是为了更正 (2) 公式。没有这个 -M_PI - asin(sinLambda);它将在投影的另一侧绘制部分区域。在左侧,您只有负经度 (lambda),如果是 Pi - (-sinLambda),您将获得正经度。
  • 可以添加qRadiansToDegrees的代码吗?
  • qRadiansToDegrees 是一个将弧度转换为度数的 QT 函数。 code.woboq.org/qt5/qtbase/src/corelib/kernel/qmath.h.html

标签: c++ distortion satellite


【解决方案1】:

我解决了我的问题。在(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));

抱歉打扰了。

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2015-07-25
    • 2016-09-22
    • 2016-03-30
    相关资源
    最近更新 更多