如何使用google-maps api v3优化10个以上的地址

时间:2016-09-27 14:10:04

标签: c# asp.net google-maps google-maps-api-3 traveling-salesman

所以,这将是一个非常直截了当的问题。 我在helper类中有函数来使用maps API获取优化(或不是)路由。

    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&amp; lang对),2个作为起点和终点位置,其他8个作为路点,但如何发送20个?还是30?

我在SO和其他网站上已经阅读了很多问题,这些问题主要回答了关于显示或计算已经优化的坐标列表的问题。

我知道我可以将我的列表分成多个坐标少于10个的列表,但是这样我就不会得到正确优化的路径,因为它没有考虑所有坐标而只考虑部分内容将得到适当优化。

不幸的是,我无力支付谷歌的高级许可费(如果我没有记错的话,那就是10万美元: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");

1 个答案:

答案 0 :(得分:0)

Web路线服务(您正在使用的)在标准API用户的每个服务器端请求中最多支持23个路点(您不需要高级许可证)。

您确实需要密钥,但现在所有Google地图服务都需要密钥(截至2016年6月22日)。