Cesium之3D拉伸顯示行政區


轉自原文 Cesium之3D拉伸顯示行政區含GeoJSON數據生成過程GDAL的ogr2ogr

 

Cesiumjs 是一套javascript庫,用來渲染3D地球,2D區域地圖,和多種GIS要素。不需要安裝任何插件就能在支持最新HTML5標准的瀏覽器上運行。支持WebGL硬件加速,非常適合動態數據在GIS圖層上的展示,是一個跨平台,開源,非常有前途的webgis表現層庫。Cesium 基於 Apache 開源協議,支持商業和非商業免費使用。

背景:

Cesiumjs源自 Analytical Graphics, Inc. (AGI)公司為他們客戶開發一個虛擬地球項目,后來將cesium項目貢獻給開源社區並一直活躍開發中。是一種針對Cesium-應用的流式高分辨率服務器)另一個公司級的貢獻者是NICTA (NationalICT Australia) 澳大利亞最大的信息與通訊技術中心,NICTA的員工們貢獻了瓦片地圖服務、地形處理等cesium的核心功能。並一直使用cesium開發環境監測分析、交通基礎設施建模仿真優化等領域的應用。

 

 

Demo需求,想要將北京市行政區划內的要素,用3D表現出來,首先,需要得到北京16個區的面坐標:

 

Cesium通過GeoJSON(JSON格式)格式的數據展示空間要素,因此,需要得到此種格式的北京行政區划坐標,通過研究,可以使用GDAL的ogr2ogr方法將shp格式的圖層轉成GeoJSON格式

 

下面說一下GDAL的下載和使用:

 

需要安裝GDAL,下載路徑:http://www.gisinternals.com/release.php
下載的是第一個:release-1500-gdal-1-11-3-mapserver-6-4-2
解壓縮release-1500-gdal-1-11-3-mapserver-6-4-2.zip
根據里面的read-me.txt,安裝此GDAL需要CMD運行SDKShell.bat命令即可,成功安裝,每次重啟機器后,需要重新執行此程序進行安裝,才能使用
然后cd C:\Users\IBM_ADMIN\Downloads\release-1500-gdal-1-11-3-mapserver-6-4-2\bin\gdal\apps

 

根據ogr2ogr.exe的工具進行轉換,開始,找到的shp文件轉換失敗,后從此命令轉換的shp修改了下,即可成功轉成json,可能是有的shp文件不支持,具體不詳
命令:
將geoJSON轉成shp格式:
C:\Users\IBM_ADMIN\Downloads\release-1500-gdal-1-11-3-mapserver-6-4-2\bin\gdal\a
pps>ogr2ogr -f "ESRI Shapefile" v.shp geojsonfile.json

將f.shp轉成geoJSON格式:
C:\Users\IBM_ADMIN\Downloads\release-1500-gdal-1-11-3-mapserver-6-4-2\bin\gdal\a
pps>ogr2ogr -f "GeoJSON" o.json f.shp

 

因為本地沒有現成的北京行政區shp圖層,因此,又發現竟然可以通過ESRI在線地圖服務的行政區圖層轉成GeoJSON格式,開始發現坐標系不是wgs84,Cesium-1.16僅支持WGS84坐標系,因為,加入參數(此處指的是坐標轉換參數,具體的可以通過ArcGIS的spatial Adjust 獲取的校正參數,或者,直接是坐標平移參數。20.3.21 更新),將ESRI的輸出坐標系轉成4326即可。


代碼:

 

ogr2ogr -f GeoJSON test.json "http://cache1.arcgisonline.cn/ArcGIS/rest/services/ChinaCities_Community_BaseMap_CHN/BeiJing_Community_BaseMap_CHN/MapServer/0/query?where=1%3D1&outfields=*&f=json" OGRGeoJSON
修改下語句即可,ArcGISServer支持輸出不同的坐標系
ogr2ogr -f GeoJSON test.json "http://cache1.arcgisonline.cn/ArcGIS/rest/services/ChinaCities_Community_BaseMap_CHN/BeiJing_Community_BaseMap_CHN/MapServer/0/query?where=1%3D1&outSR=4326&outfields=*&f=json" OGRGeoJSON

完成導出

 

這時候終於得到了GeoJSON格式的北京行政區數據文件

下面就是將Cesium現成的例子,改個數據源地址,和高程字段

//Seed the random number generator for repeatable results.
    Cesium.Math.setRandomNumberSeed(0);

    var promise = Cesium.GeoJsonDataSource.load('../../SampleData/test.json');
    promise.then(function(dataSource) {
        viewer.dataSources.add(dataSource);

        //Get the array of entities
        var entities = dataSource.entities.values;
        
        var colorHash = {};
        for (var i = 0; i < entities.length; i++) {
            //For each entity, create a random color based on the state name.
            //Some states have multiple entities, so we store the color in a
            //hash so that we use the same color for the entire state.
            var entity = entities[i];
            var name = entity.name;
            var color = colorHash[name];
            if (!color) {
                color = Cesium.Color.fromRandom({
                    alpha : 1.0
                });
                colorHash[name] = color;
            }
            
            //Set the polygon material to our random color.
            entity.polygon.material = color;
            //Remove the outlines.
            entity.polygon.outline = false;

            //Extrude the polygon based on the state's population.  Each entity
            //stores the properties for the GeoJSON feature it was created from
            //Since the population is a huge number, we divide by 50.
            entity.polygon.extrudedHeight = entity.properties.Shape_Area / 100000.0;
         
            }
        }
        viewer.zoomTo(promise);

 

 

 

最終效果如上圖所示。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM