查询分为属性查询和空间查询类
属性查询:QueryTask,FindTask(只能属性。多个图层)
空间查询:IdentifyTask(多个图层),QueryTask(单个图层)
空间查询:
最近使用到了空间查询并做了一些简单的查询功能,因为也是第一次写这个空间查询,所以看了很多别人的示例代码,这里我看的是 [https://blog.youkuaiyun.com/weixin_40184249/article/details/80949351]这位大佬的。
下面是我对这个空间查询的了解:
空间查询可以使用这两种配合方式进行查询
1. esri/tasks/IdentifyTask 和 esri/tasks/IdentifyParameters
2. esri/tasks/QueryTask 和 esri/tasks/query
一个是通过添加服务的url 来进行多图层的查询
var identify = new IdentifyTask("http://10.10.1.140/arcgis/rest/services/hainan/ceshi/MapServer");
//这里地址做了处理 未展示端口号 主要用来说明
一个是通过传入图层的url来进行单图层的查询
var queryTask = new QueryTask("http://10.10.1.140/arcgis/rest/services/hainan/ceshi/FeatureServer/0");
区别就是 一个是服务地址 一个是图层地址
而两个分析又有各自的对应的参数对象
var params = new IdentifyParameters();
var query = new Query();
对应的 两个分析既然都是可以做空间查询 那么就需要传一个geometry对象
params.geometry = geometry;
query.geometry = geometry;
还有很多其他的参数具体可以参考arcgis api
两者不同的就是:如果使用IdentifyTask查询多个图层的时候,需要定义查询此服务的哪些图层,即一个数组:例如如下代表所表达的是查询该服务下第一个图层。
params.layerIds = [0];
下面是我所写的代码(因为查询了很多个服务,所以在里面循环了,因为是异步的,最后等到最后一个查询完了再resolve最后的查询结果)
List:服务地址数组
geometry:图形
mapId:相当于拿到地图
IdentifyTask
// 用Identify的
toIdentifyTask.getSpatialQuery1 = function (mapId, geometry, List) {
return new Promise((resolve, reject) => {
esriLoader.dojoRequire(["esri/tasks/IdentifyTask", "esri/tasks/IdentifyParameters"
], (IdentifyTask, IdentifyParameters) => {
let map = baseMapManagerCtrl.mapHash[mapId];
let res = [];
// console.log('这是看看进来了没有map', map);
var counter = 0;
List.forEach(item => {
var url = item.MAPSERVICES
if (process.env.NODE_ENV == "development") {
if (item.tc_sourcetype == "geotools") {
url = '/' + url.split('/').slice(3).join('/')
} else {
url = item.MAPSERVICES
}
}
var identify = new IdentifyTask(url);
// var identify = new IdentifyTask("http://10.10.1.140/arcgis/rest/services/hainan/ceshi/MapServer");
var params = new IdentifyParameters();
// console.log('这是geometry', geometry);
params.geometry = geometry;
params.mapExtent = map.extent;
params.returnGeometry = true;
params.returnFieldName = true;
params.tolerance = 5;
params.layerIds = [0];
params.layerOption = IdentifyParameters.LAYER_OPTION_ALL;
identify.execute(params).addCallback(function (response) {
// console.log("这是一个图层分析出来的res", response);
response.forEach((ele) => {
ele.feature.attributes.layerId = item.tcId//用来分辨图层
res.push(ele.feature);
});
counter++;
// console.log('这是counter', counter);
// console.log('这是List.length', List.length);
if (counter === List.length) {
// console.log('这是出去',);
resolve(res)
}
})
identify.execute(params).addErrback(function (response) {
// console.log("这是一个图层分析出来的res", response);
// resolve([])
counter++;
if (counter === List.length) {
// console.log('这是出去',);
resolve(res)
}
})
})
})
})
}
同理
url:服务地址
geometry:图形
mapId:相当于拿到地图
QueryTask
// 用Query的
toIdentifyTask.getSpatialQuery2 = function (mapId, geometry, url,) {
esriLoader.dojoRequire(["esri/tasks/QueryTask", "esri/tasks/query"
], (QueryTask, Query) => {
let map = baseMapManagerCtrl.mapHash[mapId];
// console.log('这是看看进来了没有map', map);
// var identify = new IdentifyTask(url);
// var queryTask = new QueryTask("http://10.10.1.140/arcgis/rest/services/hainan/ceshi/FeatureServer/0");
// var params = new IdentifyParameters();
var query = new Query();
// console.log('这是geometry', geometry);
query.geometry = geometry;
// query.mapExtent = map.extent;
query.returnGeometry = true;
// query.returnFieldName = true;
// query.tolerance = 5;
// query.layerIds = [0];
// query.layerOption = IdentifyParameters.LAYER_OPTION_ALL;
QueryTask.execute(query, showInfo);
function showInfo(infos) {
// console.log('这是infos', infos);
}
});
}
最后结果
=============================================================================
如果是图片类型的服务
就用这个 我试用过 可以查出来 但是数据返回的信息很少 也不知道是不是图层的问题。代码如下,规则同上:单个图层
“esri/tasks/ImageServiceIdentifyTask” 和 “esri/tasks/ImageServiceIdentifyParameters”
toIdentifyTask.getSpatialQuery3 = function (mapId, geometry, url,) {
esriLoader.dojoRequire(["esri/tasks/ImageServiceIdentifyTask", "esri/tasks/ImageServiceIdentifyParameters"
], (ImageServiceIdentifyTask, ImageServiceIdentifyParameters) => {
let map = baseMapManagerCtrl.mapHash[mapId];
// console.log('这是看看进来了没有map', map);
// var identify = new IdentifyTask(url);
// var queryTask = new QueryTask("http://10.10.1.140/arcgis/rest/services/hainan/ceshi/FeatureServer/0");
// var params = new IdentifyParameters();
// var query = new Query();
var query = new ImageServiceIdentifyTask("http://10.10.1.176:6080/arcgis/rest/services/image/bbf_CopyRaster/ImageServer")
// console.log('这是geometry', geometry);
var params = new ImageServiceIdentifyParameters();
params.geometry = geometry;
// query.mapExtent = map.extent;
params.returnGeometry = true;
// query.returnFieldName = true;
// query.tolerance = 5;
// query.layerIds = [0];
// query.layerOption = IdentifyParameters.LAYER_OPTION_ALL;
query.execute(params, showInfo);
function showInfo(infos) {
// console.log('这是infos', infos);
}
});
}