Как получить следующую широту и долготу в соответствии с расстоянием и первой широтой, точкой долготы? - PullRequest
0 голосов
/ 07 марта 2020

Мне нужно найти широту и долготу в соответствии с указанным расстоянием. Например, у меня есть расстояние, скажем 50 сантиметров, и одна точка широты и долготы, и я хочу найти следующую точку, которая находится далеко от 50 см от моей первой точки?

1 Ответ

0 голосов
/ 07 марта 2020

Привет, я получил решение, и я реализовал это, выполнив следующие вычисления из https://www.movable-type.co.uk/scripts/latlong.html и реализовав эти вычисления в c#

    public static double DegreesToRadians(double degrees)
    {
        const double degToRadFactor = Math.PI / 180;
        return degrees * degToRadFactor;
    }

    public static double RadiansToDegrees(double radians)
    {
        const double radToDegFactor = 180 / Math.PI;
        return radians * radToDegFactor;
    }

   private double GetBearing(PointLatLng pt1, PointLatLng pt2)
    {
        double x = Math.Cos(DegreesToRadians(pt1.Lat)) *                Math.Sin(DegreesToRadians(pt2.Lat)) - Math.Sin(DegreesToRadians(pt1.Lat)) * Math.Cos(DegreesToRadians(pt2.Lat)) * Math.Cos(DegreesToRadians(pt2.Lng - pt1.Lng));
        double y = Math.Sin(DegreesToRadians(pt2.Lng - pt1.Lng)) * Math.Cos(DegreesToRadians(pt2.Lat));

        return (Math.Atan2(y, x) + Math.PI * 2) % (Math.PI * 2);            
    }


     public static PointLatLng FindPointAtDistanceFrom(PointLatLng startPoint, double initialBearingRadians)
    {
        double distanceKilometres = 0.0005; //50cm = 0.0005Km;
        const double radiusEarthKilometres = 6371.01;
        var distRatio = distanceKilometres / radiusEarthKilometres;
        var distRatioSine = Math.Sin(distRatio);
        var distRatioCosine = Math.Cos(distRatio);

        var startLatRad = DegreesToRadians(startPoint.Lat);
        var startLonRad = DegreesToRadians(startPoint.Lng);

        var startLatCos = Math.Cos(startLatRad);
        var startLatSin = Math.Sin(startLatRad);

        var endLatRads = Math.Asin((startLatSin * distRatioCosine) + (startLatCos * distRatioSine * Math.Cos(initialBearingRadians)));

        var endLonRads = startLonRad
            + Math.Atan2(
                Math.Sin(initialBearingRadians) * distRatioSine * startLatCos,
                distRatioCosine - startLatSin * Math.Sin(endLatRads));

        return new PointLatLng
        {
            Lat = RadiansToDegrees(endLatRads),
            Lng = RadiansToDegrees(endLonRads)
        };
    }

И использование этого кода:

    //Get Angle of point
    var bearing = GetBearing(polyStartPoint, polyEndPoint);
    //Get Point from 50cm away for specified point
    var nextStartPoint = FindPointAtDistanceFrom(polyStartPoint, bearing);
...