Lat / Lng to Web Mercator投影问题

时间:2017-09-28 13:49:33

标签: qt geolocation

我在Qt应用程序中有一些简单的代码,它从纬度/经度坐标转换为web mercator x / y位置:

// Radius of the Earth in metres
const double EARTH_RADIUS = 20037508.34;

// Convert from a LL to a QPointF 
QPointF GeoPoint::toMercator() {
    double x = this->longitude() * EARTH_RADIUS / 180.0;
    double y = log(tan((90.0 + this->latitude()) * PI / 360.0)) / (PI / 180.0);
    y = y * EARTH_RADIUS / 180.0;

    return QPointF(x, y);
}

// Convert from a QPointF to a LL
GeoPoint GeoPoint::fromMercator(const QPointF &pt) {
    double lon = (pt.x() / EARTH_RADIUS) * 180.0;
    double lat = (pt.y() / EARTH_RADIUS) * 180.0;
    lat = 180.0 / PI * (2 * atan(exp(lat * PI / 180.0)) - PI / 2.0);

    return GeoPoint(lat, lon);
}

我想要获取距地理起源数米距离的多个物体的地理位置,但是我缺乏理解或源代码都不正确。

请考虑以下事项:

GeoPoint pt1(54.253230,  -3.006460);
QPointF m1 = pt1.toMercator();
qDebug() << m1;
// QPointF(-334678,7.21826e+06)
// Now I want to add a distance onto the mercator coordinates, i.e. 50 metres
m1.rx() += 50.0;
qDebug() << m1;
// QPointF(-334628,7.21826e+06)
// Take this back to a LL
GeoPoint pt1a = GeoPoint::fromMercator(m1);
qDebug() << pt1a.toString();
// "54.25323°, -3.00601°"

如果我将两个LL坐标绘制到Google地球中,它们不会像预期的那样相距50米,它们相距约29.3米。

我感到困惑!

0 个答案:

没有答案