场景图层指南

字数统计: 2.4k
阅读时长: 约 5 分钟
当前版本: 4.29

什么是场景图层?

场景图层是一种经过优化的,用于显示大量 3D 数据的图层。场景图层支持以下数据类型:3D 对象、建筑物、集成式网格、点、点云或体素图层。场景图层符合索引 3D 场景图层 (I3S) 格式。I3S 格式是一种开放的 3D 内容传输格式,支持在移动、web 和桌面客户端展示。

在 3D 模式下显示信息是一种真实直观地理解和体验地理信息世界的方式。即使是不熟悉 GIS 的受众,也可以通过在 Web 上的 3D 场景中查看复杂和详细的数据,理解它们,捕获现实世界中对象的三维本质,可以更精确地分析、测量和查询信息。

在 GeoScene Maps SDK for JavaScript 中,场景图层有 5 种不同的类:SceneLayerBuildingSceneLayerPointCloudLayerIntegratedMeshLayerVoxelLayer。这种区分是必要的,因为每一图层都有不同的 API。但是,点场景图层和 3D 对象场景图层共用一个 API-SceneLayer 类,因为两者具有非常相似的功能。

下表列出了 API 中各种类支持的功能:

场景图层的类型API 类是否支持渲染器对象是否支持标注是否支持查询是否支持弹出窗口
3D 对象场景图层SceneLayer是 (请参阅 renderers)部分 (请参阅 SceneLayer 类的查询部分)是 (请参阅 popupTemplate)
点场景图层SceneLayer是 (请参阅 renderers)是 (请参阅 labelingInfo)部分 (请参阅 SceneLayer 类的查询部分)是 (请参阅 popupTemplate)
建筑场景图层BuildingSceneLayer是 (请参阅 renderers)部分 (请参阅 BuildingSceneLayer 类的查询部分)是 (请参阅 popupTemplate)
点云场景图层PointCloudLayer是 (请参阅 PointCloudRenderer 中支持的渲染器)
集成格网场景图层IntegratedMeshLayer
体素图层VoxelLayer是 (请参阅 popupEnabled)

场景图层的细节层次

为了提高性能,场景图层通常使用多个细节层次进行渲染。在大比例下 (接近地面),加载并显示所有几何。在小比例尺下,可以缩小至具有更少折点和更小纹理的几何粗糙表示,这样仍然具有良好的性能。除此之外,还移除了一些要素,此过程通常被称为要素抽稀处理。

对于点场景图层和点云图层,应用了要素稀疏化,因此在较小比例下,点会从显示中移除。

点和 3D 对象场景图层

点和 3D 对象场景图层共用同一 API 类:SceneLayer

3D 对象场景图层主要用于显示 3D 要素,如建筑物和城市场景中的其他元素。这种类型的几何称为 3D 对象。此图层类型用来实现城市的逼真视图或数据可视化。 点场景图层支持显示大量的点数据,最多可显示数百万个点。

city-scene-layer-guide

发布

与其他图层一样,SceneLayer 也可以通过渲染器设置样式、查询属性,但它们具有更复杂的内部逻辑。每个要素也都有一组属性,可用于创建可视化效果,或在弹出窗口中显示属性以获取更多信息。

SceneLayers 发布方式不同,对属性的访问会受到限制。以下是发布这些图层的两个工作流程的详细信息:

仅具有缓存属性的 SceneLayer

cached-scene-layer

关联要素图层的 SceneLayer

cached-scene-layer
定义 - 仅属性存储在服务缓存中。用户可以配置将哪些属性存储在缓存中。在这种情况下,只有已加载的要素可以访问属性,因此不能对整个数据集进行查询。这种类型的图层可用于样式化建筑物或显示视图内要素的信息。定义 - 一个 SceneLayer,其还连接到一个要素图层。通过关联要素图层,将实时应用对场景图层的编辑,并支持有限数量的编辑,直到需要重建缓存为止。此概念允许访问单个要素,同时受益于通过场景图层优化的显示。为缓存配置的 3D 对象要素的属性和网格几何也可通过关联的要素图层直接获得。以此方式发布图层时,所有要素都可访问所有属性,并且支持图层上的复杂查询。
发布:将场景图层包上传到 GeoScene Online 或 Portal (使用 GeoScene Pro或第三方软件创建) 时。发布:直接从 GeoScene Pro 发布到portal的场景图层。在 GeoScene Online 中,当从要素图层发布场景图层时,需使用具有发布者角色的组织帐户。

发布:GeoScene Online (beta) 中可编辑的编辑格网几何 (模型上传) 场景图层

要使用场景图层编辑功能 (在测试版中发布) 上传、更新和删除 3D 对象,需要通过以下方式发布服务。

使用最新的 GeoScene Pro 4.1 准备数据:

  1. 在文件地理数据库中创建 3D 对象要素类

  2. 添加存储格式 GLB (Khronos Group glTF binary),该格式支持在 web 上上传模型

    a. 打开 Analysis > Tools
    b. 搜索并打开 Add 3D Formats to multipatch
    c. 添加 .glb 并运行该工具

  3. 创建仅包含新 3D 对象要素类的文件地理数据库的 zip 文件

使用您的组织在 GeoScene Online 上发布数据:

  1. 上传 .zip 文件并作为要素图层发布

  2. 从已发布的要素图层发布场景图层

  3. 根据工作流,在要素图层上启用编辑功能

属性从何而来?

渲染器、视觉变量、弹出窗口、标注、过滤器和查询可从缓存或关联要素图层中检索属性,具体取决于图层的发布方式。下表总结了各种情况。

仅具有缓存属性的 SceneLayer具有关联要素图层的 SceneLayer
渲染器 / 视觉变量使用缓存的属性。如果关系要素图层是可编辑的,则使用关联要素图层的属性。*否则,将使用缓存的属性。
过滤器使用缓存的属性。如果关系要素图层是可编辑的,则使用关联要素图层的属性。*否则,将使用缓存的属性。
标注使用缓存的属性。如果关系要素图层是可编辑的,则使用关联要素图层的属性。*否则,将使用缓存的属性。
弹出窗口显示缓存的属性。显示关联要素图层的属性。
图层查询不支持。图层查询从关联要素图层的属性中获取结果。
LayerView 查询查询从当前加载要素的缓存属性中获取结果。如果关联要素图层是可编辑的,则查询会从关联要素图层的属性中获取结果。*否则,将使用缓存的属性。

* 编辑图层,图层会根据最新属性进行渲染,编辑要去个数不能超过 50,000。加载后,将会使用缓存的过时属性来渲染要素。要在 GeoScene Maps SDK for JavaScript 中编辑 SceneLayer,关联的要素图层需要启用编辑和更改追踪功能。

有关更多详细信息,请阅读 SceneLayer 类的描述。

提示和技巧

  • 如何对属性值统计?

您可在 SceneLayer 上使用 smartMapping summaryStatistics 方法。如果图层没有关联要素图层,则仅显示视图中加载的要素的统计数据。

  • 如何知道 SceneLayer 支持哪些功能?

每个字段都可以使用 getFieldUsageInfo() 方法来确定是否支持使用该字段配置弹出窗口、标注、渲染器或查询:

js
    sceneLayer.then(function () {
        // get information on whether `OBJECTID` is available for query:
        console.log(sceneLayer.getFieldUsageInfo("OBJECTID"));
        // the result shows that layer queries are not available for this field
        // this means that either the associated feature layer is not available
        // or that the field can't be found in the associated feature layer
        /\* Object {
            supportsLabelingInfo: true,
            supportsLayerQuery: false,
            supportsPopupTemplate: true,
            supportsRenderer: true
        }\*/

        // query layer for features
        sceneLayer
        .queryFeatures()
        .then(function (result) {
            console.log(result);
        })
        .catch(function (err) {
            console.error(err);
        });
        // querying the layer will result in an error:
        // message: "SceneLayer queries are not available without associated feature layer",
        // name: "scenelayer:query-not-available",
    });