arcgis api(六)arcgis api for js 3.x Dynamic 动态图层各图层的过滤以及点击拾取功能

    (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)
      })
    })
  }

猜你喜欢

转载自blog.csdn.net/zhengjie0722/article/details/108371382