/** * 查询搜索 * @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 ""; } } }); });