国际经纬度坐标标准为WGS-84,国内要求必须至少使用国测局制定的GCJ- 02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施。百度对外接口的坐标系并不是GPS采集的真实经 纬度,需要通过坐标转换接口进行转换。
所以在进行百度地图开发时,如果我们手上的数据是GPS数据的话,需要进行坐标转换,转换方法如下:
URL: http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=longitude&y=latitude
其中:
from: 来源坐标系 (0表示原始GPS坐标,2表示Google坐标)
to: 转换后的坐标 (4就是百度坐标)
x: GPS经度
y: GPS纬度
返回的结果是一个json字符串:
{"error":0,"x":"MTIwLjAxMTYxNjkwMTA0","y":"MzYuMDA2NDI2NDI0Mzc1"}
其中:
error:是结果是否出错,"0"表示OK
x: 百度坐标系的经度(Base64加密)
y: 百度坐标系的纬度(Base64加密)
下面上代码:
public static double[] getBaiducoor(double[] coord)//坐标转换的方法
{
double longitude = coord[0];
double latitude = coord[1];
//需要转的gps经纬度
string convertUrl = "http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=" + longitude + "&y=" + latitude + "";
HttpWebRequest request = (HttpWebRequest)System.Net.HttpWebRequest.Create(convertUrl);//创建http请求
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
string responseTxt = sr.ReadToEnd();
sr.Close();
sr.Dispose();
CoorConvert mapconvert = new CoorConvert();//创建存放结果的对象
mapconvert = JsonConvert.DeserializeObject<CoorConvert>(responseTxt);//赋值
string lon = mapconvert.x;
string lat = mapconvert.y;
byte[] xBuffer = Convert.FromBase64String(lon);//坐标base64解密
string strX = Encoding.UTF8.GetString(xBuffer, 0, xBuffer.Length);
byte[] yBuffer = Convert.FromBase64String(lat);
string strY = Encoding.UTF8.GetString(yBuffer, 0, xBuffer.Length);
double[] coor = new double[2];
coor[0] = Convert.ToDouble(strX);
coor[1] = Convert.ToDouble(strY);
return coor;
}
//创建一个对象存储结果
public class CoorConvert
{
public string error { get; set; }
public string x { get; set; }
public string y { get; set; }
}
需要添加Newtonsoft.Json引用解析返回的json结果字符串,此方法输入的参数是存储经纬度的double数组,返回结果也是double数组。