1. 程式人生 > >Cesium實現三維視覺化一般步驟

Cesium實現三維視覺化一般步驟

在專案的開發過程中用到在底圖顯示三維視覺化圖形,涉及到載入大批量的資料,經過查閱資料,決定採用Cesium設計一個實現方案,在底圖顯示3d模型以及與3d模型之間的一系列互動行為,下面分步驟詳細進行介紹:

  1. 建立檢視器—將檢視器新增到指定的銫容器cesiumContainer,可以實現底圖的切換,載入天地圖。程式碼如下所示:
var viewer = new Cesium.Viewer('cesiumContainer', {
        imageryProvider : new Cesium.createOpenStreetMapImageryProvider({
            url : 'https://a.tile.openstreetmap.org/'
}), baseLayerPicker : false, animation : false, timeline : false, fullscreenButton : false, infoBox : false, homeButton : false });

2.相機控制—由屬性viewer.scene控制當前可見的內容,可以通過設定相機的位置和方向來控制相機切換視角,也可以使用cesium相機API來設定相機的位置和方向。

//Create an initial camera view
var initialPosition = new Cesium.Cartesian3.fromDegrees(-73.848114468289017509, 40.824512895646692812, 2631.082799425431); var initialOrientation = new Cesium.HeadingPitchRoll.fromDegrees(7.1077496389876024807, -31.987223091598949054, 0.025883251314954971306); var homeCameraView = { destination : initialPosition, orientation : { heading : initialOrientation.heading,//圍繞負z軸的旋轉
pitch : initialOrientation.pitch,//圍繞負y軸的旋轉 roll : initialOrientation.roll//圍繞正x軸的旋轉 } }; viewer.scene.camera.setView(homeCameraView); //將相機設定在特定的位置和方向

3.載入樣式實體—為了便於觀看,cesium支援流行的向量格式GeoJson和KML,以及我們專門為描述cesium中稱為CZML的場景而開發的開放格式。其中DataSource只是定義了一個介面,需要的確切型別的資料來源將取決於資料格式。

(1) KML使用KmlDataSource,通過呼叫KmlDataSource.load(optinos)幾個選項從KML檔案中讀取我們的示例geocache點。對於KmlDataSource,需要相機和畫布選項。該clampToGround選項支援地面夾緊,這是一種流行的顯示選項,可使地形幾何實體(如多邊形和橢圓)符合地形而不是曲線到WGS84橢球表面。

var kmlOptions = {
        camera : viewer.scene.camera,//相機選項
        canvas : viewer.scene.canvas,//畫布選項
        clampToGround : true
    };
    // Load geocache points of interest from a KML file
    var geocachePromise = Cesium.KmlDataSource.load('./SampleData/kml/bikeRide.kml', kmlOptions);
    // Add geocache billboard entities to scene and style them
    geocachePromise.then(function(dataSource) {
        // Add the new data as entities to the viewer
        viewer.dataSources.add(dataSource);
        // Get the array of entities
        var geocacheEntities = dataSource.entities.values;
        for (var i = 0; i < geocacheEntities.length; i++) {
            var entity = geocacheEntities[i];
            if (Cesium.defined(entity.billboard)) {
                // Adjust the vertical origin so pins sit on terrain
                entity.billboard.verticalOrigin = Cesium.VerticalOrigin.BOTTOM;
                // Disable the labels to reduce clutter
                entity.label = undefined;
                // Add distance display condition
                entity.billboard.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(10.0, 20000.0);
                // Compute latitude and longitude in degrees
                var cartographicPosition = Cesium.Cartographic.fromCartesian(entity.position.getValue(Cesium.JulianDate.now()));
                var latitude = Cesium.Math.toDegrees(cartographicPosition.latitude);
                var longitude = Cesium.Math.toDegrees(cartographicPosition.longitude);
                // Modify description
                var description = '<table class="cesium-infoBox-defaultTable cesium-infoBox-defaultTable-lighter"><tbody>';
                description += '<tr><th>' + "Latitude" + '</th><td>' + latitude + '</td></tr>';
                description += '<tr><th>' + "Longitude" + '</th><td>' + longitude + '</td></tr>';
                description += '</tbody></table>';
                entity.description = description;
            }
        }
    });
(2) GeoJson與載入KML的過程非常相似,在這種情況下,可以使用GeoJsonDataSource代替,和前面的資料來源一樣,需要將viewer.dataSources新增資料到場景中。這種載入方式只是實現的平面的,可以通過自行設定高度entity.polygon.extrudedHeight讀取每個實體屬性中的高度
使建築物看起來有一定的高度,切換視角,達到三維效果;載入geojson檔案新增滑鼠互動行為不生效;使用這種方式載入大批量的建築物會造成瀏覽器卡頓甚至崩潰。
var geojsonOptions = {
        clampToGround : true
    };
    // Load neighborhood boundaries from KML file
    var neighborhoodsPromise = Cesium.GeoJsonDataSource.load('./SampleData/test.geojson', geojsonOptions);

    // Save an new entity collection of neighborhood data
    var neighborhoods;
    neighborhoodsPromise.then(function(dataSource) {
        // Add the new data as entities to the viewer
        var city = viewer.dataSources.add(dataSource);
        neighborhoods = dataSource.entities;
        // Get the array of entities
        var neighborhoodEntities = dataSource.entities.values;
        for (var i = 0; i < neighborhoodEntities.length; i++) {
            var entity = neighborhoodEntities[i];
            if (Cesium.defined(entity.polygon)) {
                // entity styling code here
                entity.name = entity.properties.neighborhood;
       //          entity.polygon.material = Cesium.Color.fromRandom({
                //     red : 0.4,
                //     maximumGreen :0.8,
                //     minimumBlue : 0.6,
                //     alpha :1
                // });
                entity.polygon.material = Cesium.Color.YELLOW;
                entity.polygon.outline = false;
                // Tells the polygon to color the terrain. ClassificationType.CESIUM_3D_TILE will color the 3D tileset, and ClassificationType.BOTH will color both the 3d tiles and terrain (BOTH is the default)
                entity.polygon.classificationType = Cesium.ClassificationType.TERRAIN;
                // Generate Polygon position
                var polyPositions = entity.polygon.hierarchy.getValue(Cesium.JulianDate.now()).positions;
                var polyCenter = Cesium.BoundingSphere.fromPoints(polyPositions).center;
                polyCenter = Cesium.Ellipsoid.WGS84.scaleToGeodeticSurface(polyCenter);
                entity.position = polyCenter;
                entity.polygon.extrudedHeight = entity.properties.height;
                // entity.polygon.height = entity.properties.height;
                // Generate labels
                entity.label = {
                    text : entity.name,
                    showBackground : true,
                    scale : 0.6,
                    horizontalOrigin : Cesium.HorizontalOrigin.CENTER,
                    verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
                    distanceDisplayCondition : new Cesium.DistanceDisplayCondition(10.0, 8000.0),
                    disableDepthTestDistance : 100.0
                };
            }
        }
        //載入的建築物的總數
        console.log(neighborhoodEntities.length);
    });
(3) Cesium支援基於glTF(GL傳輸格式)載入3D模型,載入模型與迄今為止我們使用過的任何其他型別的視覺化沒有什麼不同,所需要的只是實體的位置和glTF模型的一個URL;每個模型都有自己的原始COLLADA檔案(.dae)和glTF檔案(.gltf),在Cesium中我們不需要原始的COLLADA檔案,需要的只是經過3d
max轉化後的gltf檔案以及相應的貼圖檔案。(例子中定位到賓夕法尼亞州埃克斯頓就是通過載入.gltf格式的資料渲染到地圖上)。
var scene = viewer.scene;
    var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
    Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0.0));
    var model = scene.primitives.add(Cesium.Model.fromGltf({
        url : './SampleData/models/CesiumGround/Cesium_Ground.gltf',
        modelMatrix : modelMatrix,
        scale : 200.0
    }));

4、 滑鼠互動—只有在載入3d Tiles的時候,才可以用滑鼠實現互動選擇和樣式改變,否則這些模型將無法以互動方式檢視。在這種情況下可以載入大批量的模型建築物資訊。例如viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: Cesium.IonResource.fromAssetId(3839) }));顯示紐約所有的建築物完整的3d模型,從而為三維視覺化新增真實感。

說明:如果要載入大批量的模型,以dataSource載入geojson檔案的方法可能會造成瀏覽器卡頓甚至崩潰的現象;3d Tiles才是實現載入大規模場景應用的最佳選擇,而且依賴於3d Tiles還可以實現滑鼠互動改變樣式等。

相關推薦

Cesium實現視覺一般步驟

在專案的開發過程中用到在底圖顯示三維視覺化圖形,涉及到載入大批量的資料,經過查閱資料,決定採用Cesium設計一個實現方案,在底圖顯示3d模型以及與3d模型之間的一系列互動行為,下面分步驟詳細進行介紹: 建立檢視器—將檢視器新增到指定的銫容器cesiumCo

webgl(three.js)實現室內定位,樓宇bim、實時定位視覺解決方案

(寫在前面,談談物聯網展會)上次深圳會展中心舉行物聯網展會,到了展會一看,80%以上的物聯網應用都是在搞RFID,室內定位,我一度懷疑物聯網落地方案的方向侷限性與市場導向,後來多方面瞭解才明白,展會上看到的不能體現目前物聯網最前沿最廣泛的應用,很多大的企業與技術前沿企業沒有參與這樣的展會,一是不屑於參加,二是

視覺,助設計與管理高效對接

擁有年生產15萬臺套汽車座椅能力的江鈴李爾,研發實力同樣雄厚。企業擁有著較高的三維應用水平,所有設計資料以三維為主。目前,江鈴李爾在PDM/CAPP系統上集成了3D輕量化瀏覽元件,全面重建了企業的三維視覺化研發管理平臺。設計師、工藝人員、質量人員,均可在平臺上完成產品設計、工藝規劃、質量檢查等工作。實現了資料

Python 視覺筆記1 -- TVTK庫

Python 三維視覺化筆記1 – TVTK庫 Python 三維視覺化系列筆記是筆者在學習黃天羽老師的《Python科學計算三維視覺化》課程及筆者實踐三維視覺化的筆記。 課程連結: Python科學計算三維視覺化 參考文件: VTK 官方文件 環境:

WebGL停車場視覺管理系統 DEMO(thingjs 停車場3D視覺管理)

隨著社會的發展,城市中的汽車越來越多。車輛集中存放管理的場所被人類提出車輛進出的秩序、車輛存放的安全性、車輛存放管理的有償性等要求。停車場系統應用現代機械電子及通訊科學技術,集控制硬體、軟體於一體。隨著科技的發展,停車場管理系統也日新月異,目前最為專業化的停車場系統為免取卡停車場。 簡易DEMO 

當機器人系統與視覺模擬遇到虛擬現實技術

從事移動機器人學習已經10多年了,從最初的8位微控制器到DSP再到ARM嵌入式子系統;從window平臺下C++和wince嵌入式再到ubuntu平臺和ubuntu ARM嵌入式;從單機器人系統到多機器

阿里雲物聯網視覺套件(ThingJS)使用初體驗

本文主要的目標是使用阿里雲的雲產品 - 物聯網套件三維視覺化 開始 準備工作 進入下載頁面下載頁面,點選“模型編輯器下載” 安裝模型編輯器下載 安裝完畢,啟動模型編輯器下載,啟動後介面如下所示 選擇新建場景,開啟場景自建 建立模型 基礎操作

Python科學計算視覺(1) ——TVTK庫入門

最近在中國大學MOOC網上學習python科學計算三維視覺化相關知識,記錄下來,以供參考。 科學視覺化基礎 科學計算的視覺化方法 二維標量資料場 1.1 顏色對映方法 1.2 等值線方法 1.3 立體圖法和層次分割法 三維標量

CT重建及視覺資料:opengl+VTK+PCL點雲庫

自己做過邊緣輪廓三維重建方面的工作,今天看到一篇CT三維重建的介紹性質的文章挺感興趣的,附錄一下: CT三維重建主要有六種基本後處理方法 多層面重建(MPR) 最大密度投影(MIP) 表面陰影遮蓋(SSD) 容積漫遊技術(VRT)

視覺資料中心機房監控管理系統

前言 IDC(Internet Data Center,指網際網路資料中心)行業有這樣一句操作效率的名言:"你無法控制沒有經過測量的事物。"言外之意:要想減少能源浪費情況就必須從最基本的測量開始。但如果無法得知能源都用到了什麼地方的話,管理人員就無法知悉將重點放哪。 本文介紹通過 HT 打

基於ITK和VTK實現體資料的區域生長分割和視覺

該文由Markdown語法編譯器編輯完成。 1. 前言: 在醫學影像的開源庫中,ITK主要擅長影象分割和影象配准算法的 研究,VTK則擅長三維視覺化的實現。通過結合二者,可以實現基本的影象分割或配准算法的執行和結果顯示。 本文主要介紹ITK中的基於it

45.Qt openGL實現繪圖

窗口 err lin span protected 調用 event header 實現 main.cpp #include <QApplication> #include <iostream> #include "tetrahea

cesium載入模型

轉:https://blog.csdn.net/u014529917/article/details/53898357 一、環境配置 1.下載cesium js 下載地址 https://github.com/AnalyticalGraphicsInc/cesium/releas

swagger實現api介面視覺

1.pom.xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.framework.version>4

人人都是資料分析師:Tableau應用實戰()初級視覺分析

初級視覺化分析 本章將以電力行業資料及常見視覺化分析需求為例,介紹11種初級檢視的建立用法,分別是:以“2014年各省市售電量明細表”作為資料來源的條形圖(4.1)、餅圖(4.3)、折線圖(4.4)、氣泡圖(4.8)、圓檢視(4.9)、標靶圖(4.10);以“公司年齡統計表”作為資料

4種更快更簡單實現Python資料視覺的方法

選自towardsdatascience,作者:George Seif,機器之心編譯,參與:Geek AI、劉曉坤。 熱力圖、二維密度圖、蜘蛛網圖和樹狀圖,這些視覺化方法你都用過嗎? 資料視覺化是資料科學或機器學習專案中十分重要的一環。通常,你需要在專案初期進行探索性的資料分析(EDA),從而對資

利用python呼叫hanlp實現依存句法視覺

環境:Windows、python3.6 2、安裝python的pyhanlp包:pip install pyhanlp 3、Windows使用者如果遇到: building '_jpype' extension error: Microsoft Visual C

4種更快更簡單實現Python資料視覺的方法!

熱力圖、二維密度圖、蜘蛛網圖和樹狀圖,這些視覺化方法你都用過嗎? 資料視覺化是 資料科學 或 機器學習 專案中十分重要的一環。通常,你需要在專案初期進行探索性的 資料分析 (EDA),從而對資料有一定的瞭解,而且建立視覺化確實可以使分析的任務更清晰、更容易理解,特別是對於大規模的高維資料集。在專

Vegas使用技巧—— 如何實現立體調整?

當我們在看一些影視剪輯作品時,經常會看到一些三維的運動效果,所以大家就會想知道怎麼製作的,那麼今天小編就來簡單的教一下大家,這些效果如何使用Vegas來輕鬆的實現吧! 首先下載一個簡體中文版Vegas並安裝,雙擊開啟Vegas軟體,最新版本的軟體介面如下圖所示。 Vegas Pro

簡單一招實現json資料視覺

開發一個內部功能時碰到的需求,要把json資料在頁面上展示出來,平時瀏覽器會安裝jsonView這樣的擴充套件來看json資料,但是程式要用到的話該怎麼辦呢?今天在網上搜索的時候,發現了這個小技巧,分享一下。 要用到的核心是JSON.stringify這個函式,沒想到吧,平時我