首页 / 浏览问题 / WebGIS / 问题详情
TiledVectorLayer图层选择
34EXP 2023年08月23日

我现在电子地图的图层结构如下

我现在在项目中需要使用到TiledVectorLayer这个接口,但是我又不想把所有的图层都加载到地图上,我只需要L3、L4、L5等group中的“市”这个面图层,那么TiledVectorLayer中的layerNames和layersID应该怎么设置

      //创建一个矢量瓦片图层
      let vectorLayer = new TiledVectorLayer(this.siChuanMapUrl, {
        // layerNames: '',
        // layersID: '',
        cacheEnabled: true,
        returnAttributes: true,
        attribution: "Tile Data©SuperMap iServer with©SuperMap iClient"
      });

烦请老师给解答一下!

1个回答

280EXP 2023年08月24日
那TiledVectorLayer中的layerNames和layersID是怎么使用的,我看没有例子使用了这两个参数

还有,我的目标不是控制子图层的状态,我就是想实现一个功能:点击市级行政区划后,能够高亮显示市级行政区划而已,所以我仅仅是想通过TiledVectorLayer拿到电子地图中的面数据"市",然后过滤掉其他图层数据,就像https://iclient.supermap.io/examples/leaflet/editor.html#vectorTileLayerNormal
这里边点击省级行政区划后高亮显示一样

1.TiledVectorLayer中的layerNames和layersID的使用:name和id设置一个就行,通常是设置name,可以通过iServer中地图那一级点击layers

选择地图图层,到子图层列表,右边有JSON点击即可得到name,id的顺序是子图层从上到下0开始排序

2.不需要通过TiledVectorLayer拿到电子地图中的面数据"市",由于用的是矢量图层,可以直接进行交互,前端从iserver拿的不是地图缓存图片,而是几何数据json串,所以你绑定点击事件可以直接拿到信息,可以打印一下evt看一看

老师,我在实例化TiledVectorLayer的时候对layerNames总要加以限制,不然会把电子地图中所有的要素都实例化到TiledVectorLayer对象中并且添加到map对象上。

这个TiledVectorLayer确实可以在前端直接进行交互,但是我只需要和电子地图中的"市"这个面数据进行点击事件交互,像其他的道路线数据,河流面数据等我并不需要和它们进行事件交互
这是gpt给的回答

TiledVectorLayer中的layerName参数用于指定要加载的矢量图层的名称。

layerName用法:

layerName必须匹配要加载矢量瓦片数据中实际存在的图层名称。

如果矢量瓦片数据中只有一个图层,可以不指定layerName,它会自动加载该图层。

如果矢量瓦片数据中有多个图层,必须指定layerName来加载特定图层。

现在就一个问题,如果我的电子地图中有很多个图层,怎么使用layerNames来限制显示哪些图层,也就是layerNames参数在多个图层的情况下的具体用法,因为官方文档中也没有给出示例,我需要的是layerNames参数的用法

就是layerNames参数需要以什么形式传进options中

这是我电子地图的图层结构,我只需要利用TiledVectorLayer对这些图层中的“市”这个面数据进行点击事件的交互,我需要将什么形式的layerNames参数传进options中

您好,最新版本目前确实支持layerNames指定特定子图层,对于指定单个子图层您可以通过layerNames:"图层名称"实现,对于指定多个子图层您可以通过layerNames:{"图层名称1","图层名称2"}实现,图层的名称

老师,我这样做也没有效果,而且还报错,有没有可以参考的例子~~~
我已经卡了两天没有进展了
我就是单纯想实现https://iclient.supermap.io/examples/leaflet/editor.html#vectorTileLayerNormal这里边的那个点击行政区就高亮显示的功能,老师您能不能参考我的电子地图结构指点以下layerNames参数应该怎么构造
我的图层都在这样的图层组里边

您好,非常抱歉由于版本的更新,目前对这个参数的设置不太熟悉,目前已验证对于多图层改为["",""]类型即可实现,如下图所示,若仍有问题,您可以再测试一下单图层能否实现,检查一下逗号是否是英文字符,以及末尾是否有英文逗号,希望可以帮到您

我尝试了,无论单图层还是多图层都会报以下错误

GET http://localhost:8090/iserver/services/map-SiChuan/rest/maps/SiChuanMap/tileFeature.json?layerNames=%5B%E5%B8%82@SiChuan 400

error: {code: 400, errorMsg: "org.json.JSONException: Expected a ',' or ']' at 10 [character 11 line 1]"}
succeed: false

代码如下
 

addVectorLayer: function () {
      //创建一个矢量瓦片图层
      let vectorLayer = new TiledVectorLayer(this.siChuanMapUrl, {
        layerNames: "市@SiChuan#1",
        // ["市@SiChuan#1", "市@SiChuan#2", "市@SiChuan#4", "市@SiChuan#6"],
        cacheEnabled: true,
        returnAttributes: true,
        attribution: "Tile Data©SuperMap iServer with©SuperMap iClient"
      });
      console.log(vectorLayer);
      // 添加到地图
      vectorLayer.addTo(this.map);
      vectorLayer.setZIndex(7);
      //矢量瓦片图层添加点击事件,设置默认风格
      vectorLayer.on('click', function (evt) {
        let id = evt.layer.properties.id;
        let layerName = evt.layer.layerName;
        console.log(evt, id, layerName);
        // 设置矢量瓦片图层样式
        let selectStyle = {
          fillColor: '#800026',
          fillOpacity: 0.5,
          stroke: true,
          fill: true,
          color: 'red',
          opacity: 1,
          weight: 2
        };
        vectorLayer.setFeatureStyle(id, layerName, selectStyle);
      });
    }

会不会是我发布在iserver的电子地图有问题,或者说我传递给layerNames的子图层有问题

这个请求返回400错误,主要原因可能是:

1. layerNames参数值编码不正确。

根据错误提示,layerNames参数值"\[市@SiChuan"中的中文需要使用encodeURIComponent进行编码:

```
layerNames=%5B%E5%B8%82%40SiChuan
```

2. tileFeature接口不支持获取多层数据。

tileFeature接口只支持获取单层数据,不能一次获取多个layers数据。

3. 地图服务中没有名称为"市@SiChuan"的图层。

检查该地图服务中是否真的有该图层。layerNames值必须与服务实际图层名称相匹配。

4. 请求URL参数格式错误。

检查请求URL参数是否正确,例如layerNames是否作为参数传递。

5. 服务端地图服务配置问题。

检查服务端地图服务相关配置是否正确,例如是否开启了tileFeature接口等。

6. 客户端权限不足。

检查客户端是否有权限访问该地图服务的tileFeature接口。

这是gpt的回答

您看您那边方便吗,方便的话私信发我一下todesk的识别码和密码我远程帮您看一下哇
方便,"todesk的识别码和密码"这个是什么
远程桌面控制软件吗
对的对的
经验证是iclient的缺陷,后续缺陷修复后再联系您
...