/**
|
* 路线搜索
|
* @author Liuyl
|
* @date 2015/11/1p
|
*/
|
define([
|
"dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang",
|
"esri/tasks/RouteTask", "esri/tasks/RouteParameters", "esri/tasks/FeatureSet",
|
"base/AppEvent", "base/ConfigData", "esri/graphic","base/bustransfer/TransferParameter",
|
"base/bustransfer/TransferTask"
|
], function(
|
declare, arrayUtil, lang,
|
RouteTask, RouteParameters, FeatureSet,
|
AppEvent, ConfigData, Graphic,TransferParameter,
|
TransferTask
|
) {
|
return declare("RouteManager", null, {
|
QueryArguments: declare(null, {
|
constructor: function(props) {
|
this.id = uuid();
|
this.queryType = null;
|
this.reqId = null;
|
this.extent = null;
|
this.poiType = null;
|
this.keyword = null;
|
this.queryForCount = false;
|
this.returnGeometry = true;
|
this.start = 0;
|
this.num = 10;
|
this.outSpatialReference = null;
|
this.district = null;
|
$.extend(true, this, props);
|
}
|
}),
|
defaultOptions: {
|
route_service: "http://www.servicelnditu.com/OneMapServer/rest/services/route2014/NAServer/Route",
|
bus_service:"http://www.servicelnditu.com/OneMapServer/rest/services/ShenYangBus/Transfer/exts/PublicTransportationSOE",
|
result_widget_name: "RouteResultWidget"
|
},
|
constructor: function(options) {
|
this.options = {};
|
$.extend(true, this.options, this.defaultOptions, options);
|
this.resultWidgetIsOpen = false;
|
|
AppEvent.addAppEventListener(AppEvent.CONFIG_LOADED, lang.hitch(this, this.onConfigLoaded));
|
AppEvent.addAppEventListener(AppEvent.BASE_MAP_LAYER_LOADED, lang.hitch(this, this.onMapLoaded));
|
AppEvent.addAppEventListener(AppEvent.RUN_ROUTE_QUERY, lang.hitch(this, function(evt) {
|
this.query(evt);
|
}));
|
|
this.newestQueryId = null;
|
},
|
onConfigLoaded: function() {},
|
onMapLoaded: function(map) {
|
this.map = map;
|
},
|
|
|
query: function(evt) {
|
try {
|
var queryArgs = new this.QueryArguments();
|
$.extend(true, queryArgs, evt);
|
this.newestQueryId = queryArgs.id;
|
this._do_query(queryArgs);
|
} catch (err) {
|
this._errorCallback(err, {
|
hockId: evt.hockId
|
});
|
}
|
},
|
_do_query: function(queryArgs) {
|
if (queryArgs.type == "bus") {
|
this.queryBusRoute(queryArgs,
|
lang.hitch(this, this._resultCallback),
|
lang.hitch(this, this._errorCallback)
|
);
|
} else if (queryArgs.type == "car") {
|
this.queryCarRoute(queryArgs,
|
lang.hitch(this, this._resultCallback),
|
lang.hitch(this, this._errorCallback)
|
);
|
}
|
},
|
|
_resultCallback: function(result, qArgs) {
|
if (this.newestQueryId == qArgs.id) {
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_SUCCESS, {
|
hockId: qArgs.hockId,
|
result: result
|
});
|
}
|
|
},
|
_errorCallback: function(err, qArgs) {
|
if (this.newestQueryId == qArgs.id) {
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
|
hockId: qArgs.hockId,
|
error: err
|
});
|
}
|
},
|
queryBusRoute: function(qArgs, resultCallback, errorCallback) {
|
var pac = "";
|
if(ConfigData["districts"] == "" || ConfigData["districts"] == undefined){
|
errorCallback({message:"公交换乘服务未加载完成,请重试"}, qArgs);
|
return;
|
}
|
for(var i = 1; i < ConfigData["districts"].length; i++){
|
if(ConfigData["districts"][i]["Polygon"].contains(qArgs.start.geometry)){
|
pac = ConfigData["districts"][i]["PAC"];
|
break;
|
}
|
}
|
if(pac == "2100" || pac == ""){
|
errorCallback({message:"请求范围已超出辽宁省"}, qArgs);
|
return;
|
}
|
var thisObj = this;
|
var prior = "time";
|
if(!(qArgs.searchtype == "" || qArgs.searchtype == undefined)){
|
prior = qArgs.searchtype;
|
}
|
var transferParameter = new TransferParameter();
|
transferParameter.departure = "{\"x\":" + qArgs.start.geometry.x + ",\"y\":" + qArgs.start.geometry.y + "}";
|
transferParameter.destination = "{\"x\":" + qArgs.end.geometry.x + ",\"y\":" + qArgs.end.geometry.y + "}";
|
transferParameter.prior = prior;
|
transferParameter.exclusive = "mixed";
|
transferParameter.inSR = this.map.spatialReference;
|
var transferTask = new TransferTask(ConfigData["busServices"][pac] + "/exts/PublicTransportationSOE/transfer");
|
transferTask.execute(transferParameter,function(results){
|
$.extend(true, results, {"start":qArgs.start.geometry,"end":qArgs.end.geometry});
|
results.searchtype=prior;
|
results.routeType="bus";
|
results.pac = pac;
|
resultCallback(results, qArgs);
|
},function(err){
|
errorCallback(err.error, qArgs);
|
});
|
},
|
queryCarRoute: function(qArgs, resultCallback, errorCallback) {
|
var impedanceAttribute="Time";
|
if(qArgs.searchtype){
|
switch(qArgs.searchtype){
|
case "time":
|
impedanceAttribute="Minutes";
|
break;
|
case "distance":
|
impedanceAttribute="Meters";
|
break;
|
default:
|
break;
|
}
|
}
|
var routeTask = new RouteTask(this.options.route_service);
|
var routeParas = new RouteParameters();
|
routeParas.barriers = new FeatureSet();
|
routeParas.stops = new FeatureSet();
|
routeParas.returnDirections = true;
|
routeParas.returnRoutes = true;
|
routeParas.outSpatialReference = this.map.spatialReference;
|
routeParas.impedanceAttribute=impedanceAttribute;
|
var g1 = this.filter(qArgs.start);
|
var g2 = this.filter(qArgs.end);
|
|
routeParas.stops.features.push(g1);
|
routeParas.stops.features.push(g2);
|
|
routeTask.solve(routeParas, lang.hitch(this, function(result) {
|
result.searchtype=qArgs.searchtype;
|
result.routeType="car";
|
resultCallback(result, qArgs);
|
}), lang.hitch(this, function(err) {
|
errorCallback({message:"未能查询到路线结果!"}, qArgs);
|
}));
|
},
|
filter: function(graphic) {
|
var g = new Graphic(graphic.geometry);
|
g.setAttributes({
|
NAME: graphic.attributes.NAME
|
})
|
return g;
|
}
|
});
|
});
|