Cesium中文教程-影像图层(Imagery Layers)

目录

快速开始(Quick start)

随时可用的影像(Ready-to-use imagery)

影像提供商(imagery providers)

跨域资源共享(Cross-origin resource sharing)

影像提供商与图层(Imagery providers vs. layers)

资源(Resources)


Cesium支持从几个标准服务中绘制和分层高分辨率影像(地图)。图层可以排序并混合在一起。每一层的亮度、对比度、伽马、色相和饱和度都可以动态改变。本章教程将介绍影像图层概念和相关Cesium API。

快速开始(Quick start)

让我们暂时忽略有关影像图层的详细内容,直接使用代码来添加一些影像图层。打开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运行:

Cesium中文教程-影像图层(Imagery Layers)_第1张图片

我们可以放大或者缩小,按需加载图层数据流。

接下来,添加另一个图层:使用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'  
}));  

Cesium中文教程-影像图层(Imagery Layers)_第2张图片

Cesium中文教程-影像图层(Imagery Layers)_第3张图片

由于它是最后添加的,而且覆盖了整个地球,所以黑色图层覆盖了Esri图层。我们可以使用layers.lower(blackMarble)把黑色图层移动到底部,但是可以将它与Esri图层混合,这样就能更好理解这两个层之间的关系:

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

Cesium中文教程-影像图层(Imagery Layers)_第4张图片

其次,增加灯光的亮度:

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

Cesium中文教程-影像图层(Imagery Layers)_第5张图片

最后,添加第三层,在特定范围内绘制单个图像。

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

Cesium中文教程-影像图层(Imagery Layers)_第6张图片

完整代码如下:

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)。

接下来,我们将更详细地介绍最重要的图像层特性。首先,我们将介绍影像提供商,及它们支持访问影像的几个标准。

随时可用的影像(Ready-to-use imagery)

沙堡中的ion Assets tab包含Cesium托管的图像瓦片,可以通过几行代码添加到基于Cesium的应用程序中。

影像提供商(imagery providers)

像上面使用的前两层高分辨率影像太大,无法装入内存,甚至常常无法装入单个硬盘,所以影像被分成小的图片,称为瓦片,它可以根据视图的需要加载到客户机。Cesium支持使用影像提供商请求瓦片的几个标准。大多数提供商使用HTTP中REST interface接口请求瓦片。影像提供商根据请求的格式和如何组织瓦片的不同而不同。Cesium有以下影像提供商:

  • Web Map Service(WMS)-一种OGC标准,从分布式地理数据库中请求地理区域的地图瓦片。Cesium中,查看WebMapServiceImageryProvider;
  • Tile Map Service(TMS)-访问地图瓦片的REST接口。可以使用MapTiler或GDAL2Tiles生成瓦片。Cesium中,查看TileMapServiceImageryProvider;
  • OpenGIS Web Map Tile Service(WMTS)-一种OGC标准,用于在Internet上提供预渲染的地理参考地图瓦片。在Cesium中,查看WebMapServiceImageryProvider;
  • OpenStreetMap-访问开放街景瓦片(OpenStreetMap tiles)或Slippy map tiles。有几种方式能托管这种瓦片(host these tiles)。在Cesium中,查看createOpenStreetMapImageryProvider;
  • Bing Maps-使用Bing Maps REST Services访问瓦片。从https://www.bingmapsportal.com.创建一个Bing Maps key。在Cesium中,查看BingMapsImageryProvider;
  • Esri ArcGIS MapServer-使用ArcGIS Server REST API访问托管在ArcGIS MapServer中的瓦片。在Cesium中,访问ArcGisMapServerImageryProvider;
  • Google Earth Enterprise-提供影像访问,这些影像托管在组织的谷歌Earth企业服务器中。在Cesium中,查看GoogleEarthImageryProvider;
  • Mapbox-使用Mapbox API访问瓦片。需要创建一个账号并提供你访问token(access token)。在Cesium中,查看MapboxImageryProvider;
  • 标准影像文件-从单一影像创建瓦片。在Cesium中,查看SingleTileImageryProvider;
  • Custom tilling schemes(自定义瓦片方案)-使用UrlTemplateImageryProvider,我们可以使用URL模板连接到大量的影像源。例如,一个TMS URL模板:
  • //cesiumjs.org/tilesets/imagery/naturalearthii/{z}/{x}/{reverseY}.jpg  
  • Tile coordinates-通过在每个瓦片周围画一个边界并标记其为水平坐标、x坐标和y坐标,来展示如何在特定铺设方案中将地球划分为多个瓦片。

通过实现影像提供商(ImageryProvider)的接口,我们可以访问其它影像服务。如果你这样做了,并且认为它是普遍有用的,请将它贡献(contribute)给Cesium,让大家都收益。

查看参考文档(reference documentation),如何构建一个特定的影像提供商。这里我们将介绍SingleTileImageryProvider,因为许多影像提供商共享它们的构建属性。

  • url-影像url,像许多影像提供商一样,这是唯一需要的属性。在其它影像提供商中,这些url指定服务器或者服务器的根(root)url;
  • extent-影像应覆盖的可选经纬度矩形,默认是覆盖整个地球;
  • credit-引用数据源的可选字符串,其显示在画布上。一些影像提供商,像BingMapsImageryProvider和ArcGIS Server REST API,直接从它们的服务器获取一个引用logo或字符串;
  • proxy-用户服务请求的可选代理,使我们可以跨域资源共享。

跨域资源共享(Cross-origin resource sharing)

作为一种安全措施,今天的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,而不是使用代理。

影像提供商与图层(Imagery providers vs. layers)

到目前为止,我们还没有明确影像提供商和图像之间的区分。影像提供商使用特定的服务请求瓦片,而图层代表来自影像提供商的展示瓦片。代码如下:

var layer = layers.addImageryProvider(imageryProvider);  

缩写为:

var layer = new ImageryLayer(imageryProvider);  
layers.add(layer);  

我们通常构建一个影像提供商只是为了创建图层,然后使用它的属性,例如显示、alpha、亮度和对比度,操作图层来改变它的视觉外观。查看ImageryLayer。影像提供商与图层之间的分离使得编写新的影像提供商显得更容易。

影像图层收集器,像上面例子中的layers,决定了绘制图层的顺序。图层依据它们加载的顺序从下到上绘制。在Cesium中,像其它收集器一样,图层收集器使用如添加、移除和获取函数进行操作。另外,图层可以使用raise、raiseTotop、lower和lowerToBottom被重新排序,查看ImageryLayerCollection。

资源(Resources)

查看Sandcastle中的影像图层示例:

  • 影像图层(Imagery Layers)-本教程中的代码示例;
  • 影像图层操作(Imagery Layers Manipulation)-来自多个源的图层影像,并调整每个独立的alpha。
  • 影像调整(Imagery Adjustment)-调整一个影像图层的亮度、对比度、gamma、色相和饱和度。

另外,查看相关的参考文档:

  • All imagery providers;
  • ImageryLayer;
  • ImageryLayerCollection。

你可能感兴趣的:(Cesium中文教程,Cesium中文教程,javascript)