传单路由,多起点的最短路线
leaflet routing, shortest route with multiple origin
我是 javascript 的新手,我 运行 遇到了我正在构建的网站上的一个问题。一点背景:我有一张传单地图,该地图上有多辆车。当我在地图上放置一个新标记时,系统必须计算该标记与我已有的 30 辆车辆之间的所有路线。然后它必须采用该路线数组并按最短距离对其进行排序。
我简单地看了一下 promises,但一直没能让它正常工作。
var get_all_routes = function(){
var promise = new Promise(function(resolve,reject){
var rutas = [];
for(var i = 0;i<Object.keys(puntos).length;i++){
get_route(ambulance[i]).then(function(response){
rutas.push(response);
});
}
resolve(rutas);
});
return promise;
}
ambulance 是一个全局数组,其中包含地图上每辆车的位置。
function get_route(punto){
return new Promise(function(resolve,reject){
var waypoints = [
L.Routing.waypoint(L.latLng(feature.getLatLng().lat, feature.getLatLng().lng)),
L.Routing.waypoint(L.latLng(punto.getLatLng().lat,punto.getLatLng().lng)),
];
var router = new L.routing.osrmv1({});
router.route(waypoints, function(error, routes) {
if(error==null){
resolve(routes[0]);
}else
resolve('No route available');
}, null, {});
});
}
特征是新放置在地图上的标记。
var sort_cars = function(rutas) {
var promise = new Promise(function(resolve,reject){
rutas.sort(function(a, b){return a.summary.totalDistance-
b.summary.totalDistance});
resolve(rutas);
});
return promise;
}
根据总距离排序。
我就是这样称呼它的:
get_all_routes().then(function(resolve){
window.setTimeout(function() {sort_cars(resolve).then(function(resolve){
routes = resolve;
other_func()
.then(other_func2(routes));
})}, 3000);
});
other_func() 和 other_func2() 做不重要的事情。这是有效的,直到它不起作用。由于 3 秒的超时,如果路由代理花费超过 3 秒的时间来获取所有路由,那么一切都会崩溃。
我需要的是让 sort_cars() 函数等到所有路由都准备就绪后才能执行此操作。请帮忙!
我最后做了更多的研究,找到了这个教程:
http://jingding.blogspot.cl/2012/05/jquery-deferred-objects-promise.html
并将我的代码更改为:
var get_all_routes2=function(){
var rutas = [];
mymap.spin(true);
mymap._handlers.forEach(function(handler) {
handler.disable();
});
var currentStep = get_route2(ambulancias[0].id_recurso,ambulancias[0],puntos[0].tipos_estados.alias2,puntos[0].disponible,puntos[0].servicio,0,rutas);
for(var i = 1;i<Object.keys(puntos).length;i++){
currentStep = currentStep.then(function(j){
return get_route2(ambulancias[j+1].id_recurso,ambulancias[j+1],puntos[j+1].tipos_estados.alias2,puntos[j+1].disponible,puntos[j+1].servicio,j+1,rutas);
});
}
currentStep.done(function(){
Promise.resolve(sort_cars2(rutas)).then(function(resolve){
remove_ambulances();
create_ambulances(resolve);
mymap.spin(false);
mymap._handlers.forEach(function(handler) {
handler.enable();
});
});
});
}
function get_route2(id,punto,alias2,disponibilidad,servicio,i,rutas){
var defer = $.Deferred();
var waypoints = [
L.Routing.waypoint(L.latLng(feature.getLatLng().lat, feature.getLatLng().lng)),L.Routing.waypoint(L.latLng(punto.getLatLng().lat,punto.getLatLng().lng)),
];
var router = new L.routing.osrmv1({});
router.route(waypoints, function(error, routes) {
if(error==null){
rutas.push(routes[0]);
defer.resolve(i);
}
}, null, {});
return defer.promise();
}
var sort_cars2 = function(rutas) {
var promise = new Promise(function(resolve,reject){
rutas.sort(function(a, b){return a.summary.totalDistance-b.summary.totalDistance});
resolve(rutas);
});
return promise;
}
然后,我就这样调用它:
get_all_routes2();
我是 javascript 的新手,我 运行 遇到了我正在构建的网站上的一个问题。一点背景:我有一张传单地图,该地图上有多辆车。当我在地图上放置一个新标记时,系统必须计算该标记与我已有的 30 辆车辆之间的所有路线。然后它必须采用该路线数组并按最短距离对其进行排序。 我简单地看了一下 promises,但一直没能让它正常工作。
var get_all_routes = function(){
var promise = new Promise(function(resolve,reject){
var rutas = [];
for(var i = 0;i<Object.keys(puntos).length;i++){
get_route(ambulance[i]).then(function(response){
rutas.push(response);
});
}
resolve(rutas);
});
return promise;
}
ambulance 是一个全局数组,其中包含地图上每辆车的位置。
function get_route(punto){
return new Promise(function(resolve,reject){
var waypoints = [
L.Routing.waypoint(L.latLng(feature.getLatLng().lat, feature.getLatLng().lng)),
L.Routing.waypoint(L.latLng(punto.getLatLng().lat,punto.getLatLng().lng)),
];
var router = new L.routing.osrmv1({});
router.route(waypoints, function(error, routes) {
if(error==null){
resolve(routes[0]);
}else
resolve('No route available');
}, null, {});
});
}
特征是新放置在地图上的标记。
var sort_cars = function(rutas) {
var promise = new Promise(function(resolve,reject){
rutas.sort(function(a, b){return a.summary.totalDistance-
b.summary.totalDistance});
resolve(rutas);
});
return promise;
}
根据总距离排序。
我就是这样称呼它的:
get_all_routes().then(function(resolve){
window.setTimeout(function() {sort_cars(resolve).then(function(resolve){
routes = resolve;
other_func()
.then(other_func2(routes));
})}, 3000);
});
other_func() 和 other_func2() 做不重要的事情。这是有效的,直到它不起作用。由于 3 秒的超时,如果路由代理花费超过 3 秒的时间来获取所有路由,那么一切都会崩溃。
我需要的是让 sort_cars() 函数等到所有路由都准备就绪后才能执行此操作。请帮忙!
我最后做了更多的研究,找到了这个教程:
http://jingding.blogspot.cl/2012/05/jquery-deferred-objects-promise.html
并将我的代码更改为:
var get_all_routes2=function(){
var rutas = [];
mymap.spin(true);
mymap._handlers.forEach(function(handler) {
handler.disable();
});
var currentStep = get_route2(ambulancias[0].id_recurso,ambulancias[0],puntos[0].tipos_estados.alias2,puntos[0].disponible,puntos[0].servicio,0,rutas);
for(var i = 1;i<Object.keys(puntos).length;i++){
currentStep = currentStep.then(function(j){
return get_route2(ambulancias[j+1].id_recurso,ambulancias[j+1],puntos[j+1].tipos_estados.alias2,puntos[j+1].disponible,puntos[j+1].servicio,j+1,rutas);
});
}
currentStep.done(function(){
Promise.resolve(sort_cars2(rutas)).then(function(resolve){
remove_ambulances();
create_ambulances(resolve);
mymap.spin(false);
mymap._handlers.forEach(function(handler) {
handler.enable();
});
});
});
}
function get_route2(id,punto,alias2,disponibilidad,servicio,i,rutas){
var defer = $.Deferred();
var waypoints = [
L.Routing.waypoint(L.latLng(feature.getLatLng().lat, feature.getLatLng().lng)),L.Routing.waypoint(L.latLng(punto.getLatLng().lat,punto.getLatLng().lng)),
];
var router = new L.routing.osrmv1({});
router.route(waypoints, function(error, routes) {
if(error==null){
rutas.push(routes[0]);
defer.resolve(i);
}
}, null, {});
return defer.promise();
}
var sort_cars2 = function(rutas) {
var promise = new Promise(function(resolve,reject){
rutas.sort(function(a, b){return a.summary.totalDistance-b.summary.totalDistance});
resolve(rutas);
});
return promise;
}
然后,我就这样调用它:
get_all_routes2();