cesium:1.99;Supermap3D:SuperMap iClient JavaScript 11i(2023);
官方下载文档链家:SuperMap技术资源中心|为您提供全面的在线技术服务
示例参考:support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#analysis
support.supermap.com.cn:8090/webgl/examples/webgl/examples.html
Cesium:场景初始化、渲染、Bing地图、S3M图层加载。
SuperMap3D:可视域分析、S3M图层加载、裁剪区域绘制、Knockout绑定等功能。
两者结合:Cesium 提供基础渲染和事件处理,SuperMap3D 提供高级的功能实现。
Cesium.Ion.defaultAccessToken = '...';
var viewer = new Cesium.Viewer('Container', {
selectionIndicator: false,
infoBox: false,
terrainProvider: Cesium.createWorldTerrain()
});
viewer.resolutionScale = window.devicePixelRatio;
Cesium.Ion.defaultAccessToken
用于访问 Cesium Ion 服务,viewer
是 Cesium Viewer 的实例,它用于创建一个可视化容器,其中指定了Container
元素来渲染场景。createWorldTerrain()
设置了全球地形服务,resolutionScale
提高了分辨率,以适应高DPI屏幕。viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({
url: 'https://dev.virtualearth.net',
mapStyle: Cesium.BingMapsStyle.AERIAL,
key: URL_CONFIG.BING_MAP_KEY
}));
BingMapsImageryProvider
添加了 Bing 地图的航拍图层。Cesium 的图层管理方式主要通过 imageryLayers.addImageryProvider()
实现。var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function (e) {
//...
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
ScreenSpaceEventHandler
) 和鼠标移动事件 (MOUSE_MOVE
)。这是 Cesium 的交互控制,通过捕捉鼠标操作来对场景进行更新。var viewshed3D = new SuperMap3D.ViewShed3D(scene);
SuperMap3D.ViewShed3D
是用于在 3D 场景中执行可视域分析的类,用于计算某个点是否可见。var promise = scene.open('http://www.supermapol.com/realspace/services/3D-CBD-2/rest/realspace');
SuperMap3D.when(promise, function (layers) {
// 设置相机位置等操作
}, function (e) {
// 错误处理
});
scene.open()
加载了 SuperMap3D 的 S3M 图层,这个图层是 SuperMap 提供的特定格式,通常用于大规模3D场景的渲染和展示。var handlerPolygon = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Polygon, 0);
handlerPolygon.movingEvt.addEventListener(function (windowPosition) {
if (handlerPolygon.isDrawing) {
tooltip.showAt(windowPosition, '绘制相交区域(右键结束绘制)
'); // 绘制提示
}
});
handlerPolygon.drawEvt.addEventListener(function (result) {
var array = [].concat(result.object.positions);
var positions = [];
for (var i = 0, len = array.length; i < len; i++) {
var cartographic = SuperMap3D.Cartographic.fromCartesian(array[i]);
var longitude = SuperMap3D.Math.toDegrees(cartographic.longitude);
var latitude = SuperMap3D.Math.toDegrees(cartographic.latitude);
var h = cartographic.height;
positions.push(longitude, latitude, h);
}
viewshed3D.addClipRegion({name: 'test', position: positions}); // 添加裁剪区域
});
SuperMap3D.DrawHandler
绘制多边形区域,viewshed3D.addClipRegion()
函数则用于将绘制的区域应用到可视域分析对象中,进行裁剪。DrawHandler
用于激活绘制多边形裁剪面的功能。movingEvt
事件在绘制过程中显示提示信息。drawEvt
事件在绘制完成时获取多边形的坐标,并将其设置为可视域的裁剪区域。SuperMap3D.knockout.track(viewModel);
SuperMap3D.knockout.applyBindings(viewModel, toolbar);
viewModel
与 UI 绑定。这个功能允许动态更新可视域分析的参数。Cesium 在整个代码中主要负责场景渲染、基础交互和图层的管理,如初始化 Viewer、处理鼠标事件、添加图层等。而 SuperMap3D 负责具体的功能实现,比如可视域分析、S3M 图层加载、裁剪操作等。
两者通过 viewer.scene
来共享场景,SuperMap3D 的功能在 Cesium 的场景之上实现。例如:
var viewshed3D = new SuperMap3D.ViewShed3D(scene);
—— 这里的 scene
是 Cesium 场景,而 viewshed3D
是 SuperMap3D 的可视域对象,它依赖于 Cesium 的场景。
可视域分析
注意替换Cesium.Ion.defaultAccessToken,以及天地图官网申请的密钥