Encontre o ponto mais próximo de uma linha

8

Eu tenho uma linha que existe entre duas posições de latlon e um ponto em uma certa posição de latlon. O que eu quero saber é qual é o ponto mais próximo nessa linha (em relação ao outro ponto). Então, uma posição de latlon nessa linha.

Sei como fazer as contas básicas, mas não consigo entender o cálculo a longo prazo. Alguém pode me ajudar ou me dar algumas dicas sobre como fazê-lo?

obrigado

hutsend
fonte

Respostas:

1

Este é o código que criei usando um tipo Vector3 . Não está exatamente no local, mas está perto o suficiente para cálculos adicionais:

    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);
    }
hutsend
fonte
O raio da Terra é de 6371 km, pelo menos é o que eu usei. RadiansToDegrees e vice-versa falam por themselfs eu acho ..
hutsend
Como esse código garante que o ponto projetado realmente fique entre os dois pontos finais do segmento?
whuber
Você está certa. Não faz. No código que acabei usando, isso é implementado. Vou ver se consigo encontrar esse trecho e publicá-lo aqui.
hutsend 02/09