C# 调用百度地图Web服务API

最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Direction API ,最后写了个服务去定时采集。

关于 Direction API 的相关说明这里不做详细阐述了,大家可以去百度地图 API 的页面去详细了解,地址:http://developer.baidu.com/map/direction-api.htm

一、准备工作

1、首先要去申请一个密钥,地址:http://lbsyun.baidu.com/apiconsole/key?application=key

C# 调用百度地图Web服务API

根据自己的需求选择相应的功能,需要注意的是如果请求校验方式选择了sn校验方式的话,在请求 Api 地址的时候需要传入sn参数

如下图所示:

C# 调用百度地图Web服务API 

2、下表是请求接口参数

 

参数 是否必须 格式举例 参数含义
origin 必选 名称:百度大厦
              坐标格式为:lat<纬度>,lng<经度>
              名称+经纬度:百度大厦|40.056878,116.30815
起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。
destination 必选 名称:*
              经纬度:39.915285, 116.403857
  坐标格式为:lat<纬度>,lng<经度>
              名称+经纬度:百度大厦|40.056878,116.30815
起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。
mode 选填,默认为driving driving(驾车模式) 导航模式,包括:driving(驾车)、walking(步行)、transit(公交)
region 必填 北京 公交、步行导航时该参数必填。
origin_region 必填 北京 起始点所在城市,驾车导航时必填。
destination_region 必填 北京 终点所在城市,驾车导航时必填。
output 选填,默认为xml json 表示输出类型,可设置为xml或json,默认为xml。
coord_type 选填,默认为bd09ll gcj02(国测局坐标,如google,soso地图均采用该坐标) 坐标类型,可选参数,默认为bd09ll。允许的值为:bd09ll(百度经纬度坐标)、bd09mc(百度摩卡托坐标)、gcj02(国测局加密坐标)、wgs84(gps设备获取的坐标)。
waypoints 选填 奎科科技大厦|西单 途经点集合,包括一个或多个用竖线字符 "|" 分隔的地址名称或经纬度。
tactics 选填 11 导航策略。导航路线类型,10,不走高速;11、最少时间;12、最短路径。
ak 必填 E4805d16520de693a3fe707cdc962045 用户的访问权限
sn 选填   用户的权限签名
timestamp sn存在时必填   时间戳,与sn配合使用。

3、通过 GET 请求采集 API 数据

请求 API 的方法:

C# 调用百度地图Web服务API
 1         /// <summary>
 2         /// 发送 API 请求并返回方案信息。
 3         /// </summary>
 4         /// <returns></returns>
 5         private static T RequestApi<T>(string origin, string origin_region, string destination, string destination_region, string mode)
 6         {
 7             string apiUrl = "http://api.map.baidu.com/direction/v1";
 8             //string ak = "E4805d16520de693a3fe707cdc962045";
 9             string apiKey = "E4805d16520de693a3fe707cdc962045"; //
10             string output = "json";
11             //string origin_region = "北京";
12             //string origin = "清华大学";
13             //string destination = "北京大学";
14             //string destination_region = "北京";
15             //string mode = "driving";
16             IDictionary<string, string> param = new Dictionary<string, string>();
17             param.Add("ak", apiKey);
18             param.Add("output", output);
19             if (mode == "driving")
20             {
21                 param.Add("origin_region", origin_region);
22                 param.Add("destination_region", destination_region);
23             }
24             else
25             {
26                 param.Add("region", origin_region);
27             }
28 
29             param.Add("origin", origin);
30             param.Add("destination", destination);
31             param.Add("mode", mode);
32 
33             string result = string.Empty;
34 
35             //初始化方案信息实体类。
36             T info = default(T);
37             try
38             {
39                 //以 Get 形式请求 Api 地址
40                 result = HttpUtils.DoGet(apiUrl, param);
41                 info = JsonHelper.FromJsonTo<T>(result);
42             }
43             catch (Exception)
44             {
45                 info = default(T);
46                 throw;
47             }
48 
49             return info;
50         }
查看代码

HttpUtils 类:

C# 调用百度地图Web服务API
  1     /// <summary>
  2     /// 提供 Http 相关方法。
  3     /// </summary>
  4     public class HttpUtils
  5     {
  6 
  7         /// <summary>
  8         /// 执行HTTP GET请求。
  9         /// </summary>
 10         /// <param name="url">请求地址</param>
 11         /// <param name="parameters">请求参数</param>
 12         /// <returns>HTTP响应</returns>
 13         public static string DoGet(string url, IDictionary<string, string> parameters)
 14         {
 15             if (parameters != null && parameters.Count > 0)
 16             {
 17                 if (url.Contains("?"))
 18                 {
 19                     url = url + "&" + BuildPostData(parameters);
 20                 }
 21                 else
 22                 {
 23                     url = url + "?" + BuildPostData(parameters);
 24                 }
 25             }
 26 
 27             HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
 28             req.ServicePoint.Expect100Continue = false;
 29             req.Method = "GET";
 30             req.KeepAlive = true;
 31             req.UserAgent = "Test";
 32             req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
 33 
 34             HttpWebResponse rsp = null;
 35             try
 36             {
 37                 rsp = (HttpWebResponse)req.GetResponse();
 38             }
 39             catch (WebException webEx)
 40             {
 41                 if (webEx.Status == WebExceptionStatus.Timeout)
 42                 {
 43                     rsp = null;
 44                 }
 45             }
 46 
 47             if (rsp != null)
 48             {
 49                 if (rsp.CharacterSet != null)
 50                 {
 51                     Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
 52                     return GetResponseAsString(rsp, encoding);
 53                 }
 54                 else
 55                 {
 56                     return string.Empty;
 57                 }
 58             }
 59             else
 60             {
 61                 return string.Empty;
 62             }
 63         }
 64 
 65         /// <summary>
 66         /// 把响应流转换为文本。
 67         /// </summary>
 68         /// <param name="rsp">响应流对象</param>
 69         /// <param name="encoding">编码方式</param>
 70         /// <returns>响应文本</returns>
 71         private static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
 72         {
 73             StringBuilder result = new StringBuilder();
 74             Stream stream = null;
 75             StreamReader reader = null;
 76 
 77             try
 78             {
 79                 // 以字符流的方式读取HTTP响应
 80                 stream = rsp.GetResponseStream();
 81                 reader = new StreamReader(stream, encoding);
 82 
 83                 // 每次读取不大于256个字符,并写入字符串
 84                 char[] buffer = new char[256];
 85                 int readBytes = 0;
 86                 while ((readBytes = reader.Read(buffer, 0, buffer.Length)) > 0)
 87                 {
 88                     result.Append(buffer, 0, readBytes);
 89                 }
 90             }
 91             catch (WebException webEx)
 92             {
 93                 if (webEx.Status == WebExceptionStatus.Timeout)
 94                 {
 95                     result = new StringBuilder();
 96                 }
 97             }
 98             finally
 99             {
100                 // 释放资源
101                 if (reader != null) reader.Close();
102                 if (stream != null) stream.Close();
103                 if (rsp != null) rsp.Close();
104             }
105 
106             return result.ToString();
107         }
108 
109         /// <summary>
110         /// 组装普通文本请求参数。
111         /// </summary>
112         /// <param name="parameters">Key-Value形式请求参数字典。</param>
113         /// <returns>URL编码后的请求数据。</returns>
114         private static string BuildPostData(IDictionary<string, string> parameters)
115         {
116             StringBuilder postData = new StringBuilder();
117             bool hasParam = false;
118 
119             IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
120             while (dem.MoveNext())
121             {
122                 string name = dem.Current.Key;
123                 string value = dem.Current.Value;
124                 // 忽略参数名或参数值为空的参数
125                 if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value))
126                 {
127                     if (hasParam)
128                     {
129                         postData.Append("&");
130                     }
131 
132                     postData.Append(name);
133                     postData.Append("=");
134                     postData.Append(Uri.EscapeDataString(value));
135                     hasParam = true;
136                 }
137             }
138 
139             return postData.ToString();
140         }
141 
142     }
查看代码

通过循环调用 RequestApi 的方式就可以获取两个地点的交通数据了。
Json 转换后的实体类可以通过 json2csharp 工具直接生成,地址:http://json2csharp.com/

二、需要注意的是:

1、这个 API 有时候请求之后响应时间较长,经常会超时,所以我在 HttpUtils 类里抛出了 WebException 异常。

2、Json 转换的方法里也要做异常处理。

C# 调用百度地图Web服务API,布布扣,bubuko.com

C# 调用百度地图Web服务API

上一篇:PS如何给图片填充颜色?PS填充颜色的两种方法


下一篇:(转)jQuery验证控件jquery.validate.js使用说明+中文API