Temukan titik terdekat pada sebuah garis


8

Saya memiliki garis yang ada di antara dua posisi latlon, dan sebuah titik pada posisi latlon tertentu. Yang ingin saya ketahui adalah titik terdekat di jalur itu (sehubungan dengan titik lainnya). Jadi posisi latlon di garis itu.

Saya tahu bagaimana melakukan matematika dasar, tetapi saya tidak bisa melupakan perhitungan yang panjang. Adakah yang bisa membantu saya atau memberi saya beberapa petunjuk tentang cara melakukannya?

Terima kasih

Jawaban:


1

Ini adalah kode yang saya buat menggunakan tipe Vector3 . Tidak persis tepat tetapi cukup dekat untuk perhitungan lebih lanjut:

    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);
    }

Earthradius adalah 6371km, setidaknya itulah yang saya gunakan. Saya kira .. RadiansToDegrees dan wakil ayat berbicara untuk diri mereka sendiri
hutsend

Bagaimana kode ini memastikan titik yang diproyeksikan benar-benar terletak di antara dua titik akhir segmen?
whuber

Kau benar. Tidak. Dalam kode saya akhirnya menggunakan ini diterapkan. Saya akan melihat apakah saya dapat menemukan cuplikan itu dan mempostingnya di sini.
hutsend
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.