失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 百度地图开发工具类 包括计算坐标距离 坐标转换

百度地图开发工具类 包括计算坐标距离 坐标转换

时间:2020-04-30 13:39:50

相关推荐

百度地图开发工具类 包括计算坐标距离 坐标转换

using Newtonsoft.Json;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using ;

using System.Text;

using System.Web;

namespace BaiDuMapDemo.Models

{

public class Message

{

/// <summary>

/// 返回最新的排序后的信息

/// </summary>

/// <param name="datas">已经计算距离当前位置长度,但是未排序的信息</param>

/// <returns></returns>

public string SortText(string datas)

{

datas = datas.Replace("\\", "");

var ss = JsonConvert.DeserializeObject(datas);

List<NetModel> list = JsonConvert.DeserializeObject<List<NetModel>>(ss.ToString());

list = list.OrderBy(p => Convert.ToDouble(p.longs)).ToList();

string returnText = JsonConvert.SerializeObject(list);

return returnText;

}

/// <summary>

/// 微信坐标和数据库坐标比较距离,具体的操作方法

/// </summary>

/// <param name="lng"></param>

/// <param name="lat"></param>

/// <param name="lng1"></param>

/// <param name="lng2"></param>

/// <returns>dictionary中key为多少条数据,value为包含id,name,longs 的json数据</returns>

public Dictionary<int,string> HowLongToMe(double lng, double lat)

{

TestBaiduMapEntities Entities = new TestBaiduMapEntities();

List<Location> list = Entities.Location.Where(p => p.id > 1).ToList(); //数据库中Location表所有的数据

//将微信坐标转换为百度坐标

Dictionary<double, double> dic = ConvertToBaidu(lng, lat);

var retText = "[";

foreach(var item in list)

{

string howLong=CacleLong(dic.First().Key,dic.First().Value,item.Lng,item.Lat).ToString(); //计算出距离

retText += "{\"id\":\"" + item.id + "\",\"name\":\"" + item.Name + "\",\"longs\":\"" + howLong + "\"},";

}

retText += "]";

retText = retText.Replace(",]", "]");

var ss = JsonConvert.DeserializeObject(retText);

List<NetModel> listReturn = JsonConvert.DeserializeObject<List<NetModel>>(ss.ToString());

listReturn = listReturn.OrderBy(p => Convert.ToDouble(p.longs)).ToList();

string returnText = JsonConvert.SerializeObject(listReturn); //返回参数 returnText,即是dictionary中的string;

Dictionary<int, string> returnDic = new Dictionary<int, string>();

returnDic.Add(list.Count, returnText);

return returnDic;

}

/// <summary>

/// 将微信坐标转换为百度坐标

/// </summary>

/// <param name="lng"></param>

/// <param name="lat"></param>

/// <returns>百度坐标,key表示经度,value表示纬度</returns>

public Dictionary<double, double> ConvertToBaidu(double lng, double lat)

{

Dictionary<double, double> dic = new Dictionary<double, double>();

//转换前的GPS坐标

double x = 116.397428;

double y = 39.90923;

//google 坐标转百度链接 //http://api./ag/coord/convert?from=2&to=4&x=116.32715863448607&y=39.990912172420714&callback=BMap.Convertor.cbk_3694

//gps坐标的type=0

//google坐标的type=2

//baidu坐标的type=4

String path = "http://api./ag/coord/convert?from=0&to=4&x=" + x + "+&y=" + y + "&callback=BMap.Convertor.cbk_7594";

string res = SendDataByGET(path);

if (res.IndexOf("(") > 0 && res.IndexOf(")") > 0)

{

int sint = res.IndexOf("(") + 1;

int eint = res.IndexOf(")");

int ls = res.Length;

String str = res.Substring(sint, eint - sint);

int errint = res.IndexOf("error") + 7;

int enderr = res.IndexOf("error") + 8;

String err = res.Substring(errint, 1);

if ("0".Equals(err))

{

int sx = str.IndexOf(",\"x\":\"") + 6;

int sy = str.IndexOf("\",\"y\":\"");

int endy = str.IndexOf("\"}");

int sl = str.Length;

string xp = str.Substring(sx, sy - sx);

string yp = str.Substring(sy + 7, endy - sy - 7);

byte[] outputb = Convert.FromBase64String(xp);

string XStr = Encoding.Default.GetString(outputb);

outputb = Convert.FromBase64String(yp);

string YStr = Encoding.Default.GetString(outputb);

dic.Add(Convert.ToDouble(XStr), Convert.ToDouble(YStr));

}

}

return dic;

}

/// 通过GET方式发送数据

/// url

/// GET数据

/// GET容器

public string SendDataByGET(string Url)

{

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);

request.Method = "GET";

request.ContentType = "text/html;charset=UTF-8";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream myResponseStream = response.GetResponseStream();

StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));

string retString = myStreamReader.ReadToEnd();

myStreamReader.Close();

myResponseStream.Close();

return retString;

}

/// <summary>

/// 计算两个百度坐标的距离

/// </summary>

/// <param name="lng_a">当前位置的经度</param>

/// <param name="lat_a">当前位置的纬度</param>

/// <param name="lng_b">目标点的经度</param>

/// <param name="lat_b">目标点的纬度</param>

/// <returns></returns>

public double CacleLong(double lng_a, double lat_a, double lng_b, double lat_b)

{

double pk = 180 / 3.14169;

double a1 = lat_a / pk;

double a2 = lng_a / pk;

double b1 = lat_b / pk;

double b2 = lng_b / pk;

double t1 = Math.Cos(a1) * Math.Cos(a2) * Math.Cos(b1) * Math.Cos(b2);

double t2 = Math.Cos(a1) * Math.Sin(a2) * Math.Cos(b1) * Math.Sin(b2);

double t3 = Math.Sin(a1) * Math.Sin(b1);

double tt = Math.Acos(t1 + t2 + t3);

return 6366000 * tt;

}

}

public class NetModel

{

public int id { get; set; }

public string name { get; set; }

public string longs { get; set; }

}

}

数据库设计

id int Unchecked

Name nvarchar(500) Unchecked

Lng floatUnchecked

Lat float Unchecked

SerachText nvarchar(500) Checked

如果觉得《百度地图开发工具类 包括计算坐标距离 坐标转换》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。