目录
快速开始(Quick start)
随时可用的影像(Ready-to-use imagery)
影像提供商(imagery providers)
跨域资源共享(Cross-origin resource sharing)
影像提供商与图层(Imagery providers vs. layers)
资源(Resources)
Cesium支持从几个标准服务中绘制和分层高分辨率影像(地图)。图层可以排序并混合在一起。每一层的亮度、对比度、伽马、色相和饱和度都可以动态改变。本章教程将介绍影像图层概念和相关Cesium API。
让我们暂时忽略有关影像图层的详细内容,直接使用代码来添加一些影像图层。打开Sandcastle中的Hello World示例,其创建了一个Viewer小部件,该小部件默认情况下具有一个渲染Bing地图影像的图层。我们通过给Viewer构造函数提供的参数来指定不同的基础图层。让我们使用EsriArcGIS MapServer的图层:
var viewer = new Cesium.Viewer('cesiumContainer', {
imageryProvider : new Cesium.ArcGisMapServerImageryProvider({
url : '//services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
}),
baseLayerPicker : false
});
修改示例之后,按F8运行:
我们可以放大或者缩小,按需加载图层数据流。
接下来,添加另一个图层:使用Tile Map Service(TMS)获得NASA Black Marble imagery:
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'
}));
由于它是最后添加的,而且覆盖了整个地球,所以黑色图层覆盖了Esri图层。我们可以使用layers.lower(blackMarble)把黑色图层移动到底部,但是可以将它与Esri图层混合,这样就能更好理解这两个层之间的关系:
blackMarble.alpha = 0.5; // 0.0 is transparent. 1.0 is opaque.
其次,增加灯光的亮度:
blackMarble.brightness = 2.0; // > 1.0 increases brightness. < 1.0 decrease
最后,添加第三层,在特定范围内绘制单个图像。
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)
}));
在Sandcastle中查看完整示例(full example)。
接下来,我们将更详细地介绍最重要的图像层特性。首先,我们将介绍影像提供商,及它们支持访问影像的几个标准。
沙堡中的ion Assets tab包含Cesium托管的图像瓦片,可以通过几行代码添加到基于Cesium的应用程序中。
像上面使用的前两层高分辨率影像太大,无法装入内存,甚至常常无法装入单个硬盘,所以影像被分成小的图片,称为瓦片,它可以根据视图的需要加载到客户机。Cesium支持使用影像提供商请求瓦片的几个标准。大多数提供商使用HTTP中REST interface接口请求瓦片。影像提供商根据请求的格式和如何组织瓦片的不同而不同。Cesium有以下影像提供商:
通过实现影像提供商(ImageryProvider)的接口,我们可以访问其它影像服务。如果你这样做了,并且认为它是普遍有用的,请将它贡献(contribute)给Cesium,让大家都收益。
查看参考文档(reference documentation),如何构建一个特定的影像提供商。这里我们将介绍SingleTileImageryProvider,因为许多影像提供商共享它们的构建属性。
作为一种安全措施,今天的web浏览器尽力去阻止Javascript代码读取来自不同站点的图像像素。特别的是,像Cesium这样的WebGL应用程序禁止使用图像作为纹理(forbidden from using images as textures),如果这些图像(在我们的例子中是影像瓦片)来自不同的主机名或端口,并且服务器明确不允许以这种方式使用图像。服务器指明图像不包含机密信息,因此其它站点读取它们的像素是安全的,方法是在HTTP响应中包含跨域资源共享(Cross-Origin Resource Sharing(CORS))头。
不幸的是,并不是所有影像提供商支持CORS。对于不支持的,必须使用与托管Cesium网站相同来源的代理服务器。当使用这样的代理时,瓦片会出现在web浏览器和Cesium客户机上,就好像它们来自基于Cesium网站一样。为了使用影像提供商代理,当构建影像提供商时使用代理属性。在Node.js中,Cesium包含有以用户开发为目的的简单代理(simple proxy)。
layers.addImageryProvider(new Cesium.ArcGisMapServerImageryProvider({
url : '//server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer',
proxy : new Cesium.DefaultProxy('/proxy/')
}));
如果你正在托管共有影像,我们鼓励使用这里(here)描述的CORS,而不是使用代理。
到目前为止,我们还没有明确影像提供商和图像之间的区分。影像提供商使用特定的服务请求瓦片,而图层代表来自影像提供商的展示瓦片。代码如下:
var layer = layers.addImageryProvider(imageryProvider);
缩写为:
var layer = new ImageryLayer(imageryProvider);
layers.add(layer);
我们通常构建一个影像提供商只是为了创建图层,然后使用它的属性,例如显示、alpha、亮度和对比度,操作图层来改变它的视觉外观。查看ImageryLayer。影像提供商与图层之间的分离使得编写新的影像提供商显得更容易。
影像图层收集器,像上面例子中的layers,决定了绘制图层的顺序。图层依据它们加载的顺序从下到上绘制。在Cesium中,像其它收集器一样,图层收集器使用如添加、移除和获取函数进行操作。另外,图层可以使用raise、raiseTotop、lower和lowerToBottom被重新排序,查看ImageryLayerCollection。
查看Sandcastle中的影像图层示例:
另外,查看相关的参考文档: