1、前言
上节主要和大家分享了点击查询相关的参数设置和前端代码封装,GIS开发之二维地下管线综合管理系统(Arcgis)第四节 查询(1)。
本节继续和大家分享讨论ArcGIS Api for Javascript 中查询的接口:QueryTask,各位小伙伴如发现有疑问或者可优化的地方,欢迎评论区留言哈。
2、功能介绍
2.1 关于QueryTask实现空间查询和属性查询
使用QueryTask类来根据空间关系和属性条件查询要素,QueryTask与IdentifyTask不同的是,QueryTask每次只能针对一个图层进行查询。
与QueryTask配合使用的设置查询参数的是Query类,Query类包含若干个字段,表示查询的参数,下面一一介绍:
- geometry,空间属性,指定了用于空间查询的几何对象;可以是Extent\Point\Multipoint\Polyline\Polygon等几何对象;
- outFields,字符串数组,指定返回结果FeatureSet中包含的属性字段,这些字段必须存在于所要查询的图层中,并且必须使用真实的字段名称,通过该属性可以指定需要显示的字段;
- returnGeometry,布尔型,用于指定是否在返回结果FeatureSet中的要素中包含几何对象;
- spatialRelationship,指定了执行空间查询时对输入的几何对象使用何种空间关系策略,ArcGIS API for JavaScript规定了8种查询策略,用字符串来表示,可选值有
“intersects”|“contains”|“crosses”|“disjoint”|“envelope-intersects”|“overlaps”|“touches”|“within”,默认值为"intersects"; - where,该字段指定了属性查询的where从句,任何有效的SQL where 从句都可以,如:
query.where = "NAME='"+stateName+"'"; query.where = "POP04>"+population;
3、示例代码
3.1 QueryTask
- 类引入
//定义全局变量,点击查询任务和查询参数
var queryTask, query;
var callbackFun;
var defaultParam;
define(["esri/tasks/query", "esri/tasks/QueryTask"], function (Query, QueryTask){
// 实现代码
function QYQueryTask() {
......
return QYIdentifyTask;
}
}
- 定义默认参数
this.defaultParams = {
// 点击查询的图层地址
url: "http://localhost:5013/arcgis/rest/services/test/MapServer/2",
// 返回所有字段
outFields: ["*"],
spatialRelationship: Query.SPATIAL_REL_INTERSECTS,
// 是否返回地理要素信息
returnGeometry: true
};
defaultParam = this.defaultParams;
- 参数设置
this.doQueryTask= function (options, callback) {
var that = this;
// 设置回调
callbackFun = callback;
queryTask = new QueryTask(options.url || defaultParam.url);
query = new Query();
query.returnGeometry = options.returnGeometry || defaultParam.returnGeometry; //是否返回集合对象
query.outFields = options.outFields || defaultParam.outFields;
query.where = options.whereBy || "0=0";
if (options.geometry) {
query.spatialRelationship = options.spatialRelationship || defaultParam.spatialRelationship;
query.geometry = options.geometry;
}
that.execute();
};
- 执行查询
this.execute = function () {
var that = this;
var timeout = 0;
var isworking = true;
queryTask.execute(query, function (evt) {
isworking = false;
callbackFun.success(evt);
},
function (err) {
isworking = false;
callbackFun.fail(err);
});
}
- 完整代码如下 QYQueryTask.js
//定义全局变量,点击查询任务和查询参数
var queryTask, query;
var callbackFun;
var defaultParam;
define(["esri/tasks/query", "esri/tasks/QueryTask"], function (Query, QueryTask) {
function QYQueryTask() {
this.defaultParams = {
url:"http://localhost:5013/arcgis/rest/services/test/MapServer/2",
returnGeometry: true,
outFields: ["*"],
spatialRelationship: Query.SPATIAL_REL_INTERSECTS
};
defaultParam = this.defaultParams;
this.doQueryTask = function (options, callback) {
var that = this;
callbackFun = callback;
queryTask = new QueryTask(options.url || defaultParam.url);
query = new Query();
query.returnGeometry = options.returnGeometry || defaultParam.returnGeometry; //是否返回集合对象
query.outFields = options.outFields || defaultParam.outFields;
query.where = options.whereBy || "0=0";
if (options.geometry) {
query.spatialRelationship = options.spatialRelationship || defaultParam.spatialRelationship;
query.geometry = options.geometry;
}
that.execute();
};
this.execute = function () {
var that = this;
var timeout = 0;
var isworking = true;
queryTask.execute(query, function (evt) {
isworking = false;
callbackFun.success(evt);
},
function (err) {
isworking = false;
callbackFun.fail(err);
});
};
}
return QYQueryTask;
});
- 调用
MWP.QYJC.All2Query = function (geo, sql) {
$("body").mLoading("show");
require(["js/module/dredge/QYQueryTask"], function (QYQueryTask) {
var queryModel = new QYQueryTask();
queryModel.doQueryTask({
whereBy: sql, // 属性条件
geometry: geo // 空间条件
},
{
success: function (res) {
if (res.features.length > 0) {
QYList.showdata(res.features);
} else {
MWP.showMapWarning("查询没有结果!", "提示");
}
$("body").mLoading("hide");
},
fail: function(err) {
MWP.showMapWarning("查询错误!\n" + err, "提示");
$("body").mLoading("hide");
console.log(err);
}
});
});
}
4、参考资料
下一篇主要分享FindTask类的分析与函数封装,用以实现基于属性条件对多图层进行全文搜索,敬请期待
关注以下公众号,及时发布各种技术交流,并下载相关文档和程序