Как вычислить координату X метров от точки, но к другой в C # - PullRequest
0 голосов
/ 21 ноября 2018

Допустим, у меня есть 2 координаты, которые находятся на расстоянии ~ 222,33 метра друг от друга:

A: 49.25818, -123.20626
B: 49.25813, -123.2032

Эти две точки составляют отрезок.

Как вычислить координату точки Zто есть X метров от A или B, но в направлении другой точки?

Я уже знаю расстояние между моими двумя точками, используя библиотеку System.Device.Location.

GeoCoordinate A = new GeoCoordinate(49.25818, -123.20626);
GeoCoordinate B = new GeoCoordinate(49.25813, -123.2032);
var distanceInMeters = A.GetDistanceTo(B);
// distanceInMeters = 222.33039783713738

I 'я ищу что-то вроде этого:

GeoCoordinate GetPointTowards(GeoCoordinate fromPoint, GeoCoordinate towardPoint, double distanceInMeter) {
    [???]
}

Я думаю, мне может понадобиться направление или что-то еще, чтобы можно было найти новую точку.

Большинство примеров, которые я нашел, относятся к iOS, Android или GMaps с конкретными библиотеками ..

Ответы [ 2 ]

0 голосов
/ 09 августа 2019

Это мой код, преобразованный в C # из http://www.movable -type.co.uk / scripts / latlong.html .Дробь - от 0 до 1 и является дробью на расстоянии от первой точки до второй точки, в которой будет находиться позиция вывода.Вы всегда можете изменить его, чтобы принять прямое значение расстояния.

public static (double Lat, double Lon) IntermediatePoint((double Lat, double Lon) StartPoint, (double Lat, double Lon) EndPoint, double fraction)
    {
        if (fraction < 0 || fraction > 1)
            throw new ArgumentOutOfRangeException();
        double angDist = Distance(StartPoint, EndPoint) / radius;
        double lat1 = StartPoint.Lat * (Math.PI / 180);
        double lon1 = StartPoint.Lon * (Math.PI / 180);
        double lat2 = EndPoint.Lat * (Math.PI / 180);
        double lon2 = EndPoint.Lon * (Math.PI / 180);
        double a = Math.Sin((1 - fraction) * angDist) / Math.Sin(angDist);
        double b = Math.Sin(fraction * angDist) / Math.Sin(angDist);
        double x = a * Math.Cos(lat1) * Math.Cos(lon1) + b * Math.Cos(lat2) * Math.Cos(lon2);
        double y = a * Math.Cos(lat1) * Math.Sin(lon1) + b * Math.Cos(lat2) * Math.Sin(lon2);
        double z = a * Math.Sin(lat1) + b * Math.Sin(lat2);
        double lat3 = Math.Atan2(z, Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)));
        double lon3 = Math.Atan2(y, x);
        return (lat3 * (180 / Math.PI), lon3 * (180 / Math.PI));
    }
public static double Distance((double Lat, double Lon) point1, (double Lat, double Lon) point2)
    {
        double φ1 = point1.Lat * (Math.PI / 180.0);
        double φ2 = point2.Lat * (Math.PI / 180.0);
        double Δφ = (point2.Lat - point1.Lat) * (Math.PI / 180.0);
        double Δλ = (point2.Lon - point1.Lon) * (Math.PI / 180.0);
        double a = Math.Sin(Δφ / 2) * Math.Sin(Δφ / 2) + Math.Cos(φ1) * Math.Cos(φ2) * Math.Sin(Δλ / 2) * Math.Sin(Δλ / 2);
        double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));

        return radius * c;
    }

radius - это константа, представляющая радиус Земли в метрах.

0 голосов
/ 21 ноября 2018

Вот схема того, как я бы это сделал.При таком подходе нет необходимости явно иметь дело с разницей в единицах между координатами и расстояниями, потому что взятие отношения цели к общему расстоянию устраняет единицу.

totalDistance = distance in meters between point A and point B.
targetDistance = distance in meters to travel from point A to point B

ratio = targetDistance / totalDistance

diffX = B.X - A.X
diffY = B.Y - A.Y

targetX = A.X + (ratio * diffX)
targetY = A.Y + (ratio * diffY)

Но это не будет обрабатывать крайнапример, на 179 градусов долготы и добавлении 3 градусов, что даст вам -178 долготы.

...