1. 程式人生 > >Cesium學習筆記(二):新增實體物件

Cesium學習筆記(二):新增實體物件

1. 首先,你需要選擇一款程式碼編輯器,可以選擇eclipse,webstorm,visual studio code這種比較大型的帶有程式碼提示的,你也可以選擇sublime,nodepad++,atom這種沒有提示的,但是不能使用word這種自帶格式的,這樣出來的程式碼其實是有很大問題的。

以上這些你都可以自行選擇,Cesium官方也給我們提供了一個很好用的東西Sandcastle,它可以很方便的把效果顯示出來,不用來回切換,而且它還自帶了很多例子,你可以直接通過例子來學習,它就在你本地的伺服器中,輸入localhost:8080/Apps/Sandcastle就可以找到。

但是我還是建議你至少找一款編譯器,至少都有最基本的程式碼提示不是?畢竟官方這個只是個網頁,一點程式碼提示都沒有

2. 下面進入正題

首先在我們的編譯器中開啟HelloWorld.html,可以看到內容,我稍微註釋一下

<!DOCTYPE html>
<html lang="en">
<head>
  <!-- Use correct character set. -->
  <meta charset="utf-8">
  <!-- Tell IE to use the latest, best version. -->
  <meta http-equiv="X-UA-Compatible" content
="IE=edge">
<!-- Make the application on mobile take up the full browser screen and disable user scaling. --> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> <title>Hello World!</title> <!-- 這裡引用的是Cesium的庫,你以後所有的東西都從這個庫中呼叫 -->
<script src="../Build/Cesium/Cesium.js"></script> <!-- 這裡是Cesium的viewer需要的css檔案 --> <style> @import url(../Build/Cesium/Widgets/widgets.css); html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } </style> </head> <body> <!-- 這就是我們顯示出來的東西了 --> <div id="cesiumContainer"></div> <!-- 這裡我把js程式碼提出來寫了 --> <script src="../Apps/JS/hello.js"></script> </body> </html>

3. 第一個例子

首先我們在地圖上新增一個多邊形實體

var viewer = new Cesium.Viewer('cesiumContainer');
//建立一個多邊形實體物件
var wyoming = viewer.entities.add({
  name : 'Wyoming',
  polygon : {
    //給出位置
    hierarchy : Cesium.Cartesian3.fromDegreesArray([
                              -109.080842,45.002073,
                              -105.91517,45.002073,
                              -104.058488,44.996596,
                              -104.053011,43.002989,
                              -104.053011,41.003906,
                              -105.728954,40.998429,
                              -107.919731,41.003906,
                              -109.04798,40.998429,
                              -111.047063,40.998429,
                              -111.047063,42.000709,
                              -111.047063,44.476286,
                              -111.05254,45.002073]),
    //離地高度
    height : 0,
    //材質(相當於填充色,但是可以填充的可不止顏色,可以看到這裡是紅色半透明)
    material : Cesium.Color.RED.withAlpha(0.5),
    //外邊線
    outline : true,
    outlineColor : Cesium.Color.BLACK
  }
});
//這是一個動畫效果,進入後鏡頭就會自動轉到這個實體處
viewer.zoomTo(wyoming);

這裡寫圖片描述

還可以讓它擁有體積

//離地高度
wyoming.polygon.height = 300000;
//兩個高度差組成了它的體積
wyoming.polygon.extrudedHeight : 250000;

這裡寫圖片描述

我們還可以給他配上一個介紹

wyoming.description = '\
<img\
  width="50%"\
  style="float:left; margin: 0 1em 1em 0;"\
  src="//imgsrc.baidu.com/baike/abpic/item/d35a10f45f26d158dcc4740e.jpg"/>\
<p>\
  一大塊果凍,想不想吃?\
</p>\
<p>\
  介紹: \
  <a style="color: WHITE"\
    target="_blank"\
    href="http://imgsrc.baidu.com/baike/abpic/item/d35a10f45f26d158dcc4740e.jpg">點選檢視</a>\
</p>';

這裡寫圖片描述

當然我們可以照著這個例子畫點其他的,比如一個白色的橢圓

var entity = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(-103.0, 40.0),
  ellipse : {
    //長短半軸(橢圓嘛)
    semiMinorAxis : 250000.0,
    semiMajorAxis : 400000.0,
    material : Cesium.Color.WHITE.withAlpha(0.5)
  }
});
viewer.zoomTo(viewer.entities);

這裡寫圖片描述

形狀有很多,這裡列舉一些

  • 盒 entity.box
  • 圈和橢圓 entity.ellipse
  • 走廊 entity.corridor
  • 氣缸和錐體 entity.cylinder
  • 多邊形 entity.polygon
  • 折線 entity.polyline
  • 折線卷 entity.polylineVolume
  • 矩形 entity.rectangle
  • 球體和橢球體 entity.ellipsoid
  • 牆壁 entity.wall

大家可以自己搞幾個玩玩,具體屬性可以查一查API

然後我們繼續玩,我們甚至可以在裡面填充一些圖片

ellipse.material = '//cesiumjs.org/images/2015/02-02/cats.jpg';

這裡寫圖片描述

再比如把它做成斑馬條紋的

var entity = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(-103.0, 40.0),
  ellipse : {
    semiMinorAxis : 250000.0,
    semiMajorAxis : 400000.0,
    //條形材質
    material : new Cesium.StripeMaterialProperty({
      evenColor : Cesium.Color.WHITE,
      oddColor : Cesium.Color.BLACK,
      repeat : 16
    })
  }
});
viewer.zoomTo(viewer.entities);

這裡寫圖片描述

一條藍色的發光線(怎麼感覺發的是白光)

var entity = viewer.entities.add({
  polyline : {
    positions : Cesium.Cartesian3.fromDegreesArray([-77, 35,
                                                    -77.1, 35]),
    width : 5,
    material : new Cesium.PolylineGlowMaterialProperty({
         glowPower : 0.3,
         color : Cesium.Color.BLUE
})
  }
});
viewer.zoomTo(viewer.entities);

這裡寫圖片描述

4. 點,廣告牌和標籤(Points, Billboards, and Labels)

這東西可以用來做標記的,比如說,我把南京的玄武湖標記一下

var xuanwuhu = viewer.entities.add({
  name : 'xuanwuhu',
  position : Cesium.Cartesian3.fromDegrees(118.793091, 32.074570),
  point : {
    pixelSize : 5,
    color : Cesium.Color.RED,
    outlineColor : Cesium.Color.WHITE,
    outlineWidth : 2
  },
  label : {
    text : '玄武湖',
    font : '14pt monospace',
    style: Cesium.LabelStyle.FILL_AND_OUTLINE,
    outlineWidth : 2,
    //垂直位置
    verticalOrigin : Cesium.VerticalOrigin.BUTTON,
    //中心位置
    pixelOffset : new Cesium.Cartesian2(0, 20)
  }
});
viewer.zoomTo(xuanwuhu);

這裡寫圖片描述
這裡寫圖片描述

廣告牌可以顯示一個圖片

var citizensBankPark = viewer.entities.add({
  position : Cesium.Cartesian3.fromDegrees(-75.166493, 39.9060534),
  //廣告牌
  billboard : {
      image : 'http://imgsrc.baidu.com/baike/abpic/item/d35a10f45f26d158dcc4740e.jpg',
      width : 64,
      height : 64
  },
  label : {
    text : 'Citizens Bank Park',
    font : '14pt monospace',
    style: Cesium.LabelStyle.FILL_AND_OUTLINE,
    outlineWidth : 2,
    verticalOrigin : Cesium.VerticalOrigin.TOP,
    pixelOffset : new Cesium.Cartesian2(0, 32)
  }
});
viewer.zoomTo(citizensBankPark);

這裡寫圖片描述

5. 新增3D模型

這個比較多,也比較重點,後面會有單獨一篇寫這個,先看個例子吧

var viewer = new Cesium.Viewer('cesiumContainer');
var entity = viewer.entities.add({
    position : Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706),
    model : {
        uri : '../Apps/SampleData/models/CesiumGround/Cesium_Ground.gltf'
    }
});
//這個是鏡頭追蹤,將鏡頭固定在小車上
viewer.trackedEntity = entity;

很簡單,直接載入一個實體模型,模型都是從外面匯入的,這個是Cesium自帶的一個小車(還是動態的呢)

這裡寫圖片描述