0

私は次の機能を使用しています。

    private static Location CoordinateAtADistance(double latOrigin, double lonOrigin, double radius, double angle)
    {

        double lonDestination;
        double R = 6371.0;
        double d = radius / R;  // d = angular distance covered on earth's surface

        double lat1 = ToRadian(latOrigin);
        double lon1 = ToRadian(lonOrigin);
        double brng = ToRadian(angle);



        double latDestination = lat1 + d * Math.Cos(brng);
        double dLat = d * Math.Cos(brng);
        double dPhi = Math.Log(Math.Tan(latDestination / 2 + Math.PI / 4) / Math.Tan(lat1 / 2 + Math.PI / 4));
        double q = (double.IsNaN(dLat / dPhi)) ? dLat / dPhi : Math.Cos(lat1);  // E-W line gives dPhi=0
        double dLon = d * Math.Sin(brng) / q;
        // check for some daft bugger going past the pole
        if (Math.Abs(latDestination) > Math.PI / 2)
            latDestination = latDestination > 0 ? Math.PI - latDestination : -(Math.PI - latDestination);

        lonDestination = (lon1 + dLon +3* Math.PI) % (2 * Math.PI) - Math.PI;

        Location nextPoint = new Location();
        if (angle == 0)
        {
            nextPoint.Latitude = ToDegree(latDestination);
            nextPoint.Longitude = lonOrigin;
        }
        if (angle == 90)
        {
            nextPoint.Latitude = latOrigin;
            nextPoint.Longitude = ToDegree(lonDestination);
        }
        return nextPoint;
    }

ここで半径は距離です。

問題は、短い距離を計算するときです。たとえば、数百キロメートルは完全に機能します。しかし、11,000 キロメートルという長い距離では、正しい経度が得られます。私は緯度または経度のどちらかに沿って移動するだけなので、どちらの場合も変更されません。緯度を求めて移動しているときに正しい答えが得られますが、経度の値はさらに近くありません。不明な点があればコメントを投稿してください。

4

1 に答える 1

0
    double latDestination = lat1 + d * Math.Cos(brng);
        double dLat = d * Math.Cos(brng);
        double dPhi = Math.Log(Math.Tan(latDestination / 2 + Math.PI / 4) / Math.Tan(lat1 / 2 + Math.PI / 4));
        double q = (double.IsNaN(dLat / dPhi)) ? dLat / dPhi : Math.Cos(lat1);  // E-W line gives dPhi=0
        double dLon = d * Math.Sin(brng) / q;
        // check for some daft bugger going past the pole
        if (Math.Abs(latDestination) > Math.PI / 2)
            latDestination = latDestination > 0 ? Math.PI - latDestination : -(Math.PI - latDestination);

        lonDestination = (lon1 + dLon + 3 * Math.PI) % (2 * Math.PI) - Math.PI;

少し修正が必要で、上記の式は正常に機能します。

于 2013-02-19T14:54:13.483 に答える