在做一个社区项目中,支持移动浏览器进行选择地区和社区,由于地区很多,想在默认的情况下定位手机用户的城市,
方便用户进行配置自己喜欢的社区。
1.选择一个地图服务接口:
Google一下,发现百度提供这样的一个接口:Geocoding API .个人推荐百度,因为Google不知道那天就不能调用了。
首先,要借用别人的服务,通过别人的服务接口获取自己想要的数据。Geocoding API 是百度提供的服务接口,主要是用于提供从地址解析到经纬度坐标或者从经纬度坐标解析到地址的转换服务。
供程序员调用的、http形式的地图服务接口。主要服务那些非网页程序的调用。例如C# 、C++、Java等开发语言都能发送http请求且能接收返回数据。
用户只需在请求的url字串中拼接好关键字或者经纬度信息,即可获取到相应的百度经纬度或者结构化地理信息。
Geocoding API有哪些功能?
Geocoding API包括地址解析和逆地址解析功能。
地址解析是指,由详细到街道的结构化地址得到百度经纬度信息,且支持名胜古迹、标志性建筑名称直接解析返回百度经纬度。例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.31985,lat:39.959836”,“百度大厦”地址解析的结果是“lng:116.30815,lat:40.056885”
逆地址解析是指,由百度经纬度信息得到结构化地址信息。例如:“lat:31.325152,lng:120.558957”逆地址解析的结果是“江苏省苏州市虎丘区塔园路318号”。
注意:
1).因为Geocoding和反Geocoding使用的门址数据以及算法都不是一样的,所以会出现不能一一对应的现象。
2).解析过程中可能会出现一对坐标值对应多个地址门牌信息,本接口将返回距离坐标点最近的一个地址门牌信息。
2.Html5支持获取用户地理位置信息:
html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置。 window.navigator.geolocation提供了3个方法分别是: void getCurrentPosition(onSuccess,onError,options);//获取用户当前位置
支持参数://options可以不写,为默认即可 options = { enableHighAccuracy,//boolean 是否要求高精度的地理信息 timeout,//获取信息的超时限制 maximumAge//对地理信息进行缓存的时间 }
|
Html 5 geolocation 实例代码如下:
$(document).bind("pageinit", function (event, data) { getLocation(); }); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( showPosition,//成功回调函数 getPositionError,//失败回调函数 {//options参数配置 enableHighAccuracy:true,//boolean 是否要求高精度的地理信息 timeout:2000, maximumAge:36000 } ); } else { //不支持,就拉倒吧。 } } 失败回调函数: function getPositionError(error){ switch(error.code){ case error.TIMEOUT: // alert("连接超时,请重试"); break; case error.PERMISSION_DENIED: //alert("您拒绝了使用位置共享服务,查询已取消"); break; case error.POSITION_UNAVAILABLE: //alert("亲爱的火星网友,非常抱歉,我们暂时无法为您所在的星球提供位置服务"); break; } } 成功回调函数: function showPosition(position) { //内容在下面说。 } |
成功返回的结果说明position:
当成功获取地理位置信息时候,onsuccess方法中会返回position对象,通过这个对象可以获取地理位置的相关信息,包括:
position对象的属性:
latitude,//纬度
longitude,//经度
altitude,//海拔高度
accuracy,//获取纬度或者经度的精度
altitudeAccurancy,//海拔高度的精度
heading,//设备前景方向。正北方向的顺时针旋转角
speed,//设备的前进速度 m/s
timestamp,//获取地理位置信息时候的时间
3.封装对百度Geocoding API的调用
下面是百度给的例子。
根据坐标获取它的地址 http://api.map.baidu.com/geocoder?output=json&location=39.983424,%20116.322987&key=37492c0ee6f924cb5e934fa08c6b1676 //解析“lat:39.983424, lng:116.322987”坐标返回“北京市海淀区中关村大街27号1101-08室”,以json格式输出 http://api.map.baidu.com/geocoder?output=xml&location=39.983424,%20116.322987&key=37492c0ee6f924cb5e934fa08c6b1676 //解析“lat:39.983424, lng:116.322987”坐标返回“北京市海淀区中关村大街27号1101-08室”,以xml格式输出 |
我一直想用jquery 的$.getJson方式调用,但是一直不成功。肯定是跨域的问题了,尝试了几次都不成功就换了个思路。
用asp.net做个中介吧,通过后台C#实现api的数据读取和分析,再传给前台。效率上差别不是很大,但是心里还有点郁闷。
下面是具体实现了。
1)、为了方便解析百度返回的json结果,我使用了开源代码: Newtonsoft.Json。大家可以到这里看看 Json.NET http://json.codeplex.com/。
很好用的。解析和烦解析json,可以object to json,也可以反转。
2)、对照百度返回的json结果,我建了一个直接对应的类。
{ "status":"OK", "result":{ "location":{ "lng":116.322987, "lat":39.983424 }, "formatted_address":"北京市海淀区中关村大街27号1101-08室", "business":"人民大学,中关村,苏州街", "addressComponent":{ "city":"北京市", "district":"海淀区", "province":"北京市", "street":"中关村大街", "street_number":"27号1101-08室" }, "cityCode":131 } } |
我的类:
public class JsonCity { public JsonCity() {
} public string status { get; set; } public Result result { get; set; }
} public class Result { public Location location { get; set; } public string formatted_address { get; set; } public AddressComponent addressComponent { get; set; }
} public class Location { public string lng { get; set; } public string lat { get; set; } } public class AddressComponent { public string city { get; set; } public string district { get; set; } public string province { get; set; } public string street { get; set; } public string street_number{ get; set; }
} |
3)、WebClient 调用百度Api接口,并解析
private string GetCityinfo() { WebClient client = new WebClient();//webclient客户端对象 string url = "http://api.map.baidu.com/geocoder?location=" + Jwd + "&output=json&key=c1889c461489a390c023d7e51f23af04"; string cityname = ""; client.Encoding = Encoding.UTF8;//编码格式 string responseTest = client.DownloadString(url);//下载xml响应数据 JsonCity jsonCity = (JsonCity)Newtonsoft.Json.JsonConvert.DeserializeObject(responseTest, typeof(JsonCity)); cityname = jsonCity.result.addressComponent.city; return cityname; } |
4)、在前端中用js调用我写的这个asp.net页面的方法,实现数据的返回。
function showPosition(position) { var lat = position.coords.latitude; var lng = position.coords.longitude;
var AjaxUrl = "Data/City.aspx?tp=4&Jwd=" + lat+"," +lng; $.ajax({ type: "get", url: AjaxUrl, success: function (data, textStatus) { //成功显示结果。 if (data != null) { alert(data) } }, complete: function (XMLHttpRequest, textStatus) {
//HideLoading(); }, error: function (e) {
} }); } |
好了,终于是大功告成了。