/**
|
* 查询搜索
|
* @author Liuyl
|
* @date 2015/10/30
|
*/
|
define([
|
"dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang",
|
"dojo/json", "dojo/request", "dojo/request/script",
|
"esri/tasks/query", "esri/tasks/QueryTask", "esri/tasks/StatisticDefinition",
|
"base/AppEvent", "base/ConfigData"
|
], function(
|
declare, arrayUtil, lang,
|
JSON, request, script,
|
Query, QueryTask, StatisticDefinition,
|
AppEvent, ConfigData
|
) {
|
return declare("QueryManager", null, {
|
QueryArguments: declare(null, {
|
constructor: function(props) {
|
|
this.type = null;
|
this.extent = null;
|
this.poiType = null;
|
this.keyword = null;
|
this.returnGeometry = true;
|
this.outSpatialReference = null;
|
$.extend(true, this, props);
|
}
|
}),
|
defaultOptions: {
|
poi_service: "http://www.servicelnditu.com/OneMapServer/rest/services/poi2015/MapServer/0",
|
poi_service_fgdb: "http://www.servicelnditu.com/OneMapServer/rest/services/poi2015/MapServer/0",
|
poi_keyword_field: "NAME",
|
poi_pinyin_field: "NAMEPY",
|
poi_type1_field: "TYPE1",
|
poi_type2_field: "TYPE2",
|
poi_pac_field: "PACSHI",
|
poi_fields: {
|
"OBJECTID": "",
|
"NAME": "名称",
|
"NAMEPY": "拼音",
|
"ADDNAME": "地址",
|
"TELEPHONE": "电话"
|
},
|
result_widget_name: "QueryResultWidget",
|
smartquery_service: "../ProxyServlet?http://www.lnditu.gov.cn/SmartQueryService/rest/query/smartquery"
|
|
},
|
constructor: function(options) {
|
this.options = {};
|
$.extend(true, this.options, this.defaultOptions, options);
|
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_QUERY, lang.hitch(this, function(evt) {
|
this.query(evt);
|
}));
|
AppEvent.addAppEventListener(AppEvent.RUN_SMART_QUERY, lang.hitch(this, function(evt) {
|
this.smartQueryFromPoi(evt);
|
}));
|
this.newestQueryId = null;
|
},
|
onConfigLoaded: function() {},
|
onMapLoaded: function(map) {
|
this._map = map;
|
},
|
smartQuery: function(evt) {
|
//var queryString = this._parseQueryString(evt);
|
try {
|
request.get(this.options.smartquery_service + this._parseQueryString(evt.args), {
|
handleAs: "json"
|
}).then(function(data) {
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_SUCCESS, {
|
hockId: evt.hockId,
|
result: data
|
});
|
},
|
function(error) {
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
|
hockId: evt.hockId,
|
error: error
|
});
|
});
|
} catch (err) {
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
|
hockId: evt.hockId,
|
error: err
|
});
|
}
|
|
},
|
_parseQueryString: function(argsObject) {
|
var queryString = "?";
|
arrayUtil.forEach(Object.keys(argsObject), function(item, index) {
|
if (queryString != "?") {
|
queryString += "&";
|
}
|
queryString += item + "=" + JSON.stringify(argsObject[item]);
|
});
|
return queryString;
|
},
|
smartQueryFromPoi: function(evt) {
|
try {
|
var url = this.options.poi_service;
|
var query = new Query();
|
query.where = this._parsePoiWhereString(evt.args.keyword);
|
query.outFields = Object.keys(this.options.poi_fields);
|
query.returnGeometry = false;
|
query.start = 0;
|
query.num = 10;
|
var queryTask = new QueryTask(url);
|
queryTask.execute(query, lang.hitch(this, function(result) {
|
var data = {
|
count: 0,
|
items: []
|
};
|
if (result.features) {
|
for (var key in result.features) {
|
if (!result.features[key].attributes.ADDNAME || !result.features[key].attributes.NAME)
|
continue;
|
data.items[data.count] = {
|
adress: result.features[key].attributes.ADDNAME,
|
name: result.features[key].attributes.NAME,
|
id: ""
|
};
|
data.count++;
|
if (data.count >= 10)
|
break;
|
}
|
}
|
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_SUCCESS, {
|
hockId: evt.hockId,
|
result: {
|
data: data
|
}
|
});
|
}), lang.hitch(this, function(err) {
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
|
hockId: evt.hockId,
|
error: err
|
});
|
}));
|
} catch (err) {
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
|
hockId: evt.hockId,
|
error: err
|
});
|
}
|
|
},
|
_parsePoiWhereString: function(keyword) {
|
var whereSql = "";
|
if (keyword) {
|
if ((/[\u4e00-\u9fa5]+/).test(keyword)) {
|
whereSql = this.options.poi_keyword_field + " like '%" + keyword + "%'";
|
} else {
|
whereSql = "lower(" + this.options.poi_pinyin_field + ") like '%" + keyword.toLowerCase() + "%'";
|
}
|
}
|
return whereSql;
|
},
|
query: function(evt) {
|
try {
|
var queryArgs = new this.QueryArguments();
|
$.extend(true, queryArgs, evt);
|
|
this._do_query(queryArgs);
|
} catch (err) {
|
this._errorCallback(err, {
|
hockId: evt.hockId
|
});
|
}
|
},
|
_do_query: function(queryArgs) {
|
switch (queryArgs.type) {
|
case "statistics":
|
this.queryPoiForDistrictStatistics(queryArgs,
|
lang.hitch(this, this._resultCallback),
|
lang.hitch(this, this._errorCallback)
|
);
|
break;
|
case "search":
|
queryArgs.id = uuid();
|
this.newestQueryId = queryArgs.id;
|
|
this.queryPoiForExtent(queryArgs,
|
lang.hitch(this, this._resultCallback),
|
lang.hitch(this, this._errorCallback)
|
);
|
break;
|
case "poiId":
|
queryArgs.id = uuid();
|
this.newestQueryId = queryArgs.id;
|
|
this.queryPoiForExtent(queryArgs,
|
lang.hitch(this, this._resultCallback),
|
lang.hitch(this, this._errorCallback)
|
);
|
break;
|
default:
|
break;
|
}
|
},
|
|
_resultCallback: function(result, qArgs) {
|
if (qArgs.id && this.newestQueryId != qArgs.id) {
|
return;
|
}
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_SUCCESS, {
|
hockId: qArgs.hockId,
|
result: result,
|
type: result.type
|
});
|
},
|
_errorCallback: function(err, qArgs) {
|
if (this.newestQueryId == qArgs.id) {
|
AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
|
hockId: qArgs.hockId,
|
error: err
|
});
|
}
|
},
|
queryPoiForDistrictStatistics: function(qArgs, resultCallback, errorCallback) {
|
var query = new Query();
|
var queryTask = new QueryTask(this.options.poi_service);
|
query.extent = null;
|
query.where = this._parseWhereSql(qArgs);
|
var statisticDefinition = new StatisticDefinition();
|
statisticDefinition.statisticType = "count";
|
statisticDefinition.onStatisticField = "OBJECTID";
|
statisticDefinition.outStatisticFieldName = "COUNT";
|
|
query.outStatistics = [statisticDefinition];
|
query.groupByFieldsForStatistics = ["PACSHI"];
|
if (qArgs.extent) {
|
query.outSpatialReference = qArgs.extent.spatialReference
|
} else {
|
query.outSpatialReference = this._map.spatialReference;
|
}
|
query.outFields = ["PACSHI", "COUNT"];
|
|
queryTask.execute(query, lang.hitch(this, function(result) {
|
result.type = qArgs.type;
|
result.poiType = qArgs.poiType;
|
result.keyword = qArgs.keyword;
|
resultCallback(result, qArgs);
|
}), lang.hitch(this, function(err) {
|
errorCallback(err, qArgs);
|
}));
|
},
|
queryPoiForExtent: function(qArgs, resultCallback, errorCallback) {
|
var url = this.options.poi_service;
|
var query = new Query();
|
|
if (qArgs.poiId) {
|
query.objectIds = [qArgs.poiId];
|
} else {
|
query.where = this._parseWhereSql(qArgs);
|
}
|
if (qArgs.extent) {
|
query.outSpatialReference = qArgs.extent.spatialReference;
|
if (qArgs.extent && !qArgs.extent.hasOwnProperty("xmin")) {
|
query.geometry = qArgs.extent;
|
url = this.options.poi_service_fgdb;
|
}
|
|
} else {
|
query.outSpatialReference = this._map.spatialReference;
|
}
|
query.outFields = Object.keys(this.options.poi_fields);
|
query.returnGeometry = qArgs.returnGeometry;
|
var queryTask = new QueryTask(url);
|
queryTask.execute(query, lang.hitch(this, function(result) {
|
result.type = qArgs.type;
|
result.extent = qArgs.extent;
|
resultCallback(result, qArgs);
|
}), lang.hitch(this, function(err) {
|
errorCallback(err, qArgs);
|
}));
|
},
|
_parseWhereSql: function(qArgs) {
|
var _whereSql = _linkWhereSql("and",
|
_parsePoiCodeWhereSql.call(this, qArgs.poiType),
|
_parseExtentWhereSql.call(this, qArgs.extent));
|
_whereSql = _linkWhereSql("and",
|
_whereSql,
|
//_parseKeywordWhereSql.call(this, qArgs.keyword)
|
this._parsePoiWhereString(qArgs.keyword)
|
);
|
|
return _whereSql;
|
|
|
|
function _linkWhereSql(type, sql1, sql2) {
|
if (!sql1)
|
return sql2;
|
if (!sql2)
|
return sql1;
|
return "( " + sql1 + " ) " + type + " ( " + sql2 + " )";
|
}
|
|
function _parseExtentWhereSql(extent) {
|
if (extent && extent.hasOwnProperty("xmin"))
|
return "LON>" + extent.xmin + " and LON<" + extent.xmax + " and LAT>" + extent.ymin + " and LAT<" + extent.ymax;
|
else
|
return "";
|
}
|
|
function _parsePoiCodeWhereSql(type) {
|
if (type) {
|
if (type.length == 2) {
|
return this.options.poi_type1_field + " = '" + type + "'";
|
} else if (type.length == 4) {
|
return this.options.poi_type2_field + " = '" + type + "'";
|
}
|
|
}
|
return "";
|
}
|
|
function _parseKeywordWhereSql(keyword) {
|
if (keyword) {
|
return this.options.poi_keyword_field + " like '%" + keyword + "%'";
|
}
|
return "";
|
}
|
}
|
});
|
});
|