Tìm điểm gần nhất trên một dòng


8

Tôi có một đường tồn tại giữa hai vị trí latlon và một điểm trên một vị trí latlon nhất định. Những gì tôi muốn biết là điểm gần nhất trên dòng đó là gì (đối với điểm khác). Vì vậy, một vị trí latlon trên dòng đó.

Tôi biết làm thế nào để làm toán cơ bản, nhưng tôi không thể hiểu được tính toán latlong. Bất cứ ai có thể giúp tôi hoặc cho tôi một số gợi ý về cách làm điều đó?

Cảm ơn

Câu trả lời:


1

Đây là mã tôi đã tạo bằng loại Vector3 . Không chính xác tại chỗ nhưng đủ gần để tính toán thêm:

    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 là 6371km, ít nhất đó là những gì tôi đã sử dụng. RadiansToDegrees và vice verse nói cho chính họ tôi đoán ..
hutsend

Làm thế nào để mã này đảm bảo điểm được chiếu thực sự nằm giữa hai điểm cuối của phân khúc?
whuber

Bạn đúng rồi. Nó không. Trong mã cuối cùng tôi đã sử dụng điều này được thực hiện. Tôi sẽ xem nếu tôi có thể tìm thấy đoạn trích đó và đăng nó ở đây.
túp lều
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.