Cesium 是一款面向三維地球和地圖的,世界級的JavaScript開源產品。它提供了基於JavaScript語言的開發包,方便用戶快速搭建一款零插件的虛擬地球Web應用,並在性能,精度,渲染質量以及多平台,易用性上都有高質量的保證。
關於填挖方分析
從百度百科查找到的關於填方和挖方的定義如下:
填方:填方指的是路基表面高於原地面時,從原地面填築至路基表面部分的土石體積。
挖方:指的是路基表面低於原地面時,從原地面至路基表面挖去部分的土石體積。
在簡書里,也找到一篇 基於GIS的填挖方平衡分析 的文章,並給出了在ArcGIS軟件中的實操。
本文着重要介紹的是在Cesium中如何計算填方與挖方,其中會借鑒小專欄里的另外一篇文章 Cesium專欄-剖面分析 中關於地形高度采樣的內容。
需要注意的是:本文使用的計算方式只是一種研究行方案,用於拓展思路,並不是最准確的計算方式,請評估后慎用!
具體做法
1.定義地形服務,繪制施工區域
-
// 在使用地形服務前,請設置好 Cesium.Ion.defaultAccessToken
-
var terrainProvider = Cesium.createWorldTerrain({
-
requestWaterMask: true,
-
requestVertexNormals: true
-
});
-
-
// 定義填挖方的基准面高度
-
var excavateHeight = 2300; // 開挖高度
-
var buryHeight = 6000; // 填埋高度
-
-
// 定義施工區域
-
var scope = [
-
Cesium.Cartesian3.fromDegrees( 99, 29),
-
Cesium.Cartesian3.fromDegrees( 100, 29),
-
Cesium.Cartesian3.fromDegrees( 100, 30),
-
Cesium.Cartesian3.fromDegrees( 99, 30)
-
];
2.剖分施工區域,計算每個區域的面積與填挖高度
核心思想:計算 開挖/填埋 的 開挖量/填方量 的 核心思想就是 剖分 微積分
-
// 設置剖分最小單元 0.01°
-
var subdivisionCell = 0.01; // 剖分精度自定義
-
// 存儲所有的剖分矩形
-
var subRectangles = [];
-
for (var i = 99; i <= 100; i = i + subdivisionCell) {
-
for (var j = 29; j <= 30; j = j + subdivisionCell) {
-
var subRectangle = new Cesium.Rectangle(
-
Cesium.Math.toRadians(i),
-
Cesium.Math.toRadians(j),
-
Cesium.Math.toRadians(i + subdivisionCell),
-
Cesium.Math.toRadians(j + subdivisionCell)
-
);
-
subRectangles.push(subRectangle);
-
}
-
}
-
// 計算每個矩形的中心點作為這個矩形的代表
-
var subRectanglesCenterPoints = [];
-
subRectangles.forEach( subRectangle => {
-
var centerPoint = Cesium.Cartographic.fromRadians((subRectangle.west + subRectangle.east) / 2, (subRectangle
-
.north +
-
subRectangle.south) / 2);
-
subRectanglesCenterPoints.push(centerPoint);
-
});
-
// 采樣每個中心點到達地表的高度
-
var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, subRectanglesCenterPoints);
-
Cesium.when(promise, function (updatedPositions) {
-
// 所有高度
-
var heights = [];
-
updatedPositions.forEach( point => {
-
heights.push(point.height);
-
});
-
});
3.計算填挖方
更多詳情見下面鏈接文章:
GIS之家小專欄此文章:Cesium專欄-填挖方分析(附源碼下載)
文章提供源碼,對本專欄感興趣的話,可以關注一波