直線上の最も近い点を見つける


8

2つのlatlon位置の間に線があり、特定のlatlon位置に点があります。私が知りたいのは、その線上の最も近い点が(他の点に関して)何であるかです。したがって、その行の緯度の位置。

基本的な計算方法は知っていますが、緯度計算には頭が足りません。誰かが私を助けたり、それを行う方法についていくつかのアドバイスをくれますか?

ありがとう

回答:


1

これは、Vector3タイプを使用して作成したコードです。正確に特定されていませんが、さらに計算するのに十分近いです:

    public static LatLon GetOrthographicProjecten(LatLon start, LatLon end, LatLon offsetpoint)
    {
        #region Start node conversion

        var sLat = DegreesToRadians(start.Lat);
        var sLon = DegreesToRadians(start.Lon);

        var sX = EarthRadius * Math.Cos(sLat) * Math.Cos(sLon);
        var sY = EarthRadius * Math.Cos(sLat) * Math.Sin(sLon);
        var sZ = EarthRadius * Math.Sin(sLat);

        #endregion

        #region End node conversion

        var eLat = DegreesToRadians(end.Lat);
        var eLon = DegreesToRadians(end.Lon);

        var eX = EarthRadius * Math.Cos(eLat) * Math.Cos(eLon);
        var eY = EarthRadius * Math.Cos(eLat) * Math.Sin(eLon);
        var eZ = EarthRadius * Math.Sin(eLat);

        #endregion

        #region Offsetpoint conversion

        var oLat = DegreesToRadians(offsetpoint.Lat);
        var oLon = DegreesToRadians(offsetpoint.Lon);

        var oX = EarthRadius * Math.Cos(oLat) * Math.Cos(oLon);
        var oY = EarthRadius * Math.Cos(oLat) * Math.Sin(oLon);
        var oZ = EarthRadius * Math.Sin(oLat);

        #endregion

        // Create vectors
        var p1 = new Vector3(sX, sY, sZ);
        var p2 = new Vector3(eX, eY, eZ);
        var o = new Vector3(oX, oY, oZ);

        // Calculate
        var u = p2 - p1;
        var po = o - p1;
        var w2 = po - (u * Vector3.DotProduct(po, u) / Math.Pow(u.Magnitude, 2));
        var point = o - w2;

        // Convert to latlon
        var rlat = RadiansToDegrees(Math.Asin(point.Z / EarthRadius));
        var rlon = RadiansToDegrees(Math.Atan2(point.Y, point.X));

        return new LatLon(rlat, rlon);
    }

地球半径は6371kmで、少なくともそれを使用しました。私は推測themselfsためRadiansToDegreesおよびその逆話す...
hutsend

このコードは、投影された点が実際にセグメントの2つの端点の間にあることをどのように保証しますか?
whuber

あなたは正しいです。そうではありません。私が最終的に使用したコードでは、これが実装されています。そのスニペットを見つけて、ここに投稿できるかどうか確認します。
hutsend 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.