第一步正常建viewer,需要注意的是官网例子属性值比较老,最新版本的属性值有所差异,全copy官网会无法运行,提示函数未定义。

第一处差异

官网:

1 const viewer = new Cesium.Viewer("cesiumContainer", {
2 terrain: Cesium.Terrain.fromWorldTerrain({
3 requestWaterMask: true,
4 requestVertexNormals: true,
5 }),
6 });

实际代码:

const viewer = new Cesium.Viewer("cesiumContainer", {
terrainProvider: Cesium.createWorldTerrain({
requestWaterMask: true,
requestVertexNormals: true,
}),
});
 
Cesium.createWorldTerrain          //为 Cesium World Terrain 创建一个 CesiumTerrainProvider 实例

第二处差异

 
官方
{
text: "CesiumTerrainProvider - Cesium World Terrain",
onselect: function () {
viewer.scene.setTerrain(
Cesium.Terrain.fromWorldTerrain({
requestWaterMask: true,
requestVertexNormals: true,
})
);
viewer.scene.globe.enableLighting = true;
},

实际代码

{
text: "CesiumTerrainProvider - Cesium World Terrain",
onselect: function () {
viewer.terrainProvider = Cesium.createWorldTerrain({
requestWaterMask: true,
requestVertexNormals: true,
});
viewer.scene.globe.enableLighting = true;
},
},

后续几个都是如此,直接替换

第三处代码差异

官网代码
{
text: "VRTheWorldTerrainProvider",
onselect: function () {
viewer.scene.setTerrain(
new Cesium.Terrain(
Cesium.VRTheWorldTerrainProvider.fromUrl(
"http://www.vr-theworld.com/vr-theworld/tiles1.0.0/73/",
{
credit: "Terrain data courtesy VT MÄK",
}
)
)
);
},
 实际代码

    {
text: "VRTheWorldTerrainProvider",
onselect: function () {
viewer.terrainProvider = Cesium.createWorldTerrain(
Cesium.VRTheWorldTerrainProvider({
url: "http://www.vr-theworld.com/vr-theworld/tiles1.0.0/73/", credit: "Terrain data courtesy VT MÄK",
})
);
},
},

完整代码

     Cesium.Ion.defaultAccessToken =
token;
const viewer = new Cesium.Viewer("cesiumContainer", {
terrainProvider: Cesium.createWorldTerrain({
//为 Cesium World Terrain 创建一个 CesiumTerrainProvider 实例
requestWaterMask: true,
//指示客户端是否应从服务器请求每个瓷砖水面具(如果可用)。 requestVertexNormals: true,
//指示客户端是否应从服务器请求额外的照明信息(如果可用)。
}),
}); viewer.scene.globe.enableLighting = true;
//启用使用场景光源照亮地球。 const ellipsoidProvider = new Cesium.EllipsoidTerrainProvider();
//一个非常简单的 TerrainProvider ,它通过对椭球面进行镶嵌来生成几何图形。 const customHeightmapWidth = 32;
const customheightmapHeight = 32;
const customHeightmapProvider = new Cesium.CustomHeightmapTerrainProvider(
//从回调函数获取高度值的简单 TerrainProvider 。
//它可以用于程序生成的地形或作为一种加载自定义高度图数据的方式,
//而无需创建 TerrainProvider 的子类。
//有一些限制,例如没有水面具、没有顶点法线和没有可用性,
//所以一个成熟的 TerrainProvider 子类更适合这些更复杂的用例。
{
width: customHeightmapWidth,
height: customheightmapHeight,
callback: function (x, y, level) {
const width = customHeightmapWidth;
const height = customheightmapHeight;
const buffer = new Float32Array(width * height);
for (let yy = 0; yy < height; yy++) {
for (let xx = 0; xx < width; xx++) {
const u = (x + xx / (width - 1)) / Math.pow(2, level);
const v = (y + yy / (height - 1)) / Math.pow(2, level); const heightValue = 4000 * (Math.sin(8000 * v) * 0.5 + 0.5);
const index = yy * width + xx;
buffer[index] = heightValue;
}
} return buffer;
},
}
); Sandcastle.addToolbarMenu(
[
{
text: "CesiumTerrainProvider - Cesium World Terrain",
onselect: function () {
viewer.terrainProvider = Cesium.createWorldTerrain({
requestWaterMask: true,
requestVertexNormals: true,
});
viewer.scene.globe.enableLighting = true;
},
}, {
text: "CesiumTerrainProvider - Cesium World Terrain - no effects",
onselect: function () {
viewer.terrainProvider = new Cesium.createWorldTerrain();
},
},
{
text: "CesiumTerrainProvider - Cesium World Terrain w/ Lighting",
onselect: function () {
viewer.terrainProvider = Cesium.createWorldTerrain({
requestVertexNormals: true,
});
viewer.scene.globe.enableLighting = true;
},
},
{
text: "CesiumTerrainProvider - Cesium World Terrain w/ Water",
onselect: function () {
viewer.terrainProvider = Cesium.createWorldTerrain({
requestWaterMask: true,
});
},
},
{
text: "EllipsoidTerrainProvider",
onselect: function () {
viewer.terrainProvider = ellipsoidProvider;
},
},
{
text: "CustomHeightmapTerrainProvider",
onselect: function () {
viewer.terrainProvider = customHeightmapProvider;
},
},
{
text: "VRTheWorldTerrainProvider",
onselect: function () {
viewer.terrainProvider = Cesium.createWorldTerrain(
Cesium.VRTheWorldTerrainProvider({
url: "http://www.vr-theworld.com/vr-theworld/tiles1.0.0/73/", credit: "Terrain data courtesy VT MÄK",
// 数据源的功劳,显示在画布上。
})
);
},
},
{
text: "ArcGISTerrainProvider",
onselect: function () {
viewer.terrainProvider = Cesium.createWorldTerrain(
Cesium.ArcGISTiledElevationTerrainProvider({
url: "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer",
})
);
},
},
],
"terrainMenu"
);
Sandcastle.addDefaultToolbarMenu(
[
{
text: "Mount Everest",
onselect: function () {
const target = new Cesium.Cartesian3(
300770.50872389384,
5634912.131394585,
2978152.2865545116
);
const offset = new Cesium.Cartesian3(
6344.974098678562,
-793.3419798081741,
2499.9508860763162
);
viewer.camera.lookAt(target, offset);
viewer.camera.lookAtTransform(
Cesium.Matrix4.IDENTITY //transform Matrix4 定义参考系的变换矩阵。
);
//使用目标和变换矩阵设置相机位置和方向。
//偏移量可以是笛卡尔坐标或航向/间距/范围。
//如果偏移量是笛卡尔坐标,则它是从由变换矩阵定义的参考系中心的偏移量。
//如果偏移量是航向/俯仰/范围,则航向和俯仰角在由变换矩阵定义的参考系中定义。
//航向是从 y 轴到 x 轴增加的角度。
//俯仰是从 xy 平面的旋转。正俯仰角在平面下方。
//负俯仰角在平面上方。范围是到中心的距离。
//在 2D 中,必须有自上而下的视图。相机将放置在参考框架的中心上方。
//目标上方的高度将是偏移量的大小。航向将根据偏移量确定。
//如果无法根据偏移量确定航向,则航向将为北。
},
},
{
text: "Half Dome",
onselect: function () {
const target = new Cesium.Cartesian3(
-2489625.0836225147,
-4393941.44443024,
3882535.9454173897
);
const offset = new Cesium.Cartesian3(
-6857.40902037546,
412.3284835694358,
2147.5545426812023
);
viewer.camera.lookAt(target, offset);
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
},
},
{
text: "San Francisco Bay",
onselect: function () {
const target = new Cesium.Cartesian3(
-2708814.85583248,
-4254159.450845907,
3891403.9457429945
);
const offset = new Cesium.Cartesian3(
70642.66030209465,
-31661.517948317807,
35505.179997143336
);
viewer.camera.lookAt(target, offset);
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
},
},
],
"zoomButtons"
);
let terrainSamplePositions;
function sampleTerrainSuccess(terrainSamplePositions) {
const ellipsoid = Cesium.Ellipsoid.WGS84;
//初始化为 WGS84 标准的 Ellipsoid 实例。
viewer.scene.globe.depthTestAgainstTerrain = true;
//如果广告牌、折线、标签等图元应针对地形表面进行深度测试,则为 true;
//如果此类图元应始终绘制在地形顶部,除非它们位于地球的另一侧,则为 false。
//针对地形进行深度测试图元的缺点是,
//轻微的数值噪声或地形细节级别的切换有时会使应该在表面上的图元在其下方消失。 viewer.entities.suspendEvents();
//防止引发 EntityCollection#collectionChanged 事件,
//直到对 EntityCollection#resumeEvents 进行相应的调用,
//此时将引发涵盖所有暂停操作的单个事件。
//这允许有效地添加和删除许多项目。
//只要有对 EntityCollection#resumeEvents 的相应调用,就可以安全地多次调用此函数。
viewer.entities.removeAll();
// 从集合中移除所有实体。
for (let i = 0; i < terrainSamplePositions.length; ++i) {
const position = terrainSamplePositions[i]; viewer.entities.add({
name: position.height.toFixed(1),
//toFixed 固定小数位
position: ellipsoid.cartographicToCartesian(position),
//将提供的制图转换为笛卡尔表示。
billboard: {
//描述位于包含 Entity 位置的二维图标。
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
//原点相对于对象的垂直位置,例如 Billboard 或 Label 。例如,
//将垂直原点设置为 TOP 或 BOTTOM 将在锚点位置上方或下方(在屏幕空间中)显示广告牌
scale: 0.7,
// 一个数字属性,指定应用于图像大小的比例。
image: "../../images/facility.gif",
//一个属性,指定用于广告牌的图像、URI 或画布。
},
label: {
//描述位于包含 Entity 位置的二维标签
text: position.height.toFixed(1),
// 指定文本的属性。支持显式换行符 ''。
font: "10pt monospace",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
//原点相对于对象的水平位置,例如 Billboard 或 Label 。
//例如,将水平原点设置为 LEFT 或 RIGHT 将在锚点位置的左侧或右侧(在屏幕空间中)显示广告牌。
pixelOffset: new Cesium.Cartesian2(0, -14),
// 指定像素偏移的 Cartesian2 属性
fillColor: Cesium.Color.BLACK, //填充
outlineColor: Cesium.Color.BLACK, //轮廓
showBackground: true,
//一个布尔属性,指定标签背后背景的可见性。
backgroundColor: new Cesium.Color(0.9, 0.9, 0.9, 0.7),
backgroundPadding: new Cesium.Cartesian2(4, 3),
// 一个 Cartesian2 属性,以像素为单位指定水平和垂直背景填充。
},
});
}
viewer.entities.resumeEvents();
//添加或删除项目时立即恢复引发 EntityCollection#collectionChanged 事件。
//在事件挂起期间所做的任何修改都将在调用此函数时作为单个事件触发。
//此函数是引用计数的,只要有对 EntityCollection#resumeEvents 的相应调用,就可以安全地多次调用该函数。
} function createGrid(rectangleHalfSize) {
//矩形一半大小
const gridWidth = 41;
const gridHeight = 41;
const everestLatitude = Cesium.Math.toRadians(27.988257);
//将度数转换为弧度
const everestLongitude = Cesium.Math.toRadians(86.925145);
//everest 最高
const e = new Cesium.Rectangle(
everestLongitude - rectangleHalfSize,
everestLatitude - rectangleHalfSize,
everestLongitude + rectangleHalfSize,
everestLatitude + rectangleHalfSize
);
const terrainSamplePositions = [];
for (let y = 0; y < gridHeight; ++y) {
for (let x = 0; x < gridWidth; ++x) {
const longitude = Cesium.Math.lerp(
e.west,
e.east,
x / (gridWidth - 1)
);
//计算两个值的线性插值。
const latitude = Cesium.Math.lerp(
e.south,
e.north,
y / (gridHeight - 1)
);
const position = new Cesium.Cartographic(longitude, latitude);
//由经度、纬度和高度定义的位置。
terrainSamplePositions.push(position);
}
}
return terrainSamplePositions;
} Sandcastle.addToggleButton(
"Enable Lighting",
viewer.scene.globe.enableLighting,
function (checked) {
viewer.scene.globe.enableLighting = checked;
}
); Sandcastle.addToggleButton(
"Enable fog",
viewer.scene.fog.enabled,
function (checked) {
viewer.scene.fog.enabled = checked;
}
); Sandcastle.addToolbarButton(
"Sample Everest Terrain at Level 9",
function () {
const terrainSamplePositions = createGrid(0.005);
Promise.resolve(
Cesium.sampleTerrain(
//通过向地形提供者请求切片、采样和插值,启动对 Cartographic 位置数组的地形高度查询。
//插值匹配用于在指定级别渲染地形的三角形。查询是异步发生的,所以这个函数返回一个在查询完成时解决的 Promise。
//每个点的高度都在原地修改。如果由于该位置的指定级别没有可用的地形数据而无法确定高度,或者发生其他错误,则将高度设置为未定义。
//作为典型的 Cartographic 类型,提供的高度是参考椭球体上方的高度(例如 Ellipsoid.WGS84 ),而不是高于平均海平面的高度。
//换句话说,如果在海洋中采样,它不一定是 0.0。此函数需要地形细节级别作为输入,
//如果您需要尽可能精确地获取地形高度(即最大细节级别),请使用 sampleTerrainMostDetailed 。
viewer.terrainProvider,
9,
terrainSamplePositions
//terrainProvider TerrainProvider 从中查询高度的地形提供者。
//level Number 用于查询地形高度的地形细节层次。
//positions Array.< Cartographic > 使用地形高度更新的位置。
)
).then(sampleTerrainSuccess);
const target = new Cesium.Cartesian3(
300770.50872389384,
5634912.131394585,
2978152.2865545116
);
const offset = new Cesium.Cartesian3(
6344.974098678562,
-793.3419798081741,
2499.9508860763162
);
viewer.camera.lookAt(target, offset);
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
},
"sampleButtons"
); Sandcastle.addToolbarButton(
"Sample Most Detailed Everest Terrain",
function () {
if (!Cesium.defined(viewer.terrainProvider.availability)) {
window.alert(
"sampleTerrainMostDetailed is not supported for the selected terrain provider"
);
return;
}
const terrainSamplePositions = createGrid(0.0005);
Promise.resolve(
Cesium.sampleTerrainMostDetailed(
viewer.terrainProvider,
terrainSamplePositions
)
//在地形数据集的最大可用切片级别启动 sampleTerrain() 请求。
).then(sampleTerrainSuccess);
const target = new Cesium.Cartesian3(
300770.50872389384,
5634912.131394585,
2978152.2865545116
);
const offset = new Cesium.Cartesian3(
6344.974098678562,
-793.3419798081741,
2499.9508860763162
);
viewer.camera.lookAt(target, offset);
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
},
"sampleButtons"
);
 

Cesium案例(八) Terrain的更多相关文章

  1. Cesium案例解析(六)——3DTilesInspector监视器

    目录 1. 概述 2. 案例 1. 概述 3D Tiles作为传输和渲染大规模3D地理空间数据的格式,应对的都是大规模数据的场景,Cesium提供了一个监视3D Tiles数据的监视器,可以通过这个监 ...

  2. Cesium案例解析(五)——3DTilesPhotogrammetry摄影测量3DTiles数据

    目录 1. 概述 2. 案例 3. 结果 1. 概述 3D Tiles是用于传输和渲染大规模3D地理空间数据的格式,例如摄影测量,3D建筑,BIM / CAD,实例化特征和点云等.与常规的模型文件格式 ...

  3. Cesium案例解析(三)——Camera相机

    目录 1. 概述 2. 实例 2.1. Camera.html 2.2. Camera.js 2.2.1. 飞行至某一点 2.2.2. 飞行至某区域 2.2.3. 两地之间飞行 2.2.4. 设置视图 ...

  4. Cesium案例解析(二)——ImageryLayers影像图层

    目录 1. 概述 2. 实例 2.1. ImageryLayers.html 2.2. ImageryLayers.js 2.2.1. 代码 2.2.2. 解析 3. 结果 1. 概述 Cesium支 ...

  5. Cesium案例解析(一)——HelloWorld

    目录 1. 概述 2. 实例 2.1. HelloWorld.html 2.2. HelloWorld.js 3. 结果 1. 概述 感觉网上已经有不少关于cesium的教程了,但是学习一个框架最快的 ...

  6. Cesium案例解析(四)——3DModels模型加载

    目录 1. 概述 2. 代码 3. 解析 4. 参考 1. 概述 Cesium自带的3D Models示例,展示了如何加载glTF格式三维模型数据.glTF是为WebGL量身定制的数据格式,在网络环境 ...

  7. 进阶: 案例八: Drag and Drop(动态)

    1.节点 2.UI 3. 4.方法: METHOD wddomodifyview . DATA: lo_container TYPE REF TO cl_wd_uielement_container, ...

  8. javaweb各种框架组合案例(八):springboot+mybatis-plus+restful

    一.介绍 1. springboot是spring项目的总结+整合 当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之 ...

  9. 案例八:shell自动化管理账本脚本

    该脚本目的帮助管理员创建账号.删除账号.锁定账号.解锁账号. #!/bin/bash #filename: #author: #date:2018-6-6 echo "用户管理程序" ...

  10. cesium 之加载地形图 Terrain 篇(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

随机推荐

  1. Verilog中端口的连接规则

    摘自于(15条消息) Verilog中端口应该设置为wire形还是reg形_CLL_caicai的博客-CSDN博客, 以及(15条消息) Verilog端口连接规则_「已注销」的博客-CSDN博客_ ...

  2. Oracle学习-----基本SQL select语句

    一.基本select语句 SELECT 标识  选择那些列 FROM     标识从哪个表中选择 select * 标识 全部选择 select department_id, location_id ...

  3. 第12组 Beta冲刺 (5/5)

    1.1基本情况 ·队名:美少女战士 ·组长博客:https://www.cnblogs.com/yaningscnblogs/p/14016978.html ·作业博客:https://edu.cnb ...

  4. openvas漏洞扫描:使用openvas时扫描漏洞时,报告中显示的数据与数据库数据不同

    使用openvas设备进行漏洞扫描时,报告中的漏洞数量与readis数据库中查找到的漏洞数量不同 原因是,openvas的代码中默认在报告中显示的最小质量检测为70%.如图: 上图详细链接为:http ...

  5. Vue+SSM+Element-Ui实现前后端分离(3)

    前言:经过博文(1)vue搭建,(2)ssm搭建,到这里就该真真切切的实现小功能了<-_-> 规划:实现登录,用户列表查询,访问日志aop; 开始先解决跨域:在目录config/index ...

  6. python pip安装三方库失败

    Collecting pip WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None ...

  7. 制作mnist格式数据集

    import os from PIL import Image from array import * from random import shuffle # # 文件组织架构: # ├──trai ...

  8. 记录一次MySQL主从同步

    主库配置 server-id=1log-bin=mysql-binbinlog_format=ROWbinlog_row_image=minimalbinlog-do-db=yjtb-cloud 解释 ...

  9. Chrome(谷歌)浏览器永久关闭恢复页面提示框(记录)

    使用脚本调用Chrome浏览器启动指定页面,然后代码里的命令关闭,会被浏览器识别为非正常关闭. 再次执行脚本的时候会停留在空白页面,无法进入指定页面,设置为主页也无法进入. 排查可能是浏览器自动恢复页 ...

  10. 记录小程序字符串模板渲染WxParse

    1.先去https://github.com/icindy/wxParse上downLoad代码,然后直接复制到项目里,跟pages目录同级 2.在要用的js页面声明 var WxParse = re ...