GeographicLib:向后移动latLon坐标会产生偏移

时间:2018-08-03 16:06:39

标签: c++ openframeworks

使用下面的代码(对GeographicLib进行简化)来移动坐标并再次返回,以创建到原始起点的偏移。 差异随着运动距离的增加而增加,并取决于方位角。使用GeodesicExact和Geodesic的情况相同。 最后,我要实现的是通过移动起始坐标来创建latLon形状。

是否有一种精确/更好的方法来做到这一点,或者我错过了一些基本知识?

inline double distanceInMeters(const GeoCoords &_c1, const GeoCoords &_c2) {
    GeodesicExact   geod = geodWGS84(); // GeodesicExact::WGS84()
    double          meters;
    geod.Inverse(_c1.Latitude(), _c1.Longitude(),
        _c2.Latitude(), _c2.Longitude(),
        meters);
    return meters;
}

// move coord _byMeters in direction _azimuth
// inexact with horiz moves !!!
inline GeoCoords move(const GeoCoords &_coords, const double &_azimuth, const double &_byMeters) {
    GeodesicExact   geod = geodWGS84();  // GeodesicExact::WGS84()
    double          latOut, lngOut;
    geod.Direct(_coords.Latitude(), _coords.Longitude(), _azimuth, _byMeters, latOut, lngOut);
    return GeoCoords(latOut, lngOut);
}

inline void testDistanceMove() {
    GeoCoords c(12.3456789, 12.3456789);
    GeoCoords cc = c;
    double dist = 123459998.6789; // meters
    bool bHorz = true; // <-- creates some offset???
    bool bVert = true; // almost exact
    if (bHorz) cc = move(cc, Azimuth::WEST, dist); // 270.
    if (bVert) cc = move(cc, Azimuth::SOUTH, dist); // 180
    if (bHorz) cc = move(cc, Azimuth::EAST, dist);  // 90.
    if (bVert) cc = move(cc, Azimuth::NORTH, dist); // 0.

    ofLogNotice((__func__)) << "c : " << toString(c);
    ofLogNotice((__func__)) << "cc: " << toString(cc);
    double diff = distanceInMeters(c, cc);
    ofLogNotice((__func__)) << "diff: " << ofToString(diff, 12) << " m";
}

1 个答案:

答案 0 :(得分:0)

平面几何概念的简单概念不适用于椭圆体上的球体。例如,四边形的内角之和大于360°。如果距离很小(大约1公里),而且距离极点不近,您将获得近似的封闭;但是您的距离超过地球周长的3倍,因此所有赌注都没有了。

添加

为帮助说明问题,请考虑从北极以南1米处开始并绘制距离为1米的4条边(依次为西,南,东和北)。因为1米远小于地球半径,所以这是一个平面问题。然后,折线看起来像(虚线是子午线)

enter image description here

如果您在南极1米以内开始拍摄,图片看起来会更加奇怪。