/// <summary> /// Получение новой точки на основании начальной координаты, азимута и растояния /// </summary> /// <param name="StartPoint">Начальная точка</param> /// <param name="asimut">азимут</param> /// <param name="distance">растояние от начальной точки</param> /// <returns></returns> public static PointLatLng GetCoordinate(PointLatLng StartPoint, double asimut, double distance) { /* * S - distance , растояние */ PointLatLng FinishPoint = new PointLatLng(); //double a = 6378137; //большая полуось элипсоида //double alfa = 1 / 298.257223563;//коэфициент сжатия элипсоида //double ro = 206264.80624; //double b = a * (1 - alfa); //малая полуось элипсоида, ~ 6356752.314245179497 //double B = StartPoint.Coordinates.Lat; //геодезическая широта // убрать переменную использовать StartPoint.Coordinates.Lat //double e = Math.Sqrt((Math.Pow(a, 2) - Math.Pow(b, 2)) / Math.Pow(a, 2));// первый эксцентритет //double e2 = Math.Sqrt((Math.Pow(a, 2) - Math.Pow(b, 2)) / Math.Pow(b, 2)); //double N = (a / Math.Sqrt(1 - Math.Pow(e1, 2) * Math.Pow(Math.Sin(CMBaseGeoPoint.DegreeToRad(B)), 2))); //6387718.2645889279 //6387825.05301 double u = ((distance / N(StartPoint.Lat)) * Math.Cos(CMBaseGeoPoint.DegreeToRad(asimut))); double v = ((distance / N(StartPoint.Lat)) * Math.Sin(CMBaseGeoPoint.DegreeToRad(asimut))); double pb = u * (1 + Math.Pow(v, 2) / 3); double pc = v * (1 - Math.Pow(u, 2) / 6); double fi = (StartPoint.Lat + CMBaseGeoPoint.ShowDegreeFraction(0, 0, pb * ro)); double tau = pc * Math.Tan(CMBaseGeoPoint.DegreeToRad(fi)); double lambda = pc * (1 / Math.Cos(CMBaseGeoPoint.DegreeToRad(fi))); double t = tau * (1 - Math.Pow(lambda, 2) / 6 - Math.Pow(tau, 2) / 6) * ro; double l = lambda * (1 - Math.Pow(tau, 2)) * ro; double d = pc * tau / 2 * (1 - Math.Pow(lambda, 2) / 12 - Math.Pow(tau, 2) / 6); double deltafi = pb - d; double V = 1 + Math.Pow(e2, 2) * Math.Pow(Math.Cos(CMBaseGeoPoint.DegreeToRad(StartPoint.Lat)), 2); double deltaB = V * deltafi * (1 - 3.0 / 4.0 * Math.Pow(e2, 2) * Math.Sin(StartPoint.Lat * 2) * deltafi - Math.Pow(e2, 2) / 2 * Math.Cos(StartPoint.Lat * 2) * Math.Pow(deltafi, 2)) * ro; FinishPoint.Lat = StartPoint.Lat + CMBaseGeoPoint.ShowDegreeFraction(0, 0, deltaB); FinishPoint.Lng = StartPoint.Lng + CMBaseGeoPoint.ShowDegreeFraction(0, 0, l); return(FinishPoint); }