首页 / 浏览问题 / 三维GIS / 问题详情
mvt 地图服务,querySourceFeatures 查询不到结果
20EXP 2022年08月04日
iClient3D-vue-master 工程中,官方的mvt 图层查询,可以获取到Features,自定义发布的矢量瓦片,自定义发布的IServer UGC5(MVT)瓦片无法获取到Features。发布的mvt服务确定带了属性的;

    let features = selectedLayer.querySourceFeatures({

                sourceLayer: selectedChildLayer.id,

                filter: []

            });

            console.log('featuresfeaturesfeatures', features);

1个回答

您好,

您这边的“ 无法获取到Features ”是报错还是空值还是查询失败呢?

如果是报错的话麻烦提供一下报错内容。

如果是空值,您这边查看一下服务里是否有这个值,请求是否成功发出并收到请求。

如果是查询失败,您确定一下是否是发布的数据服务。

示例的话,详情应该查看SQL查询示例:http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#getFeatureBySQL

4,151EXP 2022年08月04日
是查询为空值[],查询不到数据;但是我发现,发布的专题图层,可以查询到数据;一般图层,查询为空,请问mvt服务,querySourceFeatures 这个查询接口,只是针对专题图层吗?还是在地图切图的时候,做哪些配置?
查询为空的情况您注意该语句在执行时所发起的请求,如果您这边确定时发布了数据服务,首先查看对应的数据服务中的数据是否正常。其次查看字段等代码书写是否正常。

至于配置的话没有特殊配置,一般图层和专题图层按理说也没有大的区别,您也注意一下坐标系是否正常。

SQL查询的示例您多查看一下,包括请求对应的数据服务,您那边也是能查看的。注意一下和您这边的数据、代码的区别

http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#MVT 我使用的是这个

  $("#attributeQuery").on("click", function () {
            var mapboxStyle = mvtMap.mapboxStyle;

            var result = mvtMap.querySourceFeatures({
                sourceLayer: selectLayer.id,
                filter: ["==", "$id", 1],
            });
            if (result.length > 0) {
                var properties = result[0].properties
                if (!properties) {
                    return;
                }

                for (i = table.rows.length - 1; i > -1; i--) {
                    table.deleteRow(i);
                }
                $("#bubble").show();

                var newRow = table.insertRow();
                var cell1 = newRow.insertCell();
                var cell2 = newRow.insertCell();
                cell1.innerHTML = "<b style='font-size: 1.00rem;'>属性</b>";
                cell2.innerHTML = "<b style='font-size: 1.00rem;'>值</b>";


                for (var key in properties) {
                    var newRow = table.insertRow();
                    var cell1 = newRow.insertCell();
                    var cell2 = newRow.insertCell();
                    cell1.innerHTML = key;
                    cell2.innerHTML = properties[key];
                }
            }
        });
 

mvt服务的话 features不能这么使用

首先您看127-133行的代码,是添加mvt图层( 新建一个矢量瓦片地图)

然后是319用到了querySourceFeatures方法(这是MVT的属性查询)

点击对象进行查询的话则387行是方法queryRenderedFeatures( 根据几何坐标查询被渲染的features )

您的问题用到的是querySourceFeatures方法,但是您这个是根据点击的图层来查询,有点不伦不类的,方法位于VectorTilesMap矢量瓦片地图类。

麻烦您看下,我通过addVectorTilesMap 添加了5个地图服务;

let mvtMap = viewer.scene.addVectorTilesMap({

            url: LayerURL,

            canvasWidth: 512,

            name: name || 'mvt',

            viewer: viewer

        });

然后在搜索功能那里,通过以下方法获取到了发布的服务,并做了查询操作,查询返回【】,我还是没有太明白哪个地方用的不对?麻烦辛苦帮忙看下。

let mvtLayers = viewer.scene._vectorTileMaps._layerQueue;//获取所有的mvt图层

      console.log('mvtLayers', mvtLayers);

      let layer = mvtLayers[1];

      let features = layer.querySourceFeatures({

        sourceLayer: '普通国道_2021@20220719_1(0_21)', filter: []

      })

      console.log('features', features)

您这个 querySourceFeatures 方法,使用不太准确。

您查看示例,应该是作为矢量地图的方法使用的,319行。

VectorTilesLayer,矢量瓦片图层类,并没有这个方法。

根据示例也可以得知:

var result = mvtMap.querySourceFeatures({
sourceLayer: selectLayer.id, //子图层名称
filter: ["like","NAME","京"] //设置模糊查询过滤条件。如此处可以查出NAME属性带“京”的要素。
})

属性参数sourceLayer是子图层名称

1、这个例子,就是一个矢量瓦片;

2、就是那个子图层名称,前面的值确取的是selectlayer.id,所以这个备注跟前面选用的,非常容易产生误解,这里应该用selectLayer.source-layer,刚方法就能有效了

3、如果凑巧这selectlayer.id、selectLayer.source-layer 两个值相同,这个方法就能执行;估计专题图可以,就是因为这个原因;官方最好把这个id 跟后面后面备注那个子图层名称统一了;

1,官网mvt实例数据:https://www.supermapol.com/realspace/services/map-mvt-JingJinDiQuDiTu/restjsr/v1/vectortile/maps/%E4%BA%AC%E6%B4%A5%E5%9C%B0%E5%8C%BA%E5%9C%B0%E5%9B%BE;

2,3D WebGL API (supermap.com.cn) 官方api 文档地址;

3,MVT (supermap.com.cn) 官网mvt 实例地址

遇到同样问题的小伙伴,确保切矢量瓦片,勾选带属性,这个参数:sourceLayer,传的是mvt 图层里面获取的source-layer,不是那个id,踩了个大坑,花费了三四天才走出来;

...