2016-09-27 101 views
0

所以,這將是非常簡單的問題。 我有助手類的功能,以獲取優化(或不)使用地圖API的路線。如何優化超過10個地址使用谷歌地圖api v3

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 
      string status = (string) data["status"]; 
      if ((string)data["status"] != "OK") 
       throw new Exception("Invalid request"); 

      return data; 
     } 
    } 

而在我的控制,我呼籲它像這樣:

 var data = GoogleGeocodeExtension.CalcRoute("startLat,endLat", "endLat,endLong", new[] 
     { 
      "optimize:true", 
      "lat,lang", 
      "lat,lang", 
      //6 more lat and lang pairs 
      //I want to optimise more than 10 limit 
     }); 
      //showing data in debug window like so 
      //so you can test it faster 
     foreach (var route in data["routes"]) 
     { 
      Debug.WriteLine("----------------------------------------------------"); 
      Debug.WriteLine(route["waypoint_order"]); 
      Debug.WriteLine("----------------------------------------------------"); 
      foreach (var leg in route["legs"]) 
      { 
       Debug.WriteLine("==================================================================================================="); 
       Debug.WriteLine("Start: {0} End: {1} \n Distance: {2} Duration: {3}", leg["start_address"], leg["end_address"], leg["distance"], leg["duration"]); 
       Debug.WriteLine("Start lat lang: {0}", leg["start_location"]); 
       Debug.WriteLine("End lat lang: {0}", leg["end_location"]); 
       Debug.WriteLine("==================================================================================================="); 
      } 
     } 

這樣我就可以送10個座標(LAT &郎對),2作爲起點和終點的位置,和其他8路點,但如何發送20?還是30?

我已經閱讀了許多關於SO和其他網站的許多問題,主要回答了關於顯示或計算已經優化的座標列表的問題。

我知道我可以可以把我的名單成小於10個座標多個列表,但這樣我就不會得到正確優化的路由,因爲它沒有考慮到所有的座標,並僅顯示部分會適當優化。

不幸的是,我不能支付谷歌的高級許可證(如果我沒有記錯,它10K嚇跑雄鹿:S)。

編輯:顯然,當在服務器端使用Web方向服務時,你可以做到這一點23點的限制。你需要壽什麼是你把你的關鍵的API調用,像這樣:

var requestUrl = string.Format("https://maps.googleapis.com/maps/api/directions/json?key={3}&origin={0}&destination={1}&waypoints={2}", origin, destination, string.Join("|", waypoints), "YourApiKey"); 
+0

網站路線服務(您正在使用的服務)在每個標準API用戶的服務器端請求(您不需要高級許可證)的每個服務器端請求中最多支持23個航點。 – geocodezip

+0

我在尋找答案時看到的其他每個問題都有你的答案xD 反正,我不知道你爲什麼低估了我,但你所說的是不正確的。 當我嘗試添加8個以上的方式點(因爲它沒有鍵),我得到狀態「MAX_WAYPOINTS_EXCEEDED」,當我添加鍵到我的電話,如下所示: var requestUrl = string.Format(「https:// maps.googleapis.com/maps/api/directions/json?origin={0}&destination={1}&waypoints={2}&key={3}「,出發地,目的地,字符串。加入(」|「,航點) ,ApiKey); 我收到消息「REQUEST_DENIED」。那麼我做錯了什麼? – Kadaj

+0

公平地說,你是對的。我看到了一些例子,他們把關鍵字放在請求字符串的末尾,但是當我將它切換爲第一個參數時,它很有效: var requestUrl = string.Format(「maps.googleapis.com/maps/api/directions/ json?key = {3}&origin = {0}&destinati on = {1}&waypoints = {2}「,origin,destination,string.Join(」|「,waypoints),ApiKey); 所以它現在的作品:D再次感謝你,即使你恨我:D – Kadaj

回答

0

該網站的方向服務(這是你使用的是什麼),支持多達23路點在每個服務器端請求的用戶標準API(您不需要高級許可證)。

您確實需要一個密鑰,但現在(截至2016年6月22日)所有Google地圖服務都需要密鑰。

+0

勞倫斯你至少可以指定它需要API密鑰,然後在哪裏。 – Kadaj