我正在使用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.
下面的代码片段,首先是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;
}
然后在代码后面我想做一个DB更新,其中“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传递识别参数,还是有另一种方法来实现我追求的目标?
感谢。
答案 0 :(得分:0)
DirectionsRoute对象(代码中的route
变量)包含定义原始航点和重新排序的航点之间关系的信息。请查看文档中的属性waypoint_order
:
https://developers.google.com/maps/documentation/javascript/reference#DirectionsRoute
如果 optimizeWaypoints 设置为 true ,则此字段将包含输入路点的重新排序的排列。例如,如果输入为:
原产地:洛杉矶
Waypoints:达拉斯,班戈,凤凰城
目的地:纽约
,优化后的输出按如下方式排序:
原产地:洛杉矶
航点:凤凰城,达拉斯,班戈
目的地:纽约
然后该字段将是一个包含值[2,0,1]的数组。请注意,航点的编号从零开始。 如果任何输入航路点的停留设置为 false ,则此字段将为空,因为路由优化不适用于此类查询。