arcgis api for js 空间查询和属性查询/1 空间查询

本文深入探讨了ArcGIS中空间查询的实现方式,包括IdentifyTask与QueryTask的不同应用场景,以及如何通过设置参数进行多图层和单图层的空间查询。文章提供了具体的代码示例,展示了如何使用IdentifyParameters和Query进行空间分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询分为属性查询和空间查询类

属性查询: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);
        }
    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值