将经纬度转换为X Y坐标C++

6
我有一个向量,里面包含了以这种格式表示的纬度和经度坐标。
82.0000000, -180.0000000

我正在尝试将它们转换为X和Y坐标,使用这段代码将它们绘制到地图上,就我所看到的来说,代码是正确的...
X:
double testClass::getX(double lon)
{
    // Convert long to X coordinate (2043 = map width)
    double x =  lon;
    // Scale
    x =         x * 2043.0 / 360.0;
    // Center
    x +=        2043.0/2.0;
    return x;
}

Y:
double testClass::getY(double lat)
{
    // Convert lat to Y coordinate (1730 = map height)
    double y =  -1 * lat;
    // Scale
    y =         y * 1730.0 / 180.0;
    // Center
    y +=        1730.0/2.0;
    return y;
}

然而,当我在地图上标出这些点时,我发现它们确实像世界地图,但都偏移了 x 量,我认为这与我的比例有关。你有什么想法吗?

2
我认为你在地图投影方面出了问题。你需要在代码中使用与生成地图时相同的投影变换。 - indeterminately sequenced
6
地球是圆的,纬线在地球两极之间的距离比赤道之间的距离要更接近。为了将球面上的点映射到二维平面上,您需要使用转换函数(投影)。 - Jonathan Potter
1
也许可以从http://mathworld.wolfram.com/MercatorProjection.html开始。 - Jonathan Potter
3
@AngryDuck 不要被所有的数学公式吓到。该Wolfram页面上相关的公式仅为前两个,即 x=...y=...,而对于 y 的公式可能看起来很困惑,但实际上只是几个可以得出相同结果的另类公式。 - hyde
1
@AngryDuck:在上面的链接中,lambda是您的经度,phi是您的纬度。您必须选择一个lambda_0作为地图的中心经度。从这三个值中,您可以得到x和y。X是您的纬度/经度的水平地图位置,介于-180度和+180度之间,而y是垂直地图位置,介于-90度和+90度之间。我相信您可以无缝地在弧度和度之间进行转换。 - mars
显示剩余9条评论
1个回答

7

好的,我找到了这个问题的答案。

double testClass::getX(double lon, int width)
{
    // width is map width
    double x = fmod((width*(180+lon)/360), (width +(width/2)));

    return x;
}

double testClass::getY(double lat, int height, int width)
{
    // height and width are map height and width
    double PI = 3.14159265359;
    double latRad = lat*PI/180;

    // get y value
    double mercN = log(tan((PI/4)+(latRad/2)));
    double y     = (height/2)-(width*mercN/(2*PI));
    return y;
}

使用墨卡托地图时,这样做完美无缺。


3
看起来很好。我希望你能看到这些函数是如何对应那个页面http://mathworld.wolfram.com/MercatorProjection.html上显示的第一个`y`的公式的。 - hyde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接