/// <summary>
        /// 高德转GPS
        /// </summary>
        /// <param name="wgLat"></param>
        /// <param name="wgLon"></param>
        /// <returns></returns>
        public static CoordinatesHelper GCJ02_to_WGS84(double wgLat, double wgLon)
        {
            CoordinatesHelper point = new CoordinatesHelper();

            if (OutOfChina(wgLat, wgLon))
            {
                point.SetLat(wgLat);
                point.SetLng(wgLon);
                return(point);
            }

            var a      = 6378245.0;              //  a: 卫星椭球坐标投影到平面地图坐标系的投影因子。
            var ee     = 0.00669342162296594323; //  ee: 椭球的偏心率。
            var lat    = +wgLat;
            var lng    = +wgLon;
            var dlat   = transformLat(lng - 105.0, lat - 35.0);
            var dlng   = transformLon(lng - 105.0, lat - 35.0);
            var radlat = lat / 180.0 * PI;
            var magic  = Math.Sin(radlat);

            magic = 1 - ee * magic * magic;
            var sqrtmagic = Math.Sqrt(magic);

            dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
            dlng = (dlng * 180.0) / (a / sqrtmagic * Math.Cos(radlat) * PI);
            var mglat = lat + dlat;
            var mglng = lng + dlng;

            point.SetLat(lat * 2 - mglat);
            point.SetLng(lng * 2 - mglng);
            return(point);
        }
        /// <summary>
        /// WGS-84转换GCJ-02 GPS转高德
        /// </summary>
        /// <param name="wgLat">纬度</param>
        /// <param name="wgLon">经度</param>
        /// <returns></returns>
        public static CoordinatesHelper WGS84_to_GCJ02(double wgLat, double wgLon)
        {
            CoordinatesHelper point = new CoordinatesHelper();

            if (OutOfChina(wgLat, wgLon))
            {
                point.SetLat(wgLat);
                point.SetLng(wgLon);
                return(point);
            }
            double dLat   = TransformLat(wgLon - 105.0, wgLat - 35.0);
            double dLon   = TransformLon(wgLon - 105.0, wgLat - 35.0);
            double radLat = wgLat / 180.0 * pi;
            double magic  = Math.Sin(radLat);

            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.Sqrt(magic);

            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
            double lat = wgLat + dLat;
            double lon = wgLon + dLon;

            point.SetLat(lat);
            point.SetLng(lon);
            return(point);
        }
        public static CoordinatesHelper WGS84_to_BD09(double wgLat, double wgLon)
        {
            //先转GCJ-02
            CoordinatesHelper point = new CoordinatesHelper();
            var    info             = WGS84_to_GCJ02(wgLat, wgLon);
            double lat = info.GetLat();
            double lon = info.GetLng();

            //第二次转
            return(GCJ02_to_BD09(lat, lon));
        }
        /// <summary>
        /// GCJ-02转换BD-09
        /// </summary>
        /// <param name="gg_lat">纬度</param>
        /// <param name="gg_lon">经度</param>
        /// <returns></returns>
        public static CoordinatesHelper GCJ02_to_BD09(double gg_lat, double gg_lon)
        {
            CoordinatesHelper point = new CoordinatesHelper();
            double            x = gg_lon, y = gg_lat;
            double            z      = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * x_pi);
            double            theta  = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * x_pi);
            double            bd_lon = z * Math.Cos(theta) + 0.0065;
            double            bd_lat = z * Math.Sin(theta) + 0.006;

            point.SetLat(bd_lat);
            point.SetLng(bd_lon);
            return(point);
        }
        public static CoordinatesHelper BD09_to_WGS84(double wgLat, double wgLon)
        {
            double x = wgLon - 0.0065, y = wgLat - 0.006;
            double z      = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * pi);
            double theta  = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * pi);
            double gg_lon = z * Math.Cos(theta);
            double gg_lat = z * Math.Sin(theta);

            //先转GCJ-02
            CoordinatesHelper point = new CoordinatesHelper();

            return(GCJ02_to_WGS84(gg_lat, gg_lon));
        }
        /// <summary>
        /// BD-09转换GCJ-02
        /// </summary>
        /// <param name="bd_lat">纬度</param>
        /// <param name="bd_lon">经度</param>
        /// <returns></returns>
        public static CoordinatesHelper BD09_to_GCJ02(double bd_lat, double bd_lon)
        {
            CoordinatesHelper point = new CoordinatesHelper();

            double x = bd_lon - 0.0065, y = bd_lat - 0.006;
            double z      = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * pi);
            double theta  = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * pi);
            double gg_lon = z * Math.Cos(theta);
            double gg_lat = z * Math.Sin(theta);

            point.SetLat(gg_lat);
            point.SetLng(gg_lon);
            return(point);
        }