在 Mollweide 上将纬度、经度转换为 x、y

Convert lat, long to x, y on Mollweide

我已尝试按照 here but I get wild results compared to this 站点的说明进行操作。

这是我的代码。

#include <cmath>

double solveNR(double latitude, double epsilon) {
  if (abs(latitude) == M_PI / 2) {
    return latitude;
  }

  double theta = latitude;
  while (true) {
    double nextTheta = theta - (2 * theta * std::sin(2 * theta) - M_PI * std::sin(latitude)) / (2 + 2 * std::cos(2 * theta));
    if (abs(theta - nextTheta) < epsilon) {
      break;
    }
    theta = nextTheta;
  }
  return theta;
}

void convertToXY(double radius, double latitude, double longitude, double* x, double* y) {

  latitude = latitude * M_PI / 180;
  longitude = longitude * M_PI / 180;
  double longitudeZero = 0 * M_PI / 180;
  double theta = solveNR(latitude, 1);

  *x = radius * 2 * sqrt(2) * (longitude - longitudeZero) * std::cos(theta) / M_PI;
  *y = radius * sqrt(2) * std::sin(theta);
}

例如,

180经度=21

90纬度=8.1209e+06

假设半径为 5742340.81

我找到了 this 似乎可以计算出正确答案的资源。但我无法解析它有何不同。

在你的 solveNR() 函数中你为什么使用

double nextTheta = theta - (2 * theta * std::sin(2 * theta) - PI * 
std::sin(latitude)) / (2 + 2 * std::cos(2 * theta));

改为

double nextTheta = theta - (2 * theta + std::sin(2 * theta) - PI * 
std::sin(latitude)) / (2 + 2 * std::cos(2 * theta));

似乎您应该使用“+”而不是“*”(在分子中的 2 * theta 之后),以符合 wiki 说明。