(1)ArcGISDynamicMapServiceLayer动态图层因涉及到多个子图层,其图层加载的过滤条件需要对每个子图层定义过滤条件。
esriLoader
.loadModules([
'esri/layers/ArcGISDynamicMapServiceLayer',
'esri/tasks/IdentifyTask',
'esri/tasks/IdentifyParameters',
'esri/geometry/webMercatorUtils'
])
.then(([
ArcGISDynamicMapServiceLayer,
IdentifyTask,
IdentifyParameters,
WebMercatorUtils
]) => {
// 定义图层
const url = 'http://localhost:6080/arcgis/rest/services/zjBlog/jsBorder/MapServer'
const dynamicLayer = new ArcGISDynamicMapServiceLayer(url, {
id: 'dynamicLayer',
opacity: 0.9
})
// 设置各图层表达式
let layerDefinition = []
layerDefinition[1] = `Name = '南京市' or Name='扬州市' or Name='连云港市'`
layerDefinition[2] = `Name = '沛县' or Name='昆山市' or Name='太仓市'`
dynamicLayer.setLayerDefinitions(layerDefinition)
mapView.addLayer(dynamicLayer)
// 图层添加点击事件
executeDynamicIdentify(url, IdentifyTask, IdentifyParameters, WebMercatorUtils)
})
(2)arcgis api 的FeatureLayer的探针点击拾取功能比较简单,直接根据字段属性定义infoTemplate的content内容即可,但是ArcGISDynamicMapServiceLayer的点击拾取事件就需要借助于map的click的点位几何图形去执行IdentifyTask的查询。上述代码调用了图层添加点位事件的方法,具体操作如下:
/**
* dynamic图层点击事件
* @param {*} url
* @param {*} IdentifyTask
* @param {*} IdentifyParameters
* @param {*} WebMercatorUtils
*/
const executeDynamicIdentify = (url, IdentifyTask, IdentifyParameters, WebMercatorUtils) => {
let identifyTask = new IdentifyTask(url)
let params = new IdentifyParameters()
// 地图点击事件
mapView.on('click', (evt) => {
let mapPoint = evt.mapPoint
let mapExtent = mapView.extent
// 判断点击是否为墨卡托投影
if (mapPoint.spatialReference.isWebMercator()) {
mapPoint = WebMercatorUtils.webMercatorToGeographic(mapPoint)
mapExtent = WebMercatorUtils.webMercatorToGeographic(mapExtent)
}
// 设置查询条件(同加载的匹配条件)
let layerDefinition = []
layerDefinition[0] = '1 = 1'
layerDefinition[1] = `Name = '南京市' or Name='扬州市' or Name='连云港市'`
layerDefinition[2] = `Name = '沛县' or Name='昆山市' or Name='太仓市'`
params.geometry = mapPoint
params.mapExtent = mapExtent
params.tolerance = 5 // 缓冲区范围
params.layerOption = IdentifyParameters.LAYER_OPTION_VISIBLE
params.layerDefinitions = layerDefinition
identifyTask.execute(params).then(result => {
console.warn(result)
})
})
}