Cesium開發(fā)基礎(chǔ)篇 | 03加載矢量數(shù)據(jù)

基礎(chǔ)篇的前兩節(jié)我們學(xué)習(xí)了在三維球中通過Cesium如何加載影像數(shù)據(jù)和地形數(shù)據(jù),今天我們學(xué)習(xí)一下Cesium是如何加載矢量數(shù)據(jù)的。在學(xué)習(xí)之前,首先我們先了解一下什么是矢量數(shù)據(jù)。

矢量數(shù)據(jù)(Vector Data)是用X、Y、Z坐標(biāo)表示地圖圖形或地理實(shí)體位置的數(shù)據(jù),一般是通過記錄坐標(biāo)的方式來盡可能將地理實(shí)體的空間位置表現(xiàn)的準(zhǔn)確無誤,常見的矢量數(shù)據(jù)有:點(diǎn)、線、面等格式。我們使用矢量數(shù)據(jù)的原因,就是因?yàn)槭噶繑?shù)據(jù)具有數(shù)據(jù)結(jié)構(gòu)緊湊、冗余度低、有利于網(wǎng)絡(luò)和檢索分析、圖形顯示質(zhì)量好、精度高等優(yōu)點(diǎn)。

目前最常見的矢量數(shù)據(jù)格式就是shapfile(簡(jiǎn)稱shp),它是由Esri公司開發(fā)的一種空間數(shù)據(jù)開放格式。同時(shí)shapfile也成為了GIS行業(yè)的標(biāo)準(zhǔn),幾乎所有的商業(yè)和開源GIS軟件都支持Shapefile。通常情況下,一個(gè)"shapefile"通常指帶有.shp、.shx、.dbf和其他擴(kuò)展名且前綴名稱一致的文件(.prj、.sbn等)集合。

一個(gè)shapfile必須包含的文件:

  • 主文件(*.shp):存儲(chǔ)地理要素的幾何信息
  • 索引文件(*.shx):存儲(chǔ)要素幾何圖形的索引信息
  • dBase表文件(*.dbf):存儲(chǔ)地理要素的屬性信息(非幾何信息)

除此之外還有可選的文件:

  • 空間參考文件(.prj):存儲(chǔ)空間參考信息,即地理坐標(biāo)系統(tǒng)信息和投影坐標(biāo)系統(tǒng)信息,使用well-known文本格式(WKT)進(jìn)行描述。
  • 幾何體的空間索引文件(.sbn 和 .sbx)、只讀的Shapefiles的幾何體的空間索引文件(.fbn 和.fbx)等等

shapfile如此強(qiáng)大和受歡迎,只可惜Cesium卻不能直接加載shp文件,如果想加載shp文件,感興趣的可以參考這位大牛封裝的庫CesiumVectorTile。Cesium直接支持的矢量數(shù)據(jù)格式包括:geojson、topojson、kml以及具有時(shí)間特性的czml,并以DataSouce后綴去命名相關(guān)的類。


Cesium加載geojson文件

GeoJSON介紹
GeoJSON是用于描述地理空間信息的數(shù)據(jù)格式,它不是一種新的格式,其語法規(guī)范是符合JSON格式的,只不過對(duì)其名稱進(jìn)行了規(guī)范,專門用于表示地理信息。
GeoJSON的最外層是一個(gè)單獨(dú)的對(duì)象(object)。這個(gè)對(duì)象可表示:
① 幾何體(Geometry);
② 特征(Feature);
③ 特征集合(FeatureCollection);
最外層的 GeoJSON 里可能包含有很多子對(duì)象,每一個(gè) GeoJSON 對(duì)象都有一個(gè) type 屬性,表示對(duì)象的類型,其type 的值可以是:Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon、GeometryCollection、Feature、FeatureCollection。下面是一個(gè)GeoJSON特征集合示例:

{ 
  "type": "FeatureCollection",
  "features": [
    { "type": "Feature",
      "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
      "properties": {"prop0": "value0"}
    },
    { "type": "Feature",
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
          ]
        },
      "properties": {
        "prop0": "value0",
        "prop1": 0.0
        }
    },
    { "type": "Feature",
       "geometry": {
         "type": "Polygon",
         "coordinates": [
           [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
             [100.0, 1.0], [100.0, 0.0] ]
           ]
       },
       "properties": {
         "prop0": "value0",
         "prop1": {"this": "that"}
         }
     }
   ]
 }

TopoJSON介紹
TopoJSON是 GeoJSON 按拓?fù)鋵W(xué)編碼后的擴(kuò)展形式,是由 D3 的作者 Mike Bostock 制定的。相比 GeoJSON 直接使用Polygon、Point之類的幾何體來表示圖形的方法,TopoJSON中的每一個(gè)幾何體都是通過將共享邊(被稱為arcs)整合后組成的。對(duì)比簡(jiǎn)易圖如下:

TopoJSON使用坐標(biāo)(點(diǎn))、?。ň€、多邊形)來表示地理圖形,它由transform、objects和arcs三部分組成。transform描述了變換參數(shù);objects描述地理實(shí)體包含空間及屬性信息;arcs描述了有向弧的空間關(guān)系,弧由一系列起點(diǎn)及相對(duì)于起點(diǎn)的有向偏移坐標(biāo)表示?;谶@種弧的存儲(chǔ)方式可以表達(dá)出拓?fù)潢P(guān)系,由于弧只記錄一次及地理坐標(biāo)使用整數(shù),不使用浮點(diǎn)數(shù),相對(duì)于GeoJSON,TopoJSON 消除了冗余,文件大小縮小了 80%。

概念總是那么的抽象,為了表達(dá)得更形象些,下面列出了相關(guān)示例。


{
  "type":"Topology",
  "transform":{
    "scale": [1,1],      //縮放比例
    "translate": [0,0] //相對(duì)于原點(diǎn)([0,0])的偏移量
  },
  "objects":{ 
    "two-squares":{
      "type": "GeometryCollection",
      "geometries":[
        {"type": "Polygon", "arcs":[[0,1]],"properties": {"name": "Left_Polygon" }},
        {"type": "Polygon", "arcs":[[2,-1]],"properties": {"name": "Right_Polygon" }}
      ]
    },
    "one-line": {
      "type":"GeometryCollection",
      "geometries":[
        {"type": "LineString", "arcs": [3],"properties":{"name":"Under_LineString"}}
      ]
    },
    "two-places":{
      "type":"GeometryCollection",
      "geometries":[
        {"type":"Point","coordinates":[0,0],"properties":{"name":"Origine_Point"}},
        {"type":"Point","coordinates":[0,-1],"properties":{"name":"Under_Point"}}
      ]
    }
  },
  "arcs": [
    [[1,2],[0,-2]],
    [[1,0],[-1,0],[0,2],[1,0]],
    [[1,2],[1,0],[0,-2],[-1,0]],
    [[0,-1],[2,0]]
  ]}

在線工具推薦

示例代碼

var viewer = new Cesium.Viewer("cesiumContainer");                   
viewer.dataSources.add(
  Cesium.GeoJsonDataSource.load(
    "../../SampleData/ne_10m_us_states.topojson",
    {
      stroke: Cesium.Color.HOTPINK,
      fill: Cesium.Color.PINK.withAlpha(0.5),
      strokeWidth: 3,
    }
  )
);

Cesium加載kml文件

KML介紹
KML (keyhole markup language)是一種基于XML語法格式的文件,用來描述和存儲(chǔ)地理信息數(shù)據(jù)(點(diǎn)、線、面、多邊形、多面體以及模型等),通常應(yīng)用于 Google 地球相關(guān)軟件中(Google Earth,Google Map 等),它跟XML文件最大的不同就是KML描述的是地理信息數(shù)據(jù),同時(shí)KML已正式被OGC采用,成為OGC眾多規(guī)范中的一個(gè)。KML文件有兩個(gè)文件擴(kuò)展名:.KML 和.KMZ(一個(gè)或幾個(gè) KML 文件的壓縮集,采用 zip 格式壓縮)。Cesium從1.7版開始就支持KML,目前對(duì)KML的支持還不完整,但是支持大量的標(biāo)準(zhǔn)以及Google的gx擴(kuò)展名稱空間。有關(guān)支持哪些內(nèi)容和不支持哪些內(nèi)容的詳細(xì)列表,請(qǐng)參見Github問題 #873。

示例代碼

var viewer = new Cesium.Viewer("cesiumContainer");                   
Cesium.KmlDataSource.load(
  "../../SampleData/kml/facilities/facilities.kml",
  {
    camera: viewer.scene.camera,
    canvas: viewer.scene.canvas,
  }
)

Cesium加載czml文件

CZML介紹
CZML是cesium中很重要的一個(gè)概念,也是一個(gè)亮點(diǎn),它使得cesium很酷很炫地展示動(dòng)態(tài)數(shù)據(jù)成為可能。CZML是一種JSON格式的字符串,用于描述與時(shí)間有關(guān)的動(dòng)畫場(chǎng)景,CZML包含點(diǎn)、線、地標(biāo)、模型和其他的一些圖形元素,并指明了這些元素如何隨時(shí)間而變化。Cesium擁有一套富客戶端API,通過CZML采用數(shù)據(jù)驅(qū)動(dòng)的方式,不用寫代碼我就可以使用通用的Cesium viewer構(gòu)建出豐富的場(chǎng)景。某種程度上說,,Cesium和CZML的關(guān)系就像Google Earth和KML的關(guān)系,兩者都是用于描述其各自客戶端中的場(chǎng)景的數(shù)據(jù)格式,并且旨在由各種各樣的應(yīng)用程序生成,甚至可能是手工編寫的 。
下面是一個(gè)典型的CZML數(shù)據(jù)結(jié)構(gòu):

[
    // packet one
    {
        "id": "GroundControlStation"
        "position": { "cartographicDegrees": [-75.5, 40.0, 0.0] },
        "point": {
            "color": { "rgba": [0, 0, 255, 255] },
        }
    },
    // packet two
    {
        "id": "PredatorUAV",
        // ...
    }
]

如上CZML片段描述了兩個(gè)數(shù)據(jù)包,每個(gè)數(shù)據(jù)包都有一個(gè)id標(biāo)識(shí)它描述的對(duì)象的屬性。id不一定要求是GUID,但它們確實(shí)需要唯一地標(biāo)識(shí)CZML源中的單個(gè)對(duì)象。如果id未指定,Cesium將自動(dòng)生成一個(gè)唯一的。但是,這會(huì)阻止以后的數(shù)據(jù)包引用該對(duì)象,例如向該對(duì)象添加更多數(shù)據(jù)。除id屬性之外,還包含更多的屬性用于定義要繪制對(duì)象的屬性。在上面的示例中,我們?cè)赪GS 84(-75.5,40.0,0.0)位置中指定了一個(gè)id為“ GroundControlStation”對(duì)象,并在其位置繪制了一個(gè)藍(lán)色的點(diǎn)。詳細(xì)的數(shù)據(jù)結(jié)構(gòu)和更多的屬性可參考CZML數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)包這兩個(gè)地址。

CZML比較特殊的是跟時(shí)間序列相關(guān)的屬性。

{  
    // ...  
    "someInterpolatableProperty": {  
        "cartesian": [  
            "2012-04-30T12:00Z", 1.0, 2.0, 3.0, //表示當(dāng)時(shí)間為2012-04-30T12:00Z,坐標(biāo)為(1,2,3)
            "2012-04-30T12:01Z", 4.0, 5.0, 6.0, //表示當(dāng)時(shí)間為2012-04-30T12:01Z,坐標(biāo)為(4,5,6)
            "2012-04-30T12:02Z", 7.0, 8.0, 9.0  //表示當(dāng)時(shí)間為2012-04-30T12:02Z,坐標(biāo)為(7,8,9)
        ]  
    }  
}

{  
    // ...  
    "someInterpolatableProperty": {  
        "epoch": "2012-04-30T12:00Z", //表示時(shí)間起點(diǎn)為2012-04-30T12:00:00 
        "cartesian": [  
            0.0, 1.0, 2.0, 3.0,  //從起點(diǎn)開始,第0秒時(shí)坐標(biāo)為(1,2,3)
            60.0, 4.0, 5.0, 6.0, //從起點(diǎn)開始,第60秒時(shí)坐標(biāo)為(4,5,6) 
            120.0, 7.0, 8.0, 9.0 //從起點(diǎn)開始,第120秒時(shí)坐標(biāo)為(7,8,9) 
        ]  
    }  
}

{  
    // ...  
    "someInterpolatableProperty": {  
        "epoch": "2012-04-30T12:00Z",  
        "cartesian": [  
            0.0, 1.0, 2.0, 3.0,  
            60.0, 4.0, 5.0, 6.0,  
            120.0, 7.0, 8.0, 9.0  
        ],  
        "interpolationAlgorithm": "LAGRANGE",  //插值算法為LAGRANGE,還有HERMITE,GEODESIC
        "interpolationDegree": 5 //1為線性插值,2為平方插值
    }, 
 }

定義了一個(gè)CZML后,就可以把它載入到場(chǎng)景中,就能獲得該對(duì)象的動(dòng)態(tài)效果。

示例代碼

var viewer = new Cesium.Viewer("cesiumContainer", {
  animation: true, // 動(dòng)畫小組件
  shouldAnimate: true,
});
viewer.dataSources.add(
  Cesium.CzmlDataSource.load("../../SampleData/Vehicle.czml")
  );

下面是加載cesium官網(wǎng)提供的Vehicle.czml數(shù)據(jù)示例的效果,一輛小車緩緩移動(dòng),可通過動(dòng)畫控制器對(duì)小車進(jìn)行快進(jìn)、暫停、倒放、回放等等操作。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容