首页 / 浏览问题 / 三维GIS / 问题详情
scene.pick无法获取到对应的entity
21EXP 2024年04月28日

矢量面数据来自geojson文件,通过绘制entity并拉伸,想要实现在鼠标点击entity后,对应的entity会变透明,但是使用scene.pick无法获取到单击的entity,而使用scene.drillPick则在俯视的情况下获取不到,在斜着的情况下又有可能获取到,效果如下:

绘制entity代码如下:

window.viewer.entities.add({
                id: features[i].ID,
                polygon: {
                  hierarchy: Cesium.Cartesian3.fromDegreesArray(
                    features[i].geometry.points.flatMap((obj) =>
                      Object.values(obj)
                    )
                  ),
                  extrudedHeight: 40,
                  material: Cesium.Color.fromBytes(
                    style[0].red,
                    style[0].green,
                    style[0].blue,
                    255
                  ),
                  closeBottom: false,
                },
              });

单击事件如下:

var handler = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas);
          // 设置左键点击事件
          handler.setInputAction(function (event) {
            // 获取 pick 拾取对象
            var pick = window.viewer.scene.drillPick(event.position);
            // 判断是否获取到了 pick 
            if (Cesium.defined(pick)) {
              for (let i = 0; i < pick.length; i++) {
                if (typeof pick[i].id.id == 'number') {
                  let color = pick[i].id.polygon.material.color.getValue().clone();
                  pick[i].id.polygon.material.color.setValue(color.withAlpha(0.5));
                }
              }
            }
          }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

使用scene.pick获取到的是一个id为字符串的entity,猜测可能是底部的二维面,而使用scene.drillPick可能会获取到两个,第一个与scene.pick获取的一样,第二个为id为数字的entity,也就是单击的entity;也有可能只获取到第一个entity

怎么处理?

1个回答

您好,在 Cesium 中,当你使用多边形实体的 extrudedHeight 属性来拉伸时,该实体被视为一个整体,而不是一个可被拾取的表面。因此,直接使用 pick 方法可能无法准确地获取到被拉伸的面。您可以通过以下方法:

1、需要在绘制拉伸后的矢量面时,额外创建一个几何体表示其边界或者内部,并将这个几何体作为 Entity 添加到场景中,然后使用pick 方法来拾取这个额外的几何体

2、在idesktop中使用将矢量数据拉伸,使用【面拉伸生成模型瓦片】,然后发布三维服务加载到前端进行拾取

希望可以帮到您
680EXP 2024年04月29日
已解决,感谢回复!
...