Пример #1
0
        public static M经纬度 地址编码(string __位置, string __城市 = null)
        {
            string __url = "";
            string __返回值 = "";

            if (string.IsNullOrEmpty(__城市))
            {
                __url = "http://api.map.baidu.com/geocoder/v2/?ak={0}&output=json&address={1}";
                __返回值 = Web服务请求(string.Format(__url, _ak, HttpUtility.UrlEncode(__位置)));
            }
            else
            {
                __url = "http://api.map.baidu.com/geocoder/v2/?ak={0}&output=json&address={1}&city={2}";
                __返回值 = Web服务请求(string.Format(__url, _ak, HttpUtility.UrlEncode(__位置), __城市));
            }
            var __JS序列化器 = new JavaScriptSerializer();
            var __结果     = __JS序列化器.Deserialize <M地址编码结果>(__返回值);

            if (__结果.status != 0)
            {
                return(null);
            }
            var __百度坐标 = new M经纬度(__结果.result.location.lng, __结果.result.location.lat)
            {
                类型 = E坐标类型.百度
            };

            return(HGPS坐标转换.百度坐标转谷歌坐标(__百度坐标));
        }
Пример #2
0
        /// <returns>单位:米</returns>
        public static int 测量两点间间距(M经纬度 点1, M经纬度 点2)
        {
            if (点1.类型 != 点2.类型)
            {
                点1 = HGPS坐标转换.转原始坐标(点1);
                点2 = HGPS坐标转换.转原始坐标(点2);
            }

            return((int)(GMapProviders.EmptyProvider.Projection.GetDistance(new GMap.NET.PointLatLng(点1.纬度, 点1.经度),
                                                                            new GMap.NET.PointLatLng(点2.纬度, 点2.经度)) * 1000));

            //var latRadians1 = __纬度1 * (Math.PI / 180);
            //var latRadians2 = __纬度2 * (Math.PI / 180);
            //var latRadians = latRadians1 - latRadians2;
            //var lngRadians = __经度1 * (Math.PI / 180) - __经度2 * (Math.PI / 180);
            //var f = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(latRadians / 2), 2) + Math.Cos(latRadians1) * Math.Cos(latRadians2) * Math.Pow(Math.Sin(lngRadians / 2), 2)));
            //return f * 6378137;


            //double dLat1InRad = p1.Lat * (Math.PI / 180);
            //double dLong1InRad = p1.Lng * (Math.PI / 180);
            //double dLat2InRad = p2.Lat * (Math.PI / 180);
            //double dLong2InRad = p2.Lng * (Math.PI / 180);
            //double dLongitude = dLong2InRad - dLong1InRad;
            //double dLatitude = dLat2InRad - dLat1InRad;
            //double a = Math.Pow(Math.Sin(dLatitude / 2), 2) + Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) * Math.Pow(Math.Sin(dLongitude / 2), 2);
            //double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
            //double dDistance = (Axis / 1000.0) * c;
            //return dDistance;
        }
Пример #3
0
        /// <param name="半径">单位:米</param>
        public static bool 判断点在圆形内(M经纬度 点, M经纬度 圆心, int 半径)
        {
            if (点.类型 != 圆心.类型)
            {
                点  = HGPS坐标转换.转原始坐标(点);
                圆心 = HGPS坐标转换.转原始坐标(圆心);
            }
            var __间距 = 测量两点间间距(点, 圆心);

            return(__间距 <= 半径);
        }
Пример #4
0
        /// <param name="半径">单位:米</param>
        public static bool 判断圆重叠(M经纬度 圆心1, int 半径1, M经纬度 圆心2, int 半径2)
        {
            if (圆心1.类型 != 圆心2.类型)
            {
                圆心1 = HGPS坐标转换.转原始坐标(圆心1);
                圆心2 = HGPS坐标转换.转原始坐标(圆心2);
            }

            var __间距 = 测量两点间间距(圆心1, 圆心2);

            return(__间距 <= (半径1 + 半径2));
        }
Пример #5
0
        private static M经纬度 转换成谷歌坐标(M经纬度 __原经纬度)
        {
            M经纬度 __结果 = __原经纬度;

            if (__原经纬度.类型 == E坐标类型.百度)
            {
                __结果 = HGPS坐标转换.百度坐标转谷歌坐标(__原经纬度);
            }
            else if (__原经纬度.类型 == E坐标类型.设备)
            {
                __结果 = HGPS坐标转换.原始坐标转谷歌坐标(__原经纬度);
            }
            return(__结果);
        }
Пример #6
0
        static void 读取数据()
        {
            var _程序目录    = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);
            var __压缩文件路径 = Path.Combine(_程序目录, "行政区.gz");
            var __字节流    = 解压(__压缩文件路径);
            int _起始位置    = 0;

            //检测文件是否有bom头
            if (__字节流[0] == 0xef && __字节流[1] == 0xbb && __字节流[2] == 0xbf)
            {
                _起始位置 = 3;
            }
            var __所有行 = Encoding.UTF8.GetString(__字节流, _起始位置, __字节流.Length - _起始位置).Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < __所有行.Length; i++)
            {
                var __属性 = __所有行[i].Split(new char[] { ',' }, 6);
                if (__属性.Length < 5)
                {
                    continue;
                }
                var __行政区 = new M行政区位置
                {
                    省  = __属性[0],
                    市  = __属性[1],
                    区  = __属性[2],
                    经度 = double.Parse(__属性[3]),
                    纬度 = double.Parse(__属性[4])
                };
                _缓存.Add(__行政区);
                if (__属性.Length == 6)
                {
                    var __边界坐标描述 = __属性[5];
                    __边界坐标描述.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries)
                    .ToList()
                    .ForEach(q => __行政区.边界坐标.Add(q.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
                                                 .Select(
                                                     k => HGPS坐标转换.百度坐标转谷歌坐标(new M经纬度(double.Parse(k.Split(',')[0]), double.Parse(k.Split(',')[1]))
                    {
                        类型 = E坐标类型.百度
                    }))
                                                 .ToList()));
                }
            }
        }