0

Итак, это будет довольно прямой вопрос. У меня есть функция в вспомогательном классе для получения оптимизированного маршрута (или нет) с использованием API карт.Как оптимизировать более 10 адресов, используя google-maps 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 координат (лат & Ланг пару), 2 в качестве начальной и конечной позиции, а другие 8 как способ точки, но как отправить 20? Или 30?

Я прочитал много вопросов здесь, на SO и других сайтах, которые в основном отвечали на вопрос о показе или вычислении уже оптимизированного списка координат.

Я знаю, что я могу разделить мой список на несколько списков, которые имеют менее 10 координат, но таким образом я бы не стал правильно оптимизированным маршрутом, так как он не учитывает все координаты и только его части будет правильно оптимизирована.

К сожалению, я не могу позволить себе платить за премиальную лицензию на google (если я не ошибаюсь, это 10k freaking bucks: S).

РЕДАКТИРОВАТЬ: По-видимому, при использовании услуг веб-маршрутизации на стороне сервера вы можете сделать это 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

Служба веб-направлений (именно это то, что вы используете) поддерживает до 23 путевых точек в каждом запросе на сервер для пользователей стандартного API (вам не нужна высококачественная лицензия). – geocodezip

+0

Каждый другой вопрос, который я видел, когда я искал ответ, имел один из ваших ответов xD В любом случае, я не знаю, почему вы проголосовали за меня, но то, что вы сказали, неверно. Когда я пытаюсь добавить более 8 way-points (так как это без ключа), я получаю статус «MAX_WAYPOINTS_EXCEEDED», и когда я добавляю ключ к моему вызову так: var requestUrl = string.Format ("https: // maps.googleapis.com/maps/api/directions/json?origin={0}&destination={1}&waypoints={2}&key={3} ", origin, destination, string.Join (" | ", waypoints) , 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 (вам не нужна лицензия на премию).

Вам нужен ключ, но теперь ключи (по состоянию на 22 июня 2016 года) необходимы для всех сервисов картографии Google.

+0

Лоуренс, вы могли бы хотя бы указать, что ему нужен api key then, и где. – Kadaj

Смежные вопросы