Cesium可視域分析

一、可視域分析介紹

包括地形、建築等自然和人造物體會對視線產生遮擋,而對於部分應用場景,比如軍事、城市規劃等領域,需要進行可視域分析。可視域分析可以得到一個點或者某一區域的可見性,進而做到一系列的應用,比如軍事作戰中的掩護和微微,城市規劃中的最優視覺塔及攝影點的選擇等。

由於3D模型具有真實感,因此,在3D模型上進行可視域分析比在2D圖像上分析更加直觀,能夠更好的提高分析的效果。而Cesium是一款基於WebGL的開源虛擬地球儀,能夠提供瀏覽器端的3D模型可視化功能,因此,Cesium作為3D可視化工具之一,提供額外的API來進行3D場景下的可視域分析。

二、Cesium的可視域分析原理

Cesium的可視域分析API是基於射線追蹤演算法實現的,具體演算法如下:

// 輸入
var origin = Cesium.Cartesian3.fromDegrees(-95.0, 40.0, 0.0);
var heading = Cesium.Math.toRadians(0.0);
var pitch = Cesium.Math.toRadians(0.0);
var roll = Cesium.Math.toRadians(0.0);
var hfov = Cesium.Math.toRadians(60.0);

// 輸出
var visibleWindow = camera.computeViewRectangle(scene.globe.ellipsoid);

// 射線追蹤演算法
var ray = new Cesium.Ray(origin, camera.direction);
var intersection = scene.globe.pick(ray, scene);

if (intersection) {
    var range = Cesium.Cartesian3.distance(intersection, origin);
    var aspectRatio = canvas.width / canvas.height;
    var verticalFov = Cesium.Math.atan(Cesium.Math.tan(hfov*0.5) / aspectRatio);
    var horizontalFov = 2 * Cesium.Math.atan(Cesium.Math.tan(verticalFov*0.5) * aspectRatio);
    var fov = Math.min(hfov, horizontalFov);
    var angle = 2 * Cesium.Math.atan(viewHeight / (2 * range));
    var radius = range * Math.sin(fov*0.5) / Math.sin(angle*0.5);
    visibleWindow = getCorners(origin, camera.direction, radius, aspectRatio, scene.globe.ellipsoid);
}

該演算法首先獲取相機的位置和視角參數,然後獲取以該位置和相機參數為輸入的可視範圍,接著根據射線追蹤演算法計算可視域範圍。該演算法根據相機位置和視角參數計算出一條射線,然後在地球模型上進行碰撞檢測,獲取射線與地球模型的交點,然後根據交點和相機位置計算出可視域範圍。

三、Cesium可視域分析功能實現

1、顯示可視域

利用Cesium內置的Primitive類型來應用的位置的範圍來可視化可視域。代碼如下:

var target = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
var radius = Cesium.Cartesian3.distance(camera.position, target);

var visibleArea = new Cesium.Primitive({
  geometryInstances: new Cesium.GeometryInstance({
    geometry: new Cesium.CircleGeometry({
      center : target,
      radius : radius,
      vertexFormat : Cesium.VertexFormat.POSITION_ONLY
    })
  }),
  appearance: new Cesium.EllipsoidSurfaceAppearance({
    aboveGround : false
  }),
  show : true
});

scene.primitives.add(visibleArea);

2、計算可視域範圍

獲取可視域範圍的方法是根據射線追蹤演算法,計算射線與地球模型的交點,也就是獲取在地球模型上的可視區域。

var pickRay = camera.getPickRay(new Cesium.Cartesian2(0, 0));
var intersection = scene.globe.pick(pickRay, viewer.scene);
var position = Cesium.Ellipsoid.WGS84.cartesianToCartographic(intersection);

3、計算測量高度角

根據可視域向量來確定測量高度角。

var globe = viewer.scene.globe;
var ellipsoid = globe.ellipsoid;
var positionCartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
var positionHeight = positionCartographic.height;
var cameraCartographic = globe.ellipsoid.cartesianToCartographic(camera.position);
var cameraHeight = cameraCartographic.height;
var relativeHeight = positionHeight - cameraHeight;

// 補償半徑高度
var offsetHeight = relativeHeight + ellipsoid.radii.x;
if (offsetHeight < 0) {
    offsetHeight = relativeHeight - ellipsoid.radii.x;
}

// 計算高度角
var maxAngle = Math.atan2(offsetHeight, positionCartographic.distance(cameraCartographic));

4、計算水平範圍

根據可視域向量計算水平範圍。

// 計算方位角
var cameraHeading = camera.heading;
if (cameraHeading < 0) cameraHeading += 2 * Math.PI;
var targetPos = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
var targetPosCartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(targetPos);
var bearing = getBearing(cameraCartographic, targetPosCartographic);
if (bearing  360.0) left -= 360.0;
if (right > 360.0) right -= 360.0;
if (right < left) {
    var tmp = left;
    left = right;
    right = tmp + 360.0;
}

四、Cesium可視域分析應用場景

1、軍事作戰

軍事作戰中,敵軍的可視域是非常重要的信息。因此,通過Cesium對3D模型進行可視域分析,可以更加直觀地顯示敵人的視野範圍,從而更好地做出反應。

2、城市規劃

在城市規劃領域中,3D模型中的可視域分析可以幫助規劃者更好地確定市區的建築和道路的布局,找到最優的視覺塔和攝影點,使得城市布局更加合理和完美。

3、自然資源管理

在自然資源管理領域中,可視域分析可以幫助環保人員更好地解決難題。舉個例子,德州市林業部門利用可視域分析方法來監測野生大熊貓棲息地的違法行為,包括非法伐木和非法盜貓情況。

結論

總的來說,Cesium的可視域分析API是基於射線追蹤演算法實現的,可以幫助用戶更加方便地完成可視域分析,適用于軍事作戰、城市規劃、自然資源管理等領域。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LVRZM的頭像LVRZM
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相關推薦

  • 全面解析Cesium Entity

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

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

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

    編程 2025-04-20
  • 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
  • cesiumjs模型,cesium 模型格式

    本文目錄一覽: 1、Cesiumjs可以載入傾斜攝影的OSGB數據嗎 2、Cesium 3Dtiles模型多邊形裁剪簡單整理 3、Cesium的擴展工具包-EarthSDK使用指南…

    編程 2024-12-24

發表回復

登錄後才能評論