百度开发者API接口:获取经纬度和详细地理位置(Geocoding API和IP定位API)
2017-08-06 16:37
931 查看
C#(Csharp)之“百度开发者”API接口:获取经纬度和详细地理位置
对于实现获取经纬度的前提条件:
[align=left]在获取经纬度和地理位置的时候都需要有一个唯一标识。来定位实现。而这里距离用公网IP来获取经纬度。[/align][align=left]如何获取公网IP地址呢?这里我写了一篇博文:如何获取公网IP(代码直接可以用)[/align]
[align=left]
[/align]
百度开发者API两个接口:
普通IP定位API Web服务API
Geocoding API Web服务API
对于获取经纬度的方法:
[align=left]百度开发者网址[/align][align=left]对于获取经纬度的方法很多种,如百度,谷歌平台上都有提供类似的接口,我这里实现过百度普通IP定位接口。[/align]
[align=left]在这里先明确说一下:普通IP定位 API是一个根据IP返回对应大致位置信息的HTTP/HTTPS形式位置服务接口,支持多种语言调用,如C# 、C++、Java等,即通过发送HTTP/HTTPS请求,返回JSON格式的位置数据(包括经纬度信息、地址信息等)。[/align]
[align=left]
[/align]
[align=left]第一:获取的经纬度只是大致位置,在之前有高精准的IP现在被封了。在网上搜索过很多,大部分都如此了。如果需要高精准的接口,需要去购买。[/align]
[align=left]
[/align]
[align=left]第二:其他网址的接口获取数据的方式大部分都是使用JSON格式。代码大同小异。所以我专门写了一篇Json类的博文Json序列化之.NET开源类库Newtonsoft.Json的研究。这个类很实用,是一个完全独立的文本格式。有自己的数据结构,不是属于任何编程语言,完全独立的存在。[/align]
[align=left]
[/align]
[align=left]下面是实现经纬度代码实现过程,亲测可用。(C#)[/align]
/// <summary> /// 百度IP定位接口—经纬度 /// </summary> /// <param name="IP"></param> /// <returns></returns> public static baiduAPI GetDetailAddressByBaiduAPI(string IP) { HttpWebRequest req; HttpWebResponse res; string url = string.Format(@"https://api.map.baidu.com/location/ip?ak=钥匙&ip={0}&coor=bd09mc", IP); try { req = (HttpWebRequest)HttpWebRequest.Create(url); res = (HttpWebResponse)req.GetResponse(); using (Stream s = res.GetResponseStream()) { using (StreamReader sr = new StreamReader(s, Encoding.UTF8)) { string Data = sr.ReadToEnd(); //应对json.NET使用序列化和反序列化。 //提供之间的转换方法。网络类型和JSON类型。 //反序列化对象的JSON字符串。 baiduAPI con = Newtonsoft.Json.JsonConvert.DeserializeObject<baiduAPI>(Data); Console.WriteLine("地址 == " + con.address); Console.WriteLine("纬度 == " + (LAT = con.content.point.x)); Console.WriteLine("经度 == " + (LNG = con.content.point.y)); Console.WriteLine("省分==" + con.content.address_detail.province); Console.WriteLine("城市==" + con.content.address_detail.city); Console.WriteLine("城市代码==" + con.content.address_detail.city); Console.WriteLine("区县==" + con.content.address_detail.city_code); Console.WriteLine("街道==" + con.content.address_detail.street); Console.WriteLine("街号==" + con.content.address_detail.street_number); return con; } } } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); } return null; }
[align=left]json的数据结构类:[/align]
//添加序列化特性 #region 返回json格式的数据 /// <summary> /// 详细地址 /// </summary> public class DetailAddress { private DetailContent _content = new DetailContent(); /// <summary> /// 内容 /// </summary> public DetailContent Content { get { return _content; } set { _content = value; } } private DetailResult _result = new DetailResult(); /// <summary> /// 结果 /// </summary> public DetailResult Result { get { return _result; } set { _result = value; } } } /// <summary> /// 经纬度 /// </summary> public class DetialLocation { private string _lat; /// <summary> /// 纬度 /// </summary> public string lat { get { return _lat; } set { _lat = value; } } private string _lng; /// <summary> /// 经度 /// </summary> public string lng { get { return _lng; } set { _lng = value; } } } /// <summary> /// 详细内容 /// </summary> public class DetailContent { private DetialLocation _location = new DetialLocation(); /// <summary> /// 经纬度 /// </summary> public DetialLocation Location { get { return _location; } set { _location = value; } } private string _locid; /// <summary> /// 定位结果唯一ID,用于问题排查 /// </summary> public string Locid { get { return _locid; } set { _locid = value; } } private string _radius; /// <summary> /// 定位结果半径 /// </summary> public string Radius { get { return _radius; } set { _radius 4000 = value; } } private string _confidence; /// <summary> /// 定位结果可信度 /// </summary> public string Confidence { get { return _confidence; } set { _confidence = value; } } private DetailAddress_component _component = new DetailAddress_component(); /// <summary> /// 地理位置 /// </summary> public DetailAddress_component Component { get { return _component; } set { _component = value; } } private string _formatted_address; /// <summary> /// 结构化地址信息 /// </summary> public string Formatted_address { get { return _formatted_address; } set { _formatted_address = value; } } } /// <summary> /// 详细地理位置 /// </summary> public class DetailAddress_component { private string _country; /// <summary> /// 国家 /// </summary> public string Country { get { return _country; } set { _country = value; } } private string _province; /// <summary> /// 省份 /// </summary> public string Province { get { return _province; } set { _province = value; } } private string _city; /// <summary> /// 城市 /// </summary> public string City { get { return _city; } set { _city = value; } } private string _street = ""; /// <summary> /// 街道 /// </summary> public string street { get { return _street; } set { _street = value; } } private string _street_number; /// <summary> /// 街号 /// </summary> public string street_Number { get { return _street_number; } set { _street_number = value; } } private string _admin_area_code; /// <summary> /// 行政区代码 /// </summary> public string Admin_Area_Code { get { return _admin_area_code; } set { _admin_area_code = value; } } } /// <summary> ///详细结果 /// </summary> public class DetailResult { private string _error; /// <summary> /// 误差 /// </summary> public string Error { get { return _error; } set { _error = value; } } private string _loc_time; /// <summary> /// 定位时间 /// </summary> public string Loc_time { get { return _loc_time; } set { _loc_time = value; } } } #endregion #region 返回json格式的数据类 /// <summary> /// 入口 /// </summary> public class baiduAPI { /// <summary> /// 地址 /// </summary> public string address { get; set; } /// <summary> /// 详细地址信息接口 /// </summary> public Ress content { get; set; } } /// <summary> /// 详细地址信息接口 /// </summary> public class Ress { /// <summary> /// 详细地址 /// </summary> public detaaddress address_detail { get; set; } /// <summary> /// 经纬度 /// </summary> public loca point { get; set; } } /// <summary> /// 经纬度 /// </summary> public class loca { /// <summary> /// 纬度 /// </summary> public string x { get; set; } /// <summary> /// 经度 /// </summary> public string y { get; set; } } /// <summary> /// 详细地址 /// </summary> public class detaaddress { public string address;//简要地址 /// <summary> /// 城市 /// </summary> public string city { get; set; } /// <summary> /// 城市代码 /// </summary> public string city_code { get; set; } /// <summary> /// 区县 /// </summary> public string district { get; set; } /// <summary> /// 省份 /// </summary> public string province { get; set; } /// <summary> /// 街道 /// </summary> public string street { get; set; } /// <summary> /// 门址 /// </summary> public string street_number { get; set; } }
通过经纬度获取到详细的地理位置Geocoding API
[align=left]在上面的代码中获取到的经纬度,在使用百度开发者另外一个接口Geocoding API获取具体地理位置。[/align]/// <summary> /// 百度地理位置定位接口 --Geocoding API获取具体地理位置 /// </summary> /// <param name="lat">纬度</param> /// <param name="lng">经度</param> public static void GetBaiDuGeographicalAddressAPI(string lat, string lng) { try { WebClient webclient = new WebClient(); webclient.Encoding = Encoding.UTF8;//设置下载和上载的文本格式 string uri = String.Format(@"http://api.map.baidu.com/geocoder/v2/?coordtype=bd09mc&callback=renderReverse&location={0},{1}&output=json&ak=钥匙", lat, lng); JObject jobect = JObject.Parse(webclient.DownloadString(uri).ToString().Replace("renderReverse&&renderReverse(", "").Replace(")", "")); Console.WriteLine("具体位置:" + jobect["result"]["formatted_address"].ToString()); Console.WriteLine("纬度:" + jobect["result"]["location"]["lat"].ToString()); Console.WriteLine("经度:" + jobect["result"]["location"]["lng"].ToString()); Console.WriteLine(jobect["status"].ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); } }
[align=left]由于经纬度只是大概方位,没办法精准到详细地理位置。不过上面的代码其他部分没问题。只要找到精准经纬度套用上面的代码即可以使用。[/align]
互相共勉:
装载请说明出处,如有更好的建议可以留言。互相共勉。[align=left]
[/align]
相关文章推荐
- 通过百度普通IP定位API获取IP的地理位置
- java根据ip地质调用百度定位api服务获取地理位置示例
- java根据ip地质调用百度定位api服务获取地理位置示例
- C#使用百度API通过IP获取地理位置和坐标
- 利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
- 利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
- HTML5获取地理经纬度并通过百度接口得到实时位置
- 百度api获取经纬度及详细位置
- java调用百度定位api服务获取地理位置示例
- 使用html5定位经纬度然后用百度api获取城市等位置信息
- 用户Ip地址和百度地图api接口获取用户地理位置(经纬度坐标,城市)
- Android Google Maps API 网络服务用于网络定位、计算路线、获取经纬度、获取详细地址等
- iOS中利用系统地图获取定位信息(经纬度/地理位置)
- 百度Android定位SDK实现获取当前经纬度及位置
- PHP获取用户真实 IP , 淘宝IP接口获得ip地理位置
- html5地理位置定位API接口开发
- PHP获取用户真实 IP , 淘宝IP接口获得ip地理位置
- 使用百度api根据ip获取位置
- PHP获取用户真实 IP , 淘宝IP接口获得ip地理位置