【问题标题】:GoogleMaps Optimize waypoints and relate to original sequenceGoogleMaps 优化航点并与原始序列相关
【发布时间】:2017-12-12 03:23:30
【问题描述】:

我正在使用 googlemaps api 来路由和优化数据库中的一组航点。航点以随机顺序输入。一旦通过 googlemaps 优化航路点以创建正确的路线顺序,我需要一种方法将它们与原始序列相关联,以便我可以更新数据库中的路线顺序。

例如,我从数据库中获取的原始数据可能如下所示(开始时 LoadNum 为空白):

    LoadNum Order address   City    State   Zip
   blank    1   456 Elm Street  Chicago IL  12345
    blank   2   123 Main Street Cleveland   OH  12345
    blank   3   678 Market Street   Beverly Hills   CA  90210

在 GoogleMaps 优化路线后,地址可以稍微更改为每条街道上最近的匹配,如下面的范围所示;

LoadNum Order address   City    State   Zip
       blank    2   120-160 Main Street Cleveland   OH  12345
       blank    1   200-300 Elm Street  Chicago IL  12345
       blank    3   678 Market Street   Beverly Hills   CA  90210

GoogleMaps 还会返回我想在数据库中分配为负载编号的路线段编号,但我无法保证匹配。如果我可以将标识符 (OrderNumber) 传递给 googlemaps,并将其与理想的记录一起返回,那么即使地址已更改,我也知道订单号“x”是第 1 站。

下面的代码 sn-ps,首先是 JavaScript,在底部附近我将 routeSegment 和 EndAddress 捕获到一个变量中(实际上现在是一个文本字段,所以我可以看到它):

 directionsService.route({
            origin: document.getElementById('StartBoxAjax').value,
            destination: document.getElementById('EndBoxAjax').value,
            waypoints: waypts,
            optimizeWaypoints: true,
            travelMode: 'DRIVING'
        }, function (response, status) {
            if (status === 'OK') {
                directionsDisplay.setDirections(response);
                var route = response.routes[0];
                var string = [];
                document.getElementById('<%=JScriptParm.ClientID %>').value = ""
                var summaryPanel = document.getElementById('directions-panel');
                summaryPanel.innerHTML = '';
                // For each route, display summary information.
                for (var i = 0; i < route.legs.length; i++) {
                    var routeSegment = i + 1;
                    summaryPanel.innerHTML += '<b>Route Segment: ' + routeSegment +
                        '</b><br>';
                    summaryPanel.innerHTML += route.legs[i].start_address + ' to ';
                    summaryPanel.innerHTML += route.legs[i].end_address + '<br>';
                    summaryPanel.innerHTML += route.legs[i].distance.text + '<br><br>';
                    //document.getElementById('JScriptParm').value += routeSegment;
                    document.getElementById('<%=JScriptParm.ClientID %>').value += routeSegment + ',' + route.legs[i].end_address + '|';
                   // string += routeSegment + ',' + route.legs[i].end_address + '|';
                   // document.getElementById('<%=JScriptParm.ClientID %>').value = string;

                }

然后在后面的代码中,我想做一个数据库更新,其中“AddressInDB 匹配从 JavaScript 返回的地址”。

 protected void AssignLoadNum(string city, string state, string stop)
    {
        //Call Stored proc to update load number.
        SqlConnection conn = new SqlConnection();
        SqlCommand cmd = new SqlCommand();
        string connStr = ConfigurationManager.ConnectionStrings["FurnitureDB"].ConnectionString;
        conn.ConnectionString = connStr;
        conn.Open();
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Connection = conn;
        cmd.Parameters.Add("@state", SqlDbType.VarChar).Value = state;
        cmd.Parameters.Add("@city", SqlDbType.VarChar).Value = city;
        cmd.Parameters.Add("@stop", SqlDbType.Int).Value = Convert.ToInt32(stop);


        cmd.CommandText = "UpdateLoadOrd";
        cmd.ExecuteNonQuery();
        //var dt = new DataTable();

    }

在我的示例中,参数是城市和州,但这还不够具体。总而言之,有没有办法通过将返回/维护的 GoogleMaps Javascript API 传递识别参数,还是有另一种方法来实现我所追求的?

谢谢。

【问题讨论】:

    标签: javascript google-maps


    【解决方案1】:

    DirectionsRoute 对象(代码中的route 变量)包含定义原始航点和重新排序的航点之间关系的信息。查看文档中的属性waypoint_order

    https://developers.google.com/maps/documentation/javascript/reference#DirectionsRoute

    如果 optimizeWaypoints 设置为 true,此字段将包含输入航点的重新排序排列。例如,如果输入是:

    原产地:洛杉矶

    航点:达拉斯、班戈、凤凰城

    目的地:纽约

    优化后的输出排序如下:

    原产地:洛杉矶

    航点:凤凰城、达拉斯、班戈

    目的地:纽约

    那么这个字段将是一个包含值 [2, 0, 1] 的数组。请注意,航点的编号是从零开始的。 如果任何输入航点的 stopover 设置为 false,则此字段将为空,因为此类查询无法使用路线优化。

    【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2015-12-28
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多