Cesium Workshop

2018-08-22  本文已影响83人  布谷李

参考资料:
https://cesiumjs.org/tutorials/Cesium-Workshop/

https://github.com/geoadmin/workshop-cesium3d
https://github.com/AnalyticalGraphicsInc/cesium-workshop

概述

通过该教程,能够大致了解Cesium的功能,包括:

1. 设置和准备工作

设置

$ npm install
$ npm start
Cesium development server running locally.  Connect to http://localhost:8080

也可以使用python简易HTTP服务程序运行该web应用:

// Python2
$ python -m SimpleHTTPServer 8080
// Python3
$ python -m http.server 8080

打开浏览器,输入地址: http://localhost:8080
app目录简介:

CesiumJS与现有JavaScript库和框架兼容,如:

页面结构:

index.html: Cesium widget本身是1个div,关键代码包括:
包含CesiumJS,定义Cesium对象

<script src="ThirdParty/Cesium/Cesium.js"></script>

也可以在生产环境仅仅包含Cesium的某个模块 ThirdParty/Cesium/Source/ , 以便减少应用大小.
为Cesium Viewer widget创建1个div

<div id="cesiumContainer"></div>

添加app代码:

<script src="Source/App.js"></script>

在<head>标签中添加html元素样式(使用index.css文件)

<link rel="stylesheet" href="index.css" media="screen">

Cesium自带系列CSS,也可以引入

@import url(ThirdParty/Cesium/Widgets/widgets.css);

另外的样式可以用来覆盖Cesium的CSS.

流程

  1. 使用最喜欢的文本编辑器打开Source/App.js并删除内容.
  2. 复制 Source/AppSkeleton.jsSource/App.js.
  3. 确认 cesium-workshop 服务正在运行
  4. 线上web浏览器和切换到localhost:8080.
  5. 修改Source/App.js 并刷新页面

创建viewer

任何Cesium应用的基础都是Viewer, 一个交互的三维球,创建1个viewer并绑定到id 为"cesiumContainer" 的div上.

var viewer = new Cesium.Viewer('cesiumContainer');

默认情况下,场景能够处理鼠标和触控输入事件,如相机控制:

触控事件:

除球外,Viewer还默认提供了一些widget.


默认的Cesium Viewer
  1. 地名搜索 : 地名搜索工具,相机飞行到查询地点. 默认使用Bing Maps数据.
  2. 默认视图 : 视图复位,回到默认视图.
  3. 场景模式 : 切换模式3D, 2D 或2.5D (Columbus View).
  4. 基础图层 : 选择影像或地形图层.
  5. 帮助 : 帮助,提供默认相机控制方法.
  6. 动画 : 控制动画播放速度.
  7. 鸣谢 : 显示数据归属.
  8. 时间线 : 指示当前时间,允许用户跳到指定时间.
  9. 全屏 : 全屏.

这些widget的显示可以在创建Viewer时进行配置,详细参数见Viewer文档

var viewer = new Cesium.Viewer('cesiumContainer', {
    scene3DOnly: true,
    selectionIndicator: false,
    baseLayerPicker: false
});

Cesium ion

Cesium ion是一个三维数据切片和存储的平台,这里使用ion平台上存储的Sentinal-2 影像和Cesium World Terrain.
需要访问https://cesium.com/ion/ 注册一个免费账户,并在Access Tokens页面创建访问令牌.
Cesium ion默认提供5GB存储空间.

在创建viewer之前设置访问令牌:

Cesium.Ion.defaultAccessToken = '<YOUR ACCESS TOKEN HERE>';

添加影像图层

Cesium支持影像图层的添加、删除、排序、调整.
每个图层的亮度(brightness)、对比度(contrast)、灰度(gamma)、色相(Hue)、 饱和度(Saturation)都支持动态调整.

Cesium提供影像图层操作的很多方法,包括颜色调整(color adjustment)、图层混合(layer blending)等. 代码示例:

Cesium提供了多个影像图层提供者,包括:

其他内置影像图层提供者

当然,也可以通过实现[ImageryProvider接口 定义新的影像接入方式。以 SingleTileImageryProvider 为例简要介绍:

示例 - 使用Ion平台的Sentinel-2影像:

// Remove default base layer
viewer.imageryLayers.remove(viewer.imageryLayers.get(0));
// Add Sentinel-2 imagery
viewer.imageryLayers.addImageryProvider(new Cesium.IonImageryProvider({ assetId : 3954 }));

示例 - 加载ArcGIS Rest影像,打开Hello_world,使用以下代码更换:

var viewer = new Cesium.Viewer('cesiumContainer', {
    imageryProvider : new Cesium.ArcGisMapServerImageryProvider({
        url : '//services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
    }),
    baseLayerPicker : false
});

示例 - 添加TMS影像

var layers = viewer.scene.imageryLayers;
var blackMarble = layers.addImageryProvider(new Cesium.createTileMapServiceImageryProvider({
    url : '//cesiumjs.org/tilesets/imagery/blackmarble',
    maximumLevel : 8,
    credit : 'Black Marble imagery courtesy NASA Earth Observatory'
}));
//调整影像图层透明度、亮度
blackMarble.alpha = 0.5; // 0.0 is transparent.  1.0 is opaque.
blackMarble.brightness = 2.0; // > 1.0 increases brightness.  < 1.0 decreases.

示例 - 添加单个图片(给定角点坐标)

layers.addImageryProvider(new Cesium.SingleTileImageryProvider({
    url : '../images/Cesium_Logo_overlay.png',
    rectangle : Cesium.Rectangle.fromDegrees(-75.0, 28.0, -67.0, 29.75)
}));

完整代码

var viewer = new Cesium.Viewer('cesiumContainer', {
    imageryProvider : new Cesium.ArcGisMapServerImageryProvider({
        url : '//services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
    }),
    baseLayerPicker : false
});

var layers = viewer.scene.imageryLayers;
var blackMarble = layers.addImageryProvider(new Cesium.createTileMapServiceImageryProvider({
    url : '//cesiumjs.org/tilesets/imagery/blackmarble',
    maximumLevel : 8,
    credit : 'Black Marble imagery courtesy NASA Earth Observatory'
}));

blackMarble.alpha = 0.5; // 0.0 is transparent.  1.0 is opaque.

blackMarble.brightness = 2.0; // > 1.0 increases brightness.  < 1.0 decreases.

layers.addImageryProvider(new Cesium.SingleTileImageryProvider({
    url : '../images/Cesium_Logo_overlay.png',
    rectangle : Cesium.Rectangle.fromDegrees(-75.0, 28.0, -67.0, 29.75)
}));

添加地形图层

配置场景

上一篇下一篇

猜你喜欢

热点阅读