使用 3D 符号可视化点

3D 模型可用于符号化 SceneView 中的点。例如,包含树位置的数据集可以可视化为真实的树。对于城市中的街道设施,如长凳或公共汽车站,可以使用逼真的 3D 模型。

street-lamp

3D 模型可以作为 Web 样式(从 GeoScene Pro 发布到 GeoScene Online 或 Enterprise 的样式)中的符号加载到 GeoScene API for JavaScript 中,也可作为 glTF 模型加载。使用 Web 样式部分介绍了如何向应用程序添加 Web 样式以及如何自定义符号。GeoScene 提供了一组 3D 模型作为 Web 样式符号,您可以立即在应用程序中使用这些符号。以下是这些模型的完整列表,其中包含用于将其添加到应用的代码片段。如果要查找的 3D 符号不在此列表中,则可以使用几种方法将您自己的 3D 模型用作符号:

使用 Web 样式

作为 Web 样式提供的 3D 符号

您可以使用 WebStyleSymbol 类向场景中添加逼真的逻辑示意图 3D 符号。此类提供对 API 中立即可用的数百个符号的访问。只需引用符号的 styleNamename 即可创建所需的可视化。

          
1
2
3
4
5
6
7
8
9
10
var symbol = {
  type: "web-style",  // 自动转换为新的 WebStyleSymbol()
  styleName: "EsriRealisticTransportationStyle",
  name: "Audi_A6"
};

layer.renderer = {
  type: "simple",  // 自动转换为新的 SimpleRenderer()
  symbol: symbol
};

有关有效 styleNames 及其符号名称的完整列表,请参阅 Web 样式符号指南页面

更改 WebStyleSymbol 大小和颜色

WebStyleSymbol 没有典型的符号属性,如 sizecolor。可将其看做一个包装器,用于创建具有 ObjectSymbol3DLayerIconSymbol3DLayerPointSymbol3D 对象。要修改任何符号属性,必须首先使用 WebStyleSymbol.fetchSymbol()WebStyleSymbol 转换为常规符号。

                  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var symbol = {
  type: "web-style",  // 自动转换为新的 WebStyleSymbol()
  styleName: "EsriRealisticTransportationStyle",
  name: "Ambulance"
};

symbol.fetchSymbol()
  .then(function(ambulanceSymbol){
    var objectSymbolLayer = ambulanceSymbol.symbolLayers.getItemAt(0);
    objectSymbolLayer.material = { color: "red" };
    objectSymbolLayer.height *= 2;
    objectSymbolLayer.width *= 2;
    objectSymbolLayer.depth *= 2;

    var renderer = layer.renderer.clone();
    renderer.symbol = ambulanceSymbol;
    layer.renderer = renderer;
  });

使用真实 WebStyleSymbols 可视化要素示例演示了此工作流。

使用视觉变量时,WebStyleSymbols 不需要转换为 PointSymbol3D 实例。使用逼真的 3D 符号可视化要素演示了如何将视觉变量应用于引用 WebStyleSymbols 的渲染器,以根据实际测量值缩放逼真符号的大小。

                      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 根据实际测量值缩放每个符号的大小

var renderer = {
  type: "simple",  // 自动转换为新的 SimpleRenderer()
  symbol: {
    type: "web-style",  // 自动转换为新的 WebStyleSymbol()
    styleName: "EsriRealisticTreesStyle",
    name: "Other"
  },
  label: "generic tree",
  visualVariables: [{
    type: "size",
    axis: "height",
    field: "Height",
    valueUnit: "feet"
  }, {
    type: "size",
    axis: "width-and-depth",
    field: "canopy_diameter",
    valueUnit: "feet"
  }]
};

将自定义 3D 模型发布为 Web 样式符号

从 GeoScene Pro 1.2.1 开始,您可将 3D 模型作为 Web 样式符号发布到 GeoScene Online 和 GeoScene Enterprise 1.6。您可以阅读 GeoScene Pro 文档,以了解如何共享 Web 样式。阅读此博客文章,了解如何使用 3D 符号发布 Web 样式。

发布 Web 样式后,可以使用 WebStyleSymbol 类在应用程序中加载其任何符号:

          
1
2
3
4
5
6
7
8
9
10
var symbol = {
  type: "web-style",  // 自动转换为新的 WebStyleSymbol()
  styleName: "My3DSymbolsStyle",
  name: "MySymbolName"
};

layer.renderer = {
  type: "simple",  // 自动转换为新的 SimpleRenderer()
  symbol: symbol
};

该模式与 GeoScene 提供的 3D Web 样式符号相同。有关详细信息,请参阅使用 Web 样式部分。

使用 glTF 格式的自定义 3D 模型

glTF 是一种基于 JSON 的 3D 模型开放标准,许多 3D 建模应用程序均支持该标准。支持 glTF 的软件的完整列表可以在官方 GitHub 存储库中找到。此外,还可以在一些网站中下载现成的 glTF 模型,其中一些是免费的。

从 GeoScene API for JavaScript 4.11 版本开始,在应用程序中可利用两个选项使用 glTF 模型:

  • 作为使用 ObjectSymbol3DLayer 进行符号化的资源
  • 导入到 Mesh 几何实例中

使用 ObjectSymbol3DLayer

glTF 格式的 3D 模型可以作为 ObjectSymbol3DLayer.resourcehref 属性的源引用。如果要将模型用作点(例如树、长凳、飞机等)的符号,请使用此选项。

在 GeoScene API for JavaScript 中,您可以通过在服务器上托管 3D glTF 模型并将 ObjectSymbol3DLayer.resourcehref 属性指向样式的 URL 来使用它们。该 URL 可以指向引用外部二进制资源(.bin 文件和纹理)的 glTF 文件 (.gltf)或单个二进制文件(.glb)。

                 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const simpleRenderer = {
  type: "simple", // 自动转换为新的 UniqueValueRenderer()
  symbol: new PointSymbol3D({
    symbolLayers: [
      new ObjectSymbol3DLayer({
        resource: {
          // gltf 文件中引用的依赖项也将被请求
          href: "../3d-assets/model.gltf"
        },
        height: 3,
        material: {
          color: "red"
        }
      })
    ]
  })
};

使用格网几何

加载 glTF 模型的另一种方法是使用 createFromGLTF() 方法将其作为 Mesh 几何导入。当模型表示 3D 几何(例如建筑物或地质模型)时,请使用此方法。导入时应指定模型的地理位置。导入后,Mesh 几何可以在图形中使用,并添加到 GraphicsLayerview.graphics 中。您可以使用 offset()rotate()scale() 等方法进一步修改模型的位置。

                                 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

// 放置模型原点的地理位置
const location = new Point({
  x: 8.540446,
  y: 47.377887,
  z: 50
});

Mesh.createFromGLTF(location, "../3d-model.gltf")
  .then(function(geometry) {
    // 将其增加 3 倍
    geometry.scale(3, {origin: location});
    // 绕 z 轴旋转 90 度
    geometry.rotate(0, 0, -90);

    // 将其添加到图形中
    const graphic = new Graphic({
      geometry,
      symbol: {
        type: "mesh-3d", // 自动转换为新的 MeshSymbol3D()
        symbolLayers: [{
          type: "fill", // 自动转换为新的 FillSymbol3DLayer()
          material: {
            color: [255, 255, 255, 1],
            colorMixMode: "tint"
          }
        }]
      }
    });

    view.graphics.add(graphic);
  })
  .catch(console.error);

GeoScene API for JavaScript 中的 glTF 支持

  • 仅支持 glTF 版本 2.0。
  • glTF 文件必须包含单个场景。
  • 场景可以包含任意数量的节点、格网和 TRIANGLETRIANGLE_STRIPTRIANGLE_FAN 基元类型。不支持 POINTSLINES
  • 仅支持 Metallic-Roughness 类型的材料。
  • 通过 MSFT lod 扩展支持多个细节级别。
  • 不支持动画、皮肤和照相机定义。

:在版本 4.11 之前,可以通过使用 GeoScene Pro SDK 从 3D 模型导出 Web 3D 对象来添加客户端 3D 模型。尽管此方法仍然有效(请参阅 GeoScene Pro SDK 存储库中的详细信息),但建议您使用 glTF 格式的 3D 模型。

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.