自学内容网 自学内容网

【WebGIS】Cesium:地形加载

在 Cesium 中,地形数据用于提供三维场景的高度信息,使得地球表面的细节更加逼真。地形加载是 Cesium 应用中的关键功能,支持各种地形源和格式,如 Cesium Ion 服务、Terrain Server 等。本文将系统介绍如何在 Cesium 中加载、配置、定制地形,逐步深入各个功能点。

地形基础概念

地形数据在 Cesium 中用于表示地球表面的高程信息,使得地面不再是简单的平面。通过加载地形,您可以在 Cesium 场景中展示山脉、谷地等地貌的三维特征,提升视觉效果和用户的沉浸感。

Cesium 支持以下几种地形数据格式:

  • Cesium Ion 地形:由 Cesium 官方提供的全球高精度地形数据源。
  • 自定义地形服务:可以加载来自第三方的地形数据。
  • 地形格式:Cesium 支持的地形格式包括 Quantized MeshHeightmap,前者更常用且能提供更高的渲染性能。

Cesium 地形加载方式

Cesium 提供了多种方式加载地形数据。我们首先从最常用的 Cesium Ion 地形服务讲起。

使用 Cesium Ion 加载地形

Cesium Ion 提供了全球的高精度地形数据,可以轻松集成到您的 Cesium 应用中。

步骤1:创建 Viewer 并加载 Cesium Ion 地形

const viewer = new Cesium.Viewer('cesiumContainer', {
    terrainProvider: Cesium.createWorldTerrain() // 使用 Cesium Ion 的全球地形
});

Cesium.createWorldTerrain() 是 Cesium 内置的方法,用于直接从 Cesium Ion 加载全球地形数据,包含高精度山脉、山谷和水体细节。

步骤2:设置 Cesium Ion 令牌

为了访问 Cesium Ion 服务,您需要注册并获取 Cesium Ion API 令牌。将该令牌添加到应用中:

Cesium.Ion.defaultAccessToken = 'YOUR_CESIUM_ION_TOKEN';

此步骤确保您可以无缝访问 Cesium 的全球地形数据和其他在线资源。

自定义 Heightmap 地形加载

除了使用 Cesium Ion 服务,你还可以加载自定义的地形数据,例如基于 Heightmap 格式的地形数据。Cesium 支持 Web 地形服务(WMS)和 Web 地形图块服务(WMTS)。

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

// 使用 Cesium Terrain Provider 加载自定义地形服务
const terrainProvider = new Cesium.CesiumTerrainProvider({
    url: 'https://your-terrain-server/heightmap/',  // 自定义地形数据服务URL
    requestVertexNormals: true,  // 请求法线,增强视觉效果
    requestWaterMask: true       // 请求水体遮罩,用于渲染水体
});

// 将地形数据应用到 Cesium Viewer
viewer.terrainProvider = terrainProvider;

// 让相机飞到一个高程区域
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(121.0, 31.0, 3000.0)  // 上海附近
});

  • Cesium.CesiumTerrainProvider:用于加载自定义的地形服务,可以是本地服务器或者在线地形服务。
  • requestVertexNormals:请求法线数据,法线用于改进地形的光照效果。
  • requestWaterMask:请求水体遮罩数据,支持水面渲染效果。

量化网格(Quantized Mesh)地形加载

Quantized Mesh 是一种压缩格式,将地形数据以三角网格的形式存储,能够高效地处理大规模地形数据。Cesium 原生支持这种格式,常见的使用场景是加载高精度的地形数据。

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

// 使用 Quantized Mesh 地形服务
const terrainProvider = new Cesium.CesiumTerrainProvider({
    url: 'https://assets.cesium.com/1/',  // Ion 提供的量化网格地形服务
    requestVertexNormals: true,  // 启用法线数据,增强渲染效果
});

// 应用量化网格地形
viewer.terrainProvider = terrainProvider;

// 飞到高程变化较大的区域
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, 3000.0)  // 美国西海岸区域
});
  • 量化网格格式相比传统的 Heightmap 更加高效,能够提供更高的精度并减少带宽需求。
  • 使用 Cesium Ion 提供的量化网格服务时,通常会请求法线和水体遮罩数据,以增强渲染效果。

地形细节与配置

地形加载完成后,您可以进一步对地形进行细节配置,包括调整采样精度、开启阴影等。

设置地形的采样精度

Cesium 允许您控制地形的采样精度。更高的采样精度能展示更多地形细节,但也会消耗更多的系统资源。

viewer.scene.terrainProvider = Cesium.createWorldTerrain({
    requestVertexNormals: true,  // 开启地形的法线
    requestWaterMask: true       // 开启水体遮罩
});

requestVertexNormalsrequestWaterMask 可以进一步提升地形的视觉效果,尤其是在有光照或水体的场景中。

添加地形阴影

地形阴影为场景增加了光影效果,使得场景更具立体感。可以通过设置地形接收或投射阴影来启用此功能:

viewer.shadows = true;  // 启用场景中的阴影

viewer.terrainShadows = Cesium.ShadowMode.ENABLED;  // 启用地形阴影

进阶功能

在了解了基础的地形加载后,您可以通过 Cesium 提供的进阶功能,进一步调整和定制地形表现。

地形裁剪与高度限制

Cesium 支持对地形进行裁剪或设置高度限制。可以使用地形裁剪平面(Clipping Planes)来裁剪场景中的部分地形,例如展示地下结构等。

const clippingPlane = new Cesium.ClippingPlane(new Cesium.Cartesian3(0, 0, -1), 0);

viewer.scene.globe.clippingPlanes = new Cesium.ClippingPlaneCollection({
    planes: [clippingPlane],
    edgeColor: Cesium.Color.RED
});

这个例子展示了如何使用 ClippingPlane 对地形进行裁剪,并显示裁剪边缘的颜色。

地形夸张(Terrain Exaggeration)

您可以通过地形夸张功能,放大地形的高差,使地形特征更加明显。常用于对平坦地形进行夸大展示。

viewer.scene.terrainExaggeration = 2.0;  // 将地形高度放大两倍

此设置将当前地形的所有高度值按 2 倍放大,使山脉和谷地等地貌特征更加突出。

地形叠加

地形叠加允许您将影像图层、矢量数据与地形叠加,从而更好地展示地理数据。可以通过 ImageryLayer 将卫星影像或地图叠加到地形之上。

const imageryLayer = viewer.imageryLayers.addImageryProvider(
    new Cesium.UrlTemplateImageryProvider({
        url: 'https://your-tile-server/{z}/{x}/{y}.png'
    })
);

此示例将在线瓦片地图叠加到地形表面,增强场景的现实感。
要发布基于 Heightmap 格式的地形数据并在 Cesium 中加载,可以通过多种方式实现,包括使用 Cesium 的在线服务 Cesium ion、搭建 Web 地形服务(WMS)和 Web 地形图块服务(WMTS)。下面详细介绍如何个人发布地形数据,尤其是基于 Heightmap 的地形数据,并在 Cesium 中使用。

地形数据发布

Heightmap 是一种常见的地形数据格式,每个像素表示地形的高程值。Cesium 支持加载基于 Heightmap 格式的地形,并将其展示为三维地形。通常,Heightmap 会被分块处理,以便按需加载和渲染。

使用 Cesium ion 发布地形数据

Cesium ion 是一个便捷的在线服务,个人可以上传、托管并发布地形数据,而无需自行搭建服务器。

  1. 注册并登录 Cesium ion:
    访问 Cesium ion,注册并登录个人账户。

  2. 上传 Heightmap 地形数据:

    • 登录后,进入 “Assets” 管理页面。
    • 点击“Upload Assets”上传你的 Heightmap 地形文件,支持的格式包括 .tif.asc 等。
    • 选择 “Terrain” 类型,Cesium ion 将自动处理地形数据,并生成可在 Cesium Viewer 中使用的量化网格地形。
  3. 发布并加载地形数据:
    上传完成后,你会获得一个 Asset ID,接下来可以在 Cesium 中通过以下代码加载地形:

Cesium.Ion.defaultAccessToken = 'your_access_token'; // 替换为你的 Cesium ion 访问令牌

const viewer = new Cesium.Viewer('cesiumContainer', {
   terrainProvider: Cesium.createWorldTerrain({
   requestWaterMask: true,   // 加载水体效果
   requestVertexNormals: true // 加载法线信息,提升光照效果
   })
});

// 加载你上传的地形
viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
   url: Cesium.IonResource.fromAssetId(your_terrain_asset_id)  // 替换为你上传的地形 ID
});

Cesium ion 提供的服务非常方便,用户无需担心地形数据的分块、压缩、传输等复杂细节,Cesium ion 会自动处理并优化地形展示。

自建 Web 地形服务(WMS 和 WMTS)

除了使用 Cesium ion,个人还可以通过 Web 地形服务(WMS)或 Web 地形图块服务(WMTS)发布 Heightmap 格式的地形数据。以下是详细步骤:

WMS(Web Map Service)发布地形数据

WMS 是一种标准的 Web 地图服务协议,常用于发布栅格地形数据。要发布 Heightmap 数据为 WMS 服务,可以使用开源 GIS 服务器(例如 GeoServer)。

  1. 安装 GeoServer:

    • GeoServer 官网 下载并安装 GeoServer。
    • GeoServer 支持发布基于栅格的地形数据。
  2. 上传 Heightmap 数据:

    • 在 GeoServer 管理界面中创建一个新的工作区和存储。
    • 选择 “Add New Coverage Store” 上传你的地形数据(如 .tif 文件)。
    • 上传完成后,创建一个新的图层,并设置投影和范围。
  3. 发布为 WMS 服务:

    • 确保图层已启用 WMS 服务。你可以通过 GeoServer 提供的 WMS URL 来访问这个地形数据服务。
  4. 在 Cesium 中加载 WMS 地形数据:

const viewer = new Cesium.Viewer('cesiumContainer', {
   terrainProvider: new Cesium.WebMapServiceTerrainProvider({
   url: 'http://your-geoserver-url/geoserver/wms', // 替换为你的 GeoServer WMS URL
   layers: 'workspace:layername', // 替换为你的工作区和图层名称
   minimumLevel: 0, 
   maximumLevel: 18,
   tileWidth: 256,
   tileHeight: 256,
   })
});
WMTS(Web Map Tile Service)发布地形数据

WMTS 是一种基于图块的地图服务协议,通常用于大规模、高效的地形数据加载。GeoServer 也支持发布 WMTS 服务。

  1. 在 GeoServer 中启用 WMTS:

    • 安装并设置 GeoServer 后,启用 WMTS 服务。
    • 和 WMS 服务类似,上传你的 Heightmap 数据,并发布为栅格图层。
  2. 在 Cesium 中加载 WMTS 地形数据:

    const viewer = new Cesium.Viewer('cesiumContainer', {
        terrainProvider: new Cesium.WebMapTileServiceTerrainProvider({
            url: 'http://your-geoserver-url/geoserver/gwc/service/wmts', // GeoServer WMTS URL
            layer: 'workspace:layername', // 替换为你的工作区和图层名称
            style: 'default',
            format: 'image/png',
            tileMatrixSetID: 'EPSG:4326', // 确保匹配你的投影系统
            maximumLevel: 18,
        })
    });
    

本地搭建 Cesium Terrain Server

如果你希望完全离线发布 Heightmap 数据,也可以使用 Cesium Terrain Server,它支持 Cesium 的 Quantized Mesh 格式,并可以将地形数据分块处理并发布。

  1. 使用工具(如 Cesium-terrain-builder)将 Heightmap 数据转换为 Quantized Mesh 格式。

  2. 搭建 Cesium Terrain Server,通过 Nginx 或其他 Web 服务器来托管地形数据。

  3. 在 Cesium 中加载本地服务器的地形数据:

const viewer = new Cesium.Viewer('cesiumContainer', {
   terrainProvider: new Cesium.CesiumTerrainProvider({
   url: 'http://localhost:8080/terrain', // 本地 Cesium Terrain Server 的 URL
   })
});

总结

本教程系统介绍了 Cesium 中地形加载的基础和进阶功能。通过 Cesium Ion 或自定义地形服务,您可以轻松加载全球或区域的三维地形数据,并根据需要调整采样精度、阴影、地形夸张等细节。通过进阶功能如地形裁剪和地形叠加,您可以实现更加丰富的地形场景展示。

掌握这些功能将帮助您在 Cesium 应用中实现逼真的三维地理场景。


原文地址:https://blog.csdn.net/2303_80346267/article/details/142906730

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!