Suchen Sie den nächsten Punkt auf einer Linie

8

Ich habe eine Linie zwischen zwei Latlon-Positionen und einem Punkt auf einer bestimmten Latlon-Position. Was ich wissen möchte, ist, was der nächste Punkt auf dieser Linie ist (in Bezug auf den anderen Punkt). Also eine Latlon-Position auf dieser Linie.

Ich weiß, wie man die Grundrechenarten macht, aber ich kann mich einfach nicht mit der Latlong-Berechnung auseinandersetzen. Kann mir jemand helfen oder mir einige Hinweise geben, wie es geht?

Vielen Dank

Hüttenende
quelle

Antworten:

1

Dies ist der Code, den ich mit einem Vector3-Typ erstellt habe . Ist nicht genau richtig, aber nah genug für weitere Berechnungen:

    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);
    }
Hüttenende
quelle
Der Erdradius beträgt 6371 km, zumindest habe ich ihn benutzt. RadiansToDegrees und umgekehrt sprechen für sich selbst, denke ich ..
Hutend
Wie stellt dieser Code sicher, dass der projizierte Punkt tatsächlich zwischen den beiden Endpunkten des Segments liegt?
whuber
Du hast recht, whuber. Das tut es nicht. In dem Code, den ich schließlich verwendet habe, ist dies implementiert. Ich werde sehen, ob ich diesen Ausschnitt finden und hier posten kann.
Hutsende