3D 模型可用于符号化 SceneView 中的点。例如,可以将树位置的数据集可视化为逼真的树。城市中的街道设施,如长椅或公共汽车站,可以使用逼真的 3D 模型。请查看使用真实 WebStyleSymbol 可视化要素 示例以查看此类可视化效果。
3D 模型可以作为 Web 样式(从 GeoScene Pro 发布到 GeoScene Online 或 Enterprise 的样式 )中的符号加载到 GeoScene Maps SDK for JavaScript 中,也可以作为 glTF 模型加载。使用 Web 样式 部分介绍了如何向应用程序添加 Web 样式以及如何自定义符号。GeoScene 提供了一组 3D 模型作为 Web 样式符号,您可以立即在应用程序中使用这些模型。此处 是这些模型的完整列表,其中包含用于将它们添加到应用的代码片段。如果您要查找的 3D 符号不在此列表中,则有几种方法可以将您自己的 3D 模型用作符号:
使用 Web 样式 GeoScene 以 Web 样式形式提供的 3D 符号 您可以使用 WebStyleSymbol 类向场景添加真实和示意图 3D 符号。此类提供对 API 中立即可用的数百个符号的访问。只需引用 styleName 和符号 名称即可创建所需的可视化效果。
1
2
3
4
5
6
7
8
9
10
var symbol = {
type : "web-style" , // autocasts as new WebStyleSymbol()
styleName : "EsriRealisticTransportationStyle" ,
name : "Audi_A6"
};
layer.renderer = {
type : "simple" , // autocasts as new SimpleRenderer()
symbol : symbol
};
有关有效 style Names
及其符号名称的完整列表,请参阅 GeoScene Web 样式符号指南页面 。
更改 Web样式符号大小和颜色 WebStyleSymbol 没有典型的符号属性,如 size
和 color
。它可以被认为是一个封装器,用于创建具有 ObjectSymbol3DLayer 或 IconSymbol3DLayer 的 PointSymbol3D 对象。要修改任何符号属性,必须先使用 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" , // autocasts as new 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;
});
使用实际 WebStyleSymbol 可视化要素 示例演示了此工作流。
使用可视变量时,不需要将 WebStyleSymbol 转换为 PointSymbol3D 实例。使用逼真的 3D 符号可视化要素 演示了如何将可视变量应用于引用 WebStyleSymbol 的渲染器,以根据实际测量值缩放真实符号的大小。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// scales the size of each symbol based on a real-world measurement
var renderer = {
type : "simple" , // autocasts as new SimpleRenderer()
symbol : {
type : "web-style" , // autocasts as new 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 2.1 开始,您可以将 3D 模型作为 Web 样式符号发布到 GeoScene Online 和 GeoScene Enterprise 10.6。您可以阅读 GeoScene Pro 文档 以了解如何共享 Web 样式。阅读此博客 文章,了解如何发布带有 3D 符号的 Web 样式。
发布 Web 样式后,可以使用 WebStyleSymbol 类在应用程序中加载其任何符号:
1
2
3
4
5
6
7
8
9
10
var symbol = {
type : "web-style" , // autocasts as new WebStyleSymbol()
styleName : "My3DSymbolsStyle" ,
name : "MySymbolName"
};
layer.renderer = {
type : "simple" , // autocasts as new SimpleRenderer()
symbol : symbol
};
该模式与 GeoScene 提供的 3D Web 样式符号相同。有关详细信息,请参阅使用 Web 样式 部分。
glTF 是一种基于 JSON 的 3D 模型开放标准,许多 3D 建模应用程序都支持该标准。支持 glTF 的软件的完整列表可以在官方 GitHub 存储库 中找到。此外,还有一些网站可以下载现成的 glTF 模型,其中一些是免费的。
从 JavaScript 4.11 版 GeoScene API 开始,有两个选项可以在应用程序中使用 glTF 模型:
作为使用 ObjectSymbol3DLayer 进行符号化的资源 导入到格网几何实例 使用 ObjectSymbol3DLayer glTF 格式的 3D 模型可以作为 ObjectSymbol3DLayer.resource 的 href 属性的源引用。如果要将模型用作点(例如树木、长凳、飞机等)的符号,请使用此选项。
在 GeoScene Maps SDK for JavaScript 中,您可以通过在服务器上托管 3D glTF 模型并将 ObjectSymbol3DLayer.resource 的 href 属性指向样式的 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" , // autocasts as new UniqueValueRenderer()
symbol : new PointSymbol3D({
symbolLayers : [
new ObjectSymbol3DLayer({
resource : {
// the dependencies referenced in the gltf file will be requested as well
href : "../3d-assets/model.gltf"
},
height : 3 ,
material : {
color : "red"
}
})
]
})
};
使用格网几何 加载 glTF 模型的另一种方法是使用 createFromGLTF() 方法将其导入为格网 几何。当模型表示 3D 几何(例如建筑物或地质模型)时,请使用此方法。应在导入时指定模型的地理位置。导入后,格网 几何可以在图形 中使用,并添加到 GraphicsLayer 或 view.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
// geographic location where the origin of the model will be placed
const location = new Point({
x : 8.540446 ,
y : 47.377887 ,
z : 50
});
Mesh.createFromGLTF(location, "../3d-model.gltf" )
.then( function ( geometry ) {
// increase it a factor of 3
geometry.scale( 3 , { origin : location});
// rotate it by 90 degrees around the z axis
geometry.rotate( 0 , 0 , - 90 );
// add it to a graphic
const graphic = new Graphic({
geometry,
symbol : {
type : "mesh-3d" , // autocasts as new MeshSymbol3D()
symbolLayers : [{
type : "fill" , // autocasts as new FillSymbol3DLayer()
material : {
color : [ 255 , 255 , 255 , 1 ],
colorMixMode : "tint"
}
}]
}
});
view.graphics.add(graphic);
})
.catch( console .error);
GeoScene Maps SDK for JavaScript 中的 glTF 支持
仅支持 glTF 版本 2.0。 glTF 文件必须包含单个场景。 场景可以包含任意数量的节点、格网和基元类型为 TRIANGLE
、TRIANGLE_ STRIP
或 TRIANGLE_ FAN
。POINTS
和 LINES
不受支持。 仅支持金属粗糙度类型的材料。 通过 MSFT lod 扩展 支持多个详细级别。 不支持动画、外观和相机定义。 注意 : 在版本 4.11 之前,可以通过使用 GeoScene Pro SDK 从 3D 模型导出 Web 3D 对象来完成添加客户端 3D 模型。尽管此方法仍然有效(有关详细信息,请参阅 GeoScene Pro SDK 存储库 ),我们仍建议您使用 glTF 格式的 3D 模型。