您的位置:首页 > Web前端 > JavaScript

百度开发者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地址 JET c# json 百度API