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