示例#1
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;
        }
示例#2
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坐标转换.百度坐标转谷歌坐标(__百度坐标));
        }
示例#3
0
 public static bool 判断点在多边形内(M经纬度 点, List <M经纬度> 多边形)
 {
     if (多边形.Any(q => q.类型 != 点.类型))
     {
         多边形 = 多边形.Select(HGPS坐标转换.转原始坐标).ToList();
     }
     return(判断点在多边形内(new PointF((float)点.经度, (float)点.纬度), 多边形.Select(q => new PointF((float)q.经度, (float)q.纬度)).ToArray()));
 }
示例#4
0
 /// <param name="__半径">单位:米</param>
 /// <param name="__绑定对象">暂不支持</param>
 public UInt64 添加圆(M经纬度 __圆心, int __半径, M区域绘制参数 __绘制参数, object __绑定对象 = null, string __图层名称 = null)
 {
     return(添加圆(__圆心, __半径, new Pen(__绘制参数.边框颜色)
     {
         Width = __绘制参数.边框宽度
     }, new SolidBrush(__绘制参数.填充颜色), __绑定对象 != null, __绑定对象,
                __图层名称));
 }
示例#5
0
        public static M经纬度 百度坐标转原始坐标(M经纬度 百度坐标)
        {
            var __gps84 = H坐标转换.bd09_To_Gps84(百度坐标.纬度, 百度坐标.经度);

            return(new M经纬度(__gps84.Lng, __gps84.Lat)
            {
                类型 = E坐标类型.设备
            });
        }
示例#6
0
        public static M经纬度 百度坐标转谷歌坐标(M经纬度 百度坐标)
        {
            var __gcj = H坐标转换.bd09_To_Gcj02(百度坐标.纬度, 百度坐标.经度);

            return(new M经纬度(__gcj.Lng, __gcj.Lat)
            {
                类型 = E坐标类型.谷歌
            });
        }
示例#7
0
        public static M经纬度 谷歌坐标转百度坐标(M经纬度 谷歌坐标)
        {
            var __bd = H坐标转换.gcj02_To_Bd09(谷歌坐标.纬度, 谷歌坐标.经度);

            return(new M经纬度(__bd.Lng, __bd.Lat)
            {
                类型 = E坐标类型.百度
            });
        }
示例#8
0
        public M经纬度 纠偏(M经纬度 __原始坐标)
        {
            var __temp = GPS转换(__原始坐标);

            return(new M经纬度(__temp.Lng, __temp.Lat)
            {
                类型 = E坐标类型.谷歌
            });
        }
示例#9
0
        public static M经纬度 原始坐标转谷歌坐标(M经纬度 原始坐标)
        {
            var __gcj = H坐标转换.gps84_To_Gcj02(原始坐标.纬度, 原始坐标.经度);

            return(new M经纬度(__gcj.Lng, __gcj.Lat)
            {
                类型 = E坐标类型.谷歌
            });
        }
示例#10
0
 public UInt64 添加点(M经纬度 __点, Image __图片, string __标题 = null, object __绑定对象 = null, string __图层名称 = null, E标题显示方式 __标题显示方式 = E标题显示方式.OnMouseOver, bool __图标偏移 = false)
 {
     if (this.InvokeRequired)
     {
         var __信号量 = this.BeginInvoke(new Func <M经纬度, Image, string, object, string, E标题显示方式, bool, UInt64>(添加点), __点, __图片, __标题, __绑定对象, __图层名称, __标题显示方式, __图标偏移);
         __信号量.AsyncWaitHandle.WaitOne();
         return((UInt64)this.EndInvoke(__信号量));
     }
     return(添加点(获取图层(__图层名称), __点, __图片, __标题, __绑定对象 != null || __标题 != null, __绑定对象, __标题显示方式, __图标偏移));
 }
示例#11
0
        public static M经纬度 谷歌坐标转原始坐标(M经纬度 谷歌坐标)
        {
            var __bd    = H坐标转换.gcj02_To_Bd09(谷歌坐标.纬度, 谷歌坐标.经度);
            var __gps84 = H坐标转换.bd09_To_Gps84(__bd.Lat, __bd.Lng);

            return(new M经纬度(__gps84.Lng, __gps84.Lat)
            {
                类型 = E坐标类型.设备
            });
        }
示例#12
0
 public UInt64 添加点(M经纬度 __点, M点绘制参数 __绘制参数, object __绑定对象 = null, string __图层名称 = null)
 {
     if (this.InvokeRequired)
     {
         var __信号量 = this.BeginInvoke(new Func <M经纬度, M点绘制参数, object, string, UInt64>(添加点), __点, __绘制参数, __绑定对象, __图层名称);
         __信号量.AsyncWaitHandle.WaitOne();
         return((UInt64)this.EndInvoke(__信号量));
     }
     return(添加点(获取图层(__图层名称), __点, __绘制参数.图片, __绘制参数.标题, __绑定对象 != null || __绘制参数.标题 != null, __绑定对象, __绘制参数.标题显示方式, __绘制参数.偏移));
 }
示例#13
0
        public void 定位(M经纬度 __点)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new Action <M经纬度>(定位), __点);
                return;
            }

            this.out地图控件.Position = GPS转换(__点);
        }
示例#14
0
        /// <param name="半径">单位:米</param>
        public static bool 判断点在圆形内(M经纬度 点, M经纬度 圆心, int 半径)
        {
            if (点.类型 != 圆心.类型)
            {
                点  = HGPS坐标转换.转原始坐标(点);
                圆心 = HGPS坐标转换.转原始坐标(圆心);
            }
            var __间距 = 测量两点间间距(点, 圆心);

            return(__间距 <= 半径);
        }
示例#15
0
        public static M经纬度 谷歌坐标转百度坐标(M经纬度 谷歌坐标)
        {
            double __百度经度;
            double __百度纬度;

            谷歌坐标转百度坐标(谷歌坐标.纬度, 谷歌坐标.经度, out __百度纬度, out __百度经度);
            return(new M经纬度(__百度经度, __百度纬度)
            {
                类型 = E坐标类型.百度
            });
        }
示例#16
0
        public static M经纬度 原始坐标转谷歌坐标(M经纬度 原始坐标)
        {
            double __谷歌经度;
            double __谷歌纬度;

            原始坐标转谷歌坐标(原始坐标.纬度, 原始坐标.经度, out __谷歌纬度, out __谷歌经度);
            return(new M经纬度(__谷歌经度, __谷歌纬度)
            {
                类型 = E坐标类型.谷歌
            });
        }
示例#17
0
        public UInt64 添加矩形(M经纬度 __左上角点, M经纬度 __右下角点, Pen __边框画笔, Brush __填充笔刷, bool __允许交互, object __绑定对象 = null, string __图层名称 = null)
        {
            var __点列表 = new List <M经纬度> {
                __左上角点,
                __左上角点.偏移(__右下角点.经度 - __左上角点.经度, 0),
                __右下角点,
                __右下角点.偏移(__左上角点.经度 - __右下角点.经度, 0),
            };

            return(添加多边形(__点列表, __边框画笔, __填充笔刷, __允许交互, __绑定对象, __图层名称));
        }
示例#18
0
        public UInt64 添加矩形(M经纬度 __左上角点, M经纬度 __右下角点, M区域绘制参数 __绘制参数, object __绑定对象 = null, string __图层名称 = null)
        {
            var __点列表 = new List <M经纬度> {
                __左上角点,
                __左上角点.偏移(__右下角点.经度 - __左上角点.经度, 0),
                __右下角点,
                __右下角点.偏移(__左上角点.经度 - __右下角点.经度, 0),
            };

            return(添加多边形(__点列表, __绘制参数, __绑定对象, __图层名称));
        }
示例#19
0
 public void 初始化地图参数(E地图源 __地图源, M经纬度 __中心位置, int __最小层级, int __最大层级)
 {
     this.最小层级 = __最小层级;
     this.最大层级 = __最大层级;
     设置层级范围(this.最小层级, this.最大层级);
     this.当前层级 = __最小层级 + (__最大层级 - __最小层级) / 2;
     this.do缩放.设置当前级别(this.当前层级);
     this.out地图控件.Position = GPS转换(__中心位置);
     this.当前地图源            = __地图源;
     //this.out地图控件.BoundsOfMap = new RectLatLng(_地图初始中心, new SizeLatLng(0.2, 0.2)); //限定地图移动范围
 }
示例#20
0
        public static List <M线路> 查询公交线路(M经纬度 __起点, M经纬度 __终点, string __城市, E驾车路线选择策略 __策略, out List <M地址> __可能起点, out List <M地址> __可能终点)
        {
            __起点 = 转换成百度坐标(__起点);
            __终点 = 转换成百度坐标(__终点);
            string __url = "http://api.map.baidu.com/direction/v1?mode=transit&output=xml&ak={0}&origin={1}&destination={2}&region={3}&tactics={4}";
            string __返回值 = "";

            __返回值 = Web服务请求(string.Format(__url, _ak, HttpUtility.UrlEncode(string.Format("{1},{0}", __起点.经度, __起点.纬度)), HttpUtility.UrlEncode(string.Format("{1},{0}", __终点.经度, __终点.纬度)), HttpUtility.UrlEncode(__城市), (int)__策略));

            var __XML文档  = XDocument.Load(new StringReader(__返回值));
            var __根节点    = __XML文档.Root;
            var __status = __根节点.XPathSelectElement("./status").Value;

            if (__status != "0")
            {
                throw new Exception(__根节点.XPathSelectElement("./message").Value);
            }
            var __type = __根节点.XPathSelectElement("./type").Value;
            var __结果   = new List <M线路>();

            if (__type == "2")
            {
                foreach (XElement __节点 in __根节点.XPathSelectElements("./result/routes/scheme"))
                {
                    var __距离 = int.Parse(__节点.XPathSelectElement("./distance").Value);
                    var __时间 = int.Parse(__节点.XPathSelectElement("./duration").Value) / 60;
                    var __线路 = new M线路(string.Format("距离: {0}, 耗时: {1}", __距离, __时间));
                    __线路.距离 = __距离;
                    foreach (XElement __二级节点 in __节点.XPathSelectElements("./steps/info"))
                    {
                        var __起点经度 = double.Parse(__二级节点.XPathSelectElement("./stepOriginLocation/lng").Value);
                        var __起点纬度 = double.Parse(__二级节点.XPathSelectElement("./stepOriginLocation/lat").Value);
                        var __说明   = __二级节点.XPathSelectElement("./stepInstruction").Value;
                        __线路.点集合.Add(转换成谷歌坐标(new M经纬度(__起点经度, __起点纬度)
                        {
                            类型 = E坐标类型.百度
                        }));
                        __线路.步骤说明.Add(过滤字符串(__说明));
                    }
                    var __最后一个节点 = __节点.XPathSelectElements("./steps/info").Last();
                    var __终点经度   = double.Parse(__最后一个节点.XPathSelectElement("./stepDestinationLocation/lng").Value);
                    var __终点纬度   = double.Parse(__最后一个节点.XPathSelectElement("./stepDestinationLocation/lat").Value);
                    __线路.点集合.Add(转换成谷歌坐标(new M经纬度(__终点经度, __终点纬度)
                    {
                        类型 = E坐标类型.百度
                    }));
                    __结果.Add(__线路);
                }
                __可能起点 = null;
                __可能终点 = null;
                return(__结果);
            }
            throw new NotImplementedException();
        }
示例#21
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));
        }
示例#22
0
        private static M经纬度 转换成谷歌坐标(M经纬度 __原经纬度)
        {
            M经纬度 __结果 = __原经纬度;

            if (__原经纬度.类型 == E坐标类型.百度)
            {
                __结果 = HGPS坐标转换.百度坐标转谷歌坐标(__原经纬度);
            }
            else if (__原经纬度.类型 == E坐标类型.设备)
            {
                __结果 = HGPS坐标转换.原始坐标转谷歌坐标(__原经纬度);
            }
            return(__结果);
        }
示例#23
0
        public static string 逆地址编码(M经纬度 __位置)
        {
            var __url = "http://api.map.baidu.com/geocoder/v2/?ak={0}&output=json&location={1},{2}&pois=0&coordtype={3}";
            var __坐标  = 转换成百度坐标(__位置);
            //目前支持的坐标类型包括:bd09ll(百度经纬度坐标)、gcj02ll(国测局经纬度坐标)、wgs84ll( GPS经纬度)
            var __返回值    = Web服务请求(string.Format(__url, _ak, __坐标.纬度, __坐标.经度, __位置.类型 == E坐标类型.百度 ? "bd09ll" : "wgs84ll"));
            var __JS序列化器 = new JavaScriptSerializer();
            var __结果     = __JS序列化器.Deserialize <M逆地址编码结果>(__返回值);

            if (__结果.status != 0)
            {
                return(null);
            }
            return(__结果.result.formatted_address);
        }
示例#24
0
        public static M经纬度 转原始坐标(M经纬度 __坐标)
        {
            switch (__坐标.类型)
            {
            case E坐标类型.设备:
                return(__坐标);

            case E坐标类型.谷歌:
                return(谷歌坐标转原始坐标(__坐标));

            case E坐标类型.百度:
                return(百度坐标转原始坐标(__坐标));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
示例#25
0
        public static M线路 查询驾车线路(M经纬度 __起点, M经纬度 __终点, string __起点城市, string __终点城市, E驾车路线选择策略 __策略, out List <M地址> __可能起点, out List <M地址> __可能终点)
        {
            __起点 = 转换成百度坐标(__起点);
            __终点 = 转换成百度坐标(__终点);
            string __url = "http://api.map.baidu.com/direction/v1?mode=driving&output=xml&ak={0}&origin={1}&destination={2}&origin_region={3}&destination_region={4}&tactics={5}";
            string __返回值 = "";

            __返回值 = Web服务请求(string.Format(__url, _ak, HttpUtility.UrlEncode(string.Format("{1},{0}", __起点.经度, __起点.纬度)), HttpUtility.UrlEncode(string.Format("{1},{0}", __终点.经度, __终点.纬度)), HttpUtility.UrlEncode(__起点城市), HttpUtility.UrlEncode(__终点城市), (int)__策略));

            var __XML文档  = XDocument.Load(new StringReader(__返回值));
            var __根节点    = __XML文档.Root;
            var __status = __根节点.XPathSelectElement("./status").Value;

            if (__status != "0")
            {
                throw new Exception(__根节点.XPathSelectElement("./message").Value);
            }
            var __type = __根节点.XPathSelectElement("./type").Value;

            if (__type == "2")
            {
                var __结果 = new M线路(string.Format("{0}->{1}", __起点, __终点));
                foreach (XElement __节点 in __根节点.XPathSelectElements("./result/routes/steps/content"))
                {
                    var __点  = __节点.Element("path").Value;
                    var __说明 = __节点.Element("instructions").Value;
                    __结果.点集合.Add(转换成谷歌坐标(new M经纬度(double.Parse(__点.Split(',')[0]), double.Parse(__点.Split(',')[1]))
                    {
                        类型 = E坐标类型.百度
                    }));
                    __结果.步骤说明.Add(过滤字符串(__说明));
                }
                __结果.距离 = int.Parse(__根节点.XPathSelectElement("./result/routes/distance").Value);
                var __备注 = new StringBuilder();
                __备注.AppendFormat("耗时: {0}分钟", (int.Parse(__根节点.XPathSelectElement("./result/routes/duration").Value)) / 60).AppendLine();
                __备注.AppendFormat("白天打车费用: {0}元", __根节点.XPathSelectElements("./result/taxi/detail/total_price").First().Value).AppendLine();
                __备注.AppendFormat("夜间打车费用: {0}元", __根节点.XPathSelectElements("./result/taxi/detail/total_price").Last().Value).AppendLine();
                __结果.备注 = __备注.ToString();
                __可能起点  = null;
                __可能终点  = null;
                return(__结果);
            }
            throw new NotImplementedException();
        }
示例#26
0
        /// <param name="__半径">单位:mi</param>
        /// <returns></returns>
        public static List <Tuple <M经纬度, string> > 区域检索(string __关键字, M经纬度 __圆心, int __半径)
        {
            __圆心  = 转换成百度坐标(__圆心);
            __关键字 = __关键字.Replace(" ", "$");
            string __url    = "http://api.map.baidu.com/place/v2/search?&output=json&ak={0}&q={1}&location={2},{3}&radius={4}";
            string __返回值    = Web服务请求(string.Format(__url, _ak, HttpUtility.UrlEncode(__关键字), __圆心.纬度, __圆心.经度, __半径));
            var    __JS序列化器 = new JavaScriptSerializer();
            var    __结果     = __JS序列化器.Deserialize <M区域检索结果>(__返回值);

            if (__结果.status != 0)
            {
                throw new Exception(__结果.message);
            }
            return(__结果.results.Select(q => new Tuple <M经纬度, string>(转换成谷歌坐标(new M经纬度(q.location.lng, q.location.lat)
            {
                类型 = E坐标类型.百度
            }),
                                                                     string.Format("{0}\n\r{1}\n\r{2}", q.name, q.address, q.telephone))).ToList());
        }
示例#27
0
        private UInt64 添加点(GMapOverlay __图层, M经纬度 __点, Image __图片, string __标题 = null, bool __允许交互 = true, object __绑定对象 = null, E标题显示方式 __标题显示方式 = E标题显示方式.OnMouseOver, bool __图标偏移 = true)
        {
            var __GPS = GPS转换(__点);
            //GMapMarker __图标 = new GMarkerGoogle(__GPS, GMarkerGoogleType.blue_small);
            GMapMarker __图标 = new GMarkerGoogle(__GPS, __图片);

            __图标.ToolTipText = __标题;
            __图标.ToolTipMode = (MarkerTooltipMode)(int)__标题显示方式;
            __图标.Tag         = __绑定对象;
            if (__图标偏移)
            {
                __图标.Offset = new Point(-__图片.Width / 2 + 1, -__图片.Height + 1);
            }
            __图标.IsHitTestVisible = __允许交互;
            __图层.Markers.Add(__图标);
            var __标识 = _所有覆盖物[__图层].标识++;

            _所有覆盖物[__图层].点集[__标识] = __图标;
            return(__标识);
        }
示例#28
0
        public UInt64 添加圆(M经纬度 __圆心, int __半径, Pen __边框画笔, Brush __填充笔刷, bool __允许交互, object __绑定对象 = null, string __图层名称 = null)
        {
            if (this.InvokeRequired)
            {
                var __信号量 = this.BeginInvoke(new Func <M经纬度, int, Pen, Brush, bool, object, string, UInt64>(添加圆), __圆心, __半径, __边框画笔, __填充笔刷, __允许交互, __绑定对象, __图层名称);
                __信号量.AsyncWaitHandle.WaitOne();
                return((UInt64)this.EndInvoke(__信号量));
            }
            var __图层   = 获取图层(__图层名称);
            var __覆盖范围 = new GMapMarkerCircle(GPS转换(__圆心), __边框画笔, __填充笔刷, __允许交互)
            {
                Radius = __半径, IsFilled = __填充笔刷 != null
            };

            __图层.Markers.Add(__覆盖范围);
            var __标识 = _所有覆盖物[__图层].标识++;

            _所有覆盖物[__图层].点集[__标识] = __覆盖范围;
            return(__标识);
        }
示例#29
0
        public static bool 判断点在矩形内(M经纬度 点, List <M经纬度> 多边形)
        {
            if (多边形.Any(q => q.类型 != 点.类型))
            {
                多边形 = 多边形.Select(HGPS坐标转换.转原始坐标).ToList();
            }

            double __最小经度 = 180;
            double __最大经度 = -180;
            double __最小纬度 = 90;
            double __最大纬度 = -90;

            多边形.ForEach(q =>
            {
                __最小经度 = Math.Min(__最小经度, q.经度);
                __最大经度 = Math.Max(__最大经度, q.经度);
                __最小纬度 = Math.Min(__最小纬度, q.纬度);
                __最大纬度 = Math.Max(__最大纬度, q.纬度);
            });
            return(点.经度 >= __最小经度 && 点.经度 <= __最大经度 && 点.纬度 >= __最小纬度 && 点.纬度 <= __最大纬度);
        }
示例#30
0
        private PointLatLng GPS转换(M经纬度 __GPS, bool __纠偏 = true)
        {
            double __标准经度 = __GPS.经度;
            double __标准纬度 = __GPS.纬度;

            if (__纠偏 && __GPS.类型 == E坐标类型.设备)
            {
                if (当前地图源 == E地图源.谷歌2D图 || 当前地图源 == E地图源.谷歌混合图)
                {
                    //double __谷歌坐标经度;
                    //double __谷歌坐标纬度;
                    //HGPS坐标转换.原始坐标转谷歌坐标(__标准纬度, __标准经度, out __谷歌坐标纬度, out __谷歌坐标经度);
                    //return new PointLatLng(__谷歌坐标纬度, __谷歌坐标经度);
                    return(H坐标转换.gps84_To_Gcj02(__标准纬度, __标准经度));
                }
                if (当前地图源 == E地图源.百度2D图 || 当前地图源 == E地图源.百度混合图)
                {
                    return(H坐标转换.gps84_To_Bd09(__标准纬度, __标准经度));
                }
            }
            return(new PointLatLng(__标准纬度, __标准经度));
        }