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坐标转换.百度坐标转谷歌坐标(__百度坐标)); }
/// <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; }
/// <param name="半径">单位:米</param> public static bool 判断点在圆形内(M经纬度 点, M经纬度 圆心, int 半径) { if (点.类型 != 圆心.类型) { 点 = HGPS坐标转换.转原始坐标(点); 圆心 = HGPS坐标转换.转原始坐标(圆心); } var __间距 = 测量两点间间距(点, 圆心); return(__间距 <= 半径); }
/// <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)); }
private static M经纬度 转换成谷歌坐标(M经纬度 __原经纬度) { M经纬度 __结果 = __原经纬度; if (__原经纬度.类型 == E坐标类型.百度) { __结果 = HGPS坐标转换.百度坐标转谷歌坐标(__原经纬度); } else if (__原经纬度.类型 == E坐标类型.设备) { __结果 = HGPS坐标转换.原始坐标转谷歌坐标(__原经纬度); } return(__结果); }
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())); } } }