首页 / 浏览问题 / WebGIS / 问题详情
获取的构件列表中,点击某个具体构件如何将视角定位过去
6EXP 2023年04月13日

1. 通过以下方式获取到构件列表(麻烦顺便帮我核实一下以下获取构建列表的代码是否有问题):

// 获取构件
  async getFeatures(layer: Cesium.S3MTilesLayer): Promise<any> {
    layer.indexedDBSetting.isAttributesSave = true; // 保存属性

    async function getDatasetAttributes(dataset) {
      const { startID, endID } = dataset;
      const attributePromises = [];
      for (let id = startID; id <= endID; id++) {
        attributePromises.push(layer.getAttributesById(id));
      }

      const res = await Promise.all(attributePromises);
      dataset.attributes = res.filter((item) => !!item);
    }

    const datasets = await layer.datasetInfo();
    const datasetPromises = datasets.map(getDatasetAttributes);
    await Promise.all(datasetPromises);
    return datasets;
  }

2. 点击某个构件,地图上就会定位到该构件。(目前只能通过以下方式设置高亮)

layer.selectedColor = Cesium.Color.CHARTREUSE; // 用户点击构件列表中某个构件设置选中 
layer.setSelection(SmID);

1个回答

您好,建议可以先获取到您点击对象viewer.selectedEntity的坐标信息,

构造定位信息使用viewer.camera的flyTo飞过去。

http://support.supermap.com.cn:8090/webgl/docs/Documentation/Camera.html

希望可以帮助到您。

9,633EXP 2023年04月13日

谢谢解答,另外还想请教一下:
我上面获取构件树的方法,获取到的是这种格式:

[{
    "datasetName": "幕墙嵌板_14号线_布吉站_装饰装修2020update",
    "startID": 27144,
    "endID": 39360,
    "attributes": []
},
{
    "datasetName": "专用设备_14号线_布吉站_装饰装修2020update",
    "startID": 39361,
    "endID": 68318,
    "attributes": []
}]

我想要的是每个不同ID的小构件就是一项,而不是startID和endID,请问我需要怎么做呢

viewer.selectedEntity是可以获取到点击地图上的构件,不过我的需求是点击构件列表(独立于地图的一个列表),地图定位到点击的构件处
这个没有理解您说的构件树是什么,构件树用的是我们WebGL的接口吗,是的话具体是哪个。

如果不在场景中的话,建议将对应的数据发布数据服务,使用数据的数据源名、数据集名、对象id,去数据服务里进行sql查询,

或者使用对象id, S3MTilesLayer.getAttributesById,查询出您对这个对象的xyz定位坐标。

http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#getFeatureBySQL

通过S3MLayer的datasetInfo();这个API会返回类似这样的数据:

[{
    "datasetName": "幕墙嵌板_14号线_布吉站_装饰装修2020update",
    "startID": 27144,
    "endID": 39360
},
{
    "datasetName": "专用设备_14号线_布吉站_装饰装修2020update",
    "startID": 39361,
    "endID": 68318
}]

接着使用遍历每项的startID和endID,通过layer.getAttributesById(id)获取子构件

或者您指导我怎样通过已知SmID来获取到具体的primitive

有所有对象的id,使用数据服务进行查询或者使用 S3MTilesLayer.getAttributesById都是可以的。

参考:

https://blog.csdn.net/m0_58818139/article/details/124662638

...