最近在做关于拼车的项目,使用到了腾讯地图API(路线规划服务),在这里分享一下代码,欢迎点评(第一次写博客呢)。

  官方文档:https://lbs.qq.com/webservice_v1/guide-road.html

一、定义腾讯地图开发key类

public class TengXunBase

{
public string TXserverUrl { get { return "https://apis.map.qq.com"; } }

public string TXmapKey { get { return System.Web.Configuration.WebConfigurationManager.AppSettings["TXmapKey"]; } }

public string TXsecretKey { get { return System.Web.Configuration.WebConfigurationManager.AppSettings["TXsecretKey"]; } }
}

 

二、定义拼接url请求类

public class TengXunBaseRequest : TengXunBase
{
#region url

public string GetModeDirectionUrl(TengXunDirectionBase m)
{
return string.Format("{0}/ws/direction/v1/{1}/?from={2}&to={3}", this.TXserverUrl, m.mode, m.from, m.to);
}

public string GetDirectionUrl(TengXunDirectionBase m)
{
string result = GetModeDirectionUrl(m);
if (!string.IsNullOrEmpty(m.waypoints))
{
result = string.Format("{0}&waypoints={1}", result, m.waypoints);
}
if (!string.IsNullOrEmpty(m.callback))
{
result = string.Format("{0}&output=json&callback={1}", result, m.callback);
}
else
{
result=string.Format("{0}&output=json", result);
}
return result = string.Format("{0}&key={1}&sig={2}", result, this.TXmapKey,m.sig);
}

#endregion

#region 获取签名

/// <summary>
/// 获取签名
/// 1.    首先对参数进行排序:按参数名升序 
/// 2.    签名计算(sig):请求路径+”?”+请求参数+SK进行拼接,并计算拼接后字符串md5值,即为签名(sig)
/// 3.    生成最终请求:将计算得到的签名sig,放到请求中(参数名即为:sig)
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public string GetDirectionSig(TengXunDirectionBase m)
{
string result = string.Format("/ws/direction/v1/{0}/", m.mode);
if (!string.IsNullOrEmpty(m.callback))
{
result = string.Format("{0}?callback={1}&from={2}&key={3}&output=json&to={4}", result, m.callback, m.from, m.to);
}
else
{
result = string.Format("{0}?from={1}&key={2}&output=json&to={3}", result, m.from, this.TXmapKey, m.to);
}
if (!string.IsNullOrEmpty(m.waypoints))
{
result = string.Format("{0}&waypoints={1}", result, m.waypoints);
}
result = string.Format("{0}{1}", result, this.TXsecretKey);
return DreamsTech.Utility.EncryptDecryptHelper.GetMd5(result);
}

#endregion

}

 

三、路线规划服务请求参数类

public class TengXunDirectionBase
{
/// <summary>
/// 必填 驾车(driving);步行(walking);骑行(bicycling);公交(transit)
/// </summary>
public string mode { get; set; }
/// <summary>
/// 必填 起点位置坐标 如 from=40.034852,116.319820
/// </summary>
public string from { get; set; }
/// <summary>
/// 必填 终点位置坐标,格式:lat,lng 如to=39.771075,116.351395
/// </summary>
public string to { get; set; }
/// <summary>
/// 途经点,格式:lat1,lng1;lat2,lng2;… 最大支持10个
/// </summary>
public string waypoints { get; set; }
/// <summary>
/// 回调函数 如 callback=cb
/// </summary>
public string callback { get; set; }
/// <summary>
/// 签名
/// </summary>
public string sig { get; set; }
}

 

四、 请求路线规划服务

/// <summary>
/// 请求路线规划服务
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private TXDrivingVO GetTXDriving(TXDrivingDTO m)
{
if (string.IsNullOrEmpty(m.from) || string.IsNullOrEmpty(m.to))
{
Context.MessageType = BusinessLayer.EMessageType.BussinessError;
Context.Message = "参数有误";
return null;
}
if (string.IsNullOrEmpty(m.mode))
{
m.mode = "driving";
}
TengXunDirectionBase txDirectionBase = new TengXunDirectionBase()
{
mode = m.mode,
from = m.from,
to = m.to,
waypoints = m.waypoints
};
TengXunBaseRequest txBaseRequest = new TengXunBaseRequest();
txDirectionBase.sig = txBaseRequest.GetDirectionSig(txDirectionBase);
string url = txBaseRequest.GetDirectionUrl(txDirectionBase);
TXDrivingVO result = new TXDrivingVO();
HttpClient client = new HttpClient();
HttpResponseMessage hrm = client.GetAsync(url).Result;
if (hrm.StatusCode == System.Net.HttpStatusCode.OK)
{
JObject jo = (JObject)JsonConvert.DeserializeObject(hrm.Content.ReadAsStringAsync().Result);
result.status = Convert.ToInt32(jo["status"]);
result.message = jo["message"].ToString();
result.result = jo["result"];
return result;
}
else
{
Context.MessageType = BusinessLayer.EMessageType.BussinessError;
Context.Message = "调用腾讯地图异常";
return null;
}
}