百度开发者API接口:获取经纬度和详细地理位置(Geocoding API和IP定位API)

C#(Csharp)之“百度开发者”API接口:获取经纬度和详细地理位置

对于实现获取经纬度的前提条件:

在获取经纬度和地理位置的时候都需要有一个唯一标识。来定位实现。而这里距离用公网IP来获取经纬度。
如何获取公网IP地址呢?这里我写了一篇博文:如何获取公网IP(代码直接可以用)

百度开发者API两个接口:

普通IP定位API Web服务API

Geocoding API Web服务API


对于获取经纬度的方法:

对于获取经纬度的方法很多种,如百度,谷歌平台上都有提供类似的接口,我这里实现过百度普通IP定位接口。
在这里先明确说一下:普通IP定位 API是一个根据IP返回对应大致位置信息的HTTP/HTTPS形式位置服务接口,支持多种语言调用,如C# 、C++、Java等,即通过发送HTTP/HTTPS请求,返回JSON格式的位置数据(包括经纬度信息、地址信息等)。

第一:获取的经纬度只是大致位置,在之前有高精准的IP现在被封了。在网上搜索过很多,大部分都如此了。如果需要高精准的接口,需要去购买。

第二:其他网址的接口获取数据的方式大部分都是使用JSON格式。代码大同小异。所以我专门写了一篇Json类的博文Json序列化之.NET开源类库Newtonsoft.Json的研究。这个类很实用,是一个完全独立的文本格式。有自己的数据结构,不是属于任何编程语言,完全独立的存在。

下面是实现经纬度代码实现过程,亲测可用。(C#)
        /// <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;
        }

json的数据结构类:
    //添加序列化特性
    #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 = 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

在上面的代码中获取到的经纬度,在使用百度开发者另外一个接口Geocoding API获取具体地理位置。
        /// <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()); }
        } 
由于经纬度只是大概方位,没办法精准到详细地理位置。不过上面的代码其他部分没问题。只要找到精准经纬度套用上面的代码即可以使用。

互相共勉:

装载请说明出处,如有更好的建议可以留言。互相共勉。

猜你喜欢

转载自blog.csdn.net/qq_23833037/article/details/76775217