示例#1
0
        /// <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);
        }