我有一个固定的源和目标。但我在中间有多个航路点。我需要计算出优化后的路线在出发地和目的地之间的距离。我必须用c#来做。
提前感谢。
你可以使用Google Directions API:
Google Directions API是一个计算方向的服务使用HTTP请求
使用路径点
当使用方向API计算路由时,你也可以指定用于驾车、步行或骑自行车的路标。
例如,下面的URL为a发起一个方向请求从马萨诸塞州波士顿到马萨诸塞州康科德的航线,中途在查尔斯顿停留和列克星敦,按顺序:
https://maps.googleapis.com/maps/api/directions/json?origin=Boston,MA&destination=Concord,MA&waypoints=Charlestown,MA|Lexington,MA&key=API_KEY
如何在。net中使用Google Directions API
下面的例子演示了如何构造Directions请求:
public class DirectionsClient
{
public static JObject CalcRoute(string origin,string destination,string[] waypoints)
{
var requestUrl = string.Format("https://maps.googleapis.com/maps/api/directions/json?origin={0}&destination={1}&waypoints={2}", origin, destination, string.Join("|",waypoints));
using (var client = new WebClient())
{
var result = client.DownloadString(requestUrl);
var data = JsonConvert.DeserializeObject<JObject>(result);
//ensure directions response contains a valid result
if ((string) data["status"] != "OK")
throw new Exception("Invalid request");
return data;
}
}
}
当方向API返回结果时,它会将它们放在一个(JSON)路由数组中。
这个例子展示了如何打印Legs info:
var data = DirectionsClient.CalcRoute("Boston,MA", "Concord,MA", new[] { "Charlestown,MA", "Lexington,MA"});
foreach (var route in data["routes"])
{
foreach (var leg in route["legs"])
{
Console.WriteLine("Start: {0} End {1}", leg["start_address"], leg["end_address"]);
}
}
关于请求的格式:
方向可以指定起始点、目的地和路点文本字符串(例如:"芝加哥,伊利诺伊州"或"达尔文,NT,澳大利亚")或as<<strong>纬度/经度坐标/strong>。
关于路线优化:
默认情况下,Directions服务通过按给定顺序提供航路点。你也可以通过优化:true作为waypoints参数中的第一个参数让"路线指引"服务优化所提供的路线以更有效的顺序重新安排航路点。(这优化是旅行推销员问题的一个应用。)
如果您指示指示服务优化其顺序路径点,它们的顺序将在waypoint_order字段中返回在routes对象中。waypoint_order字段返回值
下面的例子计算从阿德莱德出发的公路旅行路线,南澳各主要葡萄酒产区使用路线优化。
https://maps.googleapis.com/maps/api/directions/json?origin=Adelaide,SA&destination=Adelaide,SA&waypoints=optimize:true|Barossa+Valley,SA|Clare,SA|Connawarra,SA|McLaren+Vale,SA&key=API_KEY
对计算出的路由进行检查,会发现该路由为使用以下航路点顺序计算:
"waypoint_order": [ 1, 0, 2, 3 ]