Cesium淹沒分析

一、概述

Cesium是一種開源的JavaScript庫,用於創建3D WebGIS應用程序,具有跨平台、可擴展性和高性能等特點。Cesium淹沒分析是利用Cesium的高可視化能力進行水淹分析,可以在地球表面自動生成水面淹沒區域,並以視覺化的方式呈現。通過Cesium淹沒分析,用戶可以了解風暴潮、颶風等自然災害事件對城市、沿海地區的影響情況,具有重要的應用價值。

二、地形圖載入

在進行水淹分析之前,需要載入高精度的地形圖數據,Cesium提供了多種開源地圖數據源。以下代碼為Cesium中載入ArcGis地圖數據源:

var imagery = new Cesium.ArcGisMapServerImageryProvider({
    url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
});
var terrain = new Cesium.CesiumTerrainProvider({
    url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles',
    requestVertexNormals : true
});

viewer.terrainProvider = terrain;
viewer.imageryLayers.addImageryProvider(imagery)

三、淹沒分析實現

針對不同的水淹分析需求,可以採用不同的淹沒分析方法。以下為一種簡單的方法,在代碼中生成水面模擬,以及生成水淹面覆蓋。其中,生成水淹面需要生成網格數據,網格數據的每個頂點的高度即為該點到地面的距離減去淹沒深度。

var scene = viewer.scene;
var primitives = scene.primitives;
var ellipsoid = scene.globe.ellipsoid;

var points = []; // 存儲地理坐標點
for (var i = 0; i < positionData.length; i++) {
    var cartographic = new Cesium.Cartographic.fromDegrees(positionData[i][0], positionData[i][1]);
    var terrainHeight = ellipsoid.cartographicToHeight(cartographic);
    var point = new Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, terrainHeight);
    points.push(point);
}

var waterHeight = 30; // 水面高度
var mesh = Cesium.TriangleMesh.fromPositions(points, waterHeight); // 生成水面模擬
var meshPrimitive = new Cesium.Primitive({
    geometryInstances: new Cesium.GeometryInstance({
        geometry: mesh,
        appearance: new Cesium.EllipsoidSurfaceAppearance({
            material: Cesium.Material.fromType(Cesium.Material.ColorType)
        })
    }),
    asynchronous: false
});
primitives.add(meshPrimitive);

var meshdata = mesh.getGeometryInstanceAttributes('mesh');
var indices = mesh.getIndices();
var position = mesh.getPositions();
var length = indices.length;

var waterSurface = []; // 存儲網格數據,計算淹沒面覆蓋
for (var i = 0; i < length; i=i+3) {
    var ind1 = indices[i];
    var ind2 = indices[i+1];
    var ind3 = indices[i+2];

    var pt1 = new Cesium.Cartesian3(position[ind1*3], position[ind1*3+1], position[ind1*3+2]);
    var pt2 = new Cesium.Cartesian3(position[ind2*3], position[ind2*3+1], position[ind2*3+2]);
    var pt3 = new Cesium.Cartesian3(position[ind3*3], position[ind3*3+1], position[ind3*3+2]);

    var v1 = Cesium.Cartesian3.subtract(pt2, pt1, new Cesium.Cartesian3());
    var v2 = Cesium.Cartesian3.subtract(pt3, pt1, new Cesium.Cartesian3());
    var normal = Cesium.Cartesian3.cross(v1, v2, new Cesium.Cartesian3());
    Cesium.Cartesian3.normalize(normal, normal);

    var arr = new Float32Array([pt1.x, pt1.y, pt1.z, normal.x, normal.y, normal.z,
        pt2.x, pt2.y, pt2.z, normal.x, normal.y, normal.z,
        pt3.x, pt3.y, pt3.z, normal.x, normal.y, normal.z]);
    waterSurface = waterSurface.concat(arr);
}

var primitive = new Cesium.Primitive({
    geometryInstances: new Cesium.GeometryInstance({
        attributes: {
            mesh: new Cesium.GeometryInstanceAttribute({
                componentDatatype: Cesium.ComponentDatatype.FLOAT,
                componentsPerAttribute: 6,
                values: waterSurface
            })
        },
        primitiveType: Cesium.PrimitiveType.TRIANGLES,
        appearance: new Cesium.EllipsoidSurfaceAppearance({
            material: Cesium.Material.fromType(Cesium.Material.ColorType)
        })
    })
});
primitives.add(primitive);

四、水淹分析結果展示

通過Cesium淹沒分析,生成的分析結果可以進行水淹模擬、淹沒分析數據可視化等操作。以下為生成的水淹面覆蓋截圖:

五、應用場景和展望

Cesium淹沒分析可以應用於自然災害預警、城市規劃等領域,為公眾提供更精準的分析結果和決策支持。未來,隨著地理信息技術的進一步發展,Cesium淹沒分析將更加成熟、普及。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193928.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 09:41
下一篇 2024-12-02 09:41

相關推薦

  • 全面解析Cesium Entity

    一、概述 Cesium Entity是CesiumJS中重要的組件之一,它能夠代表場景中的實體,包括物體、光源、相機、模型、貼圖等,可通過調整各種屬性來控制其在場景中的行為和演示效…

    編程 2025-04-23
  • Cesium GeoJSON詳解

    一、概述 Cesium是一個基於WebGL的JavaScript庫,用於構建與時間和空間相關的地理信息應用程序。Cesium支持GeoJSON數據的載入和展示,使您能夠輕鬆地將地理…

    編程 2025-04-20
  • Cesium可視域分析

    一、可視域分析介紹 包括地形、建築等自然和人造物體會對視線產生遮擋,而對於部分應用場景,比如軍事、城市規劃等領域,需要進行可視域分析。可視域分析可以得到一個點或者某一區域的可見性,…

    編程 2025-02-01
  • cesium flyto 的詳細闡述

    cesium.io 是一個開源的 JavaScript 應用程序,它可以用於在三維地球上創建高質量的 Web 地圖。cesium flyto 是 cesium.io 中一個強大的功…

    編程 2025-01-20
  • cesiumjs離線地圖(cesium 離線地圖)

    本文目錄一覽: 1、Cesium可以載入百度地圖嗎 2、cesium地圖瓦片404默認顯示某張圖片 3、cesium 和 Three.js有什麼區別,以及二者與WebGL 的關係 …

    編程 2025-01-16
  • cesiumjs地下管道,cesium管線

    本文目錄一覽: 1、Cesium實戰項目 2、skyline與cesium差異 3、Cesium初始化選項 Cesium實戰項目 本人所學GIS專業,畢業後一直從事Cesium相關…

    編程 2025-01-04
  • Cesium FlyTo詳解

    一、FlyTo概述 Cesium是一款基於WebGL開源JavaScript庫,用於構建3D地球、地圖及其他視覺化場景。它提供了許多常用的地圖功能,如場景切換、相機控制、基礎地圖功…

    編程 2025-01-04
  • cesiumjs詳細教程(cesium開發教程)

    本文目錄一覽: 1、Cesium在js中調用entity的infobox單機事件 2、Cesium初始化選項 3、Cesium隨筆:視錐繪製(上) 4、cesium如何搭建dat.…

    編程 2025-01-02
  • Cesium 3DTileset詳解

    一、概述 Cesium是一個基於WebGL、JavaScript和HTML5的開源虛擬地球(virtual globe)框架。在Cesium中,3DTileset是一種通過使用3D…

    編程 2024-12-29
  • cesium導出geojson(cesium導出大圖)

    本文目錄一覽: 1、cesium 何如載入大數據量的geojson格式的數據,geojson有切片嗎 2、如何獲取鄉鎮地圖的geojson或者shp圖 3、Cesium GeoJs…

    編程 2024-12-24

發表回復

登錄後才能評論