接到这个需求,查了下如何实现,基本都是说在js调百度地图api转换,代码贴上:
//坐标转地址——暂时不用
function getAddress(pos) {
var pos_list = pos.split(',');
var lng = pos_list[0];
var lat = pos_list[1];
//通过baiduMap API获取街道名称
var address;
var point = new BMap.Point(pos_list[0], pos_list[1]);
var gc = new BMap.Geocoder();
gc.getLocation(point, function (rs) {
var addComp = rs.addressComponents;
address = addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber;
});
console.log(address);>>调试多次这里都是underfined
return address;
}
多次调试后我发现getLocation 是回调函数,可能是异步的,无法在函数里面对address这个全局变量(相对于getLocation 来说)赋值。
也尝试过把return address 放进 getLocation里面执行;在其他方法调用 getAddress 依然无法返回我需要的地址;
思考过后还是决定把转换坐标放到后台实现了,C#代码如下:
[HttpPost]
public string GetAddress(string lng, string lat)
{
try
{
string url = @"http://api.map.baidu.com/geocoder/v2/?ak=rc7mMwPKSfgGa2qSdFf8kxcMYhQPd3AC&callback=renderReverse&location=" + lat + "," + lng + @"&output=xml&pois=1";
WebRequest request = WebRequest.Create(url);
request.Method = "POST";
XmlDocument xmlDoc = new XmlDocument();
string sendData = xmlDoc.InnerXml;
byte[] byteArray = Encoding.Default.GetBytes(sendData);
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.GetEncoding("utf-8"));
string responseXml = reader.ReadToEnd();
XmlDocument xml = new XmlDocument();
xml.LoadXml(responseXml);
string status = xml.DocumentElement.SelectSingleNode("status").InnerText;
if (status == "0")
{
XmlNodeList nodes = xml.DocumentElement.GetElementsByTagName("formatted_address");
if (nodes.Count > 0)
{
return nodes[0].InnerText;
}
else
return "未获取到位置信息,错误码3";
}
else
{
return "未获取到位置信息,错误码1";
}
}
catch (System.Exception ex)
{
return "未获取到位置信息,错误码2";
}
}
前台用post请求调用:
//坐标转地址——暂时不用
function getAddress(pos) {
//调后台转换
var pos_list = pos.split(',');
var lng = pos_list[0];
var lat = pos_list[1];
var address;
$.ajaxSettings.async = false;
$.post('/YCYSJL/GetAddress',{lng:lng,lat:lat}, function (data) {
address = data;
})
console.log(address);>>出现数据
return address;
};
最后上效果图:
ps:如果发现我上述有问题或者有改进方案,希望不吝赐教。