Cesium開發(fā)工具篇 | 01組件重寫

在剛開始的入門篇中婿禽,我們講過 Cesium 小組件的顯隱究反,感興趣的小伙伴可以查看我前面寫過的文章 Cesium初始化界面介紹及相關(guān)小組件顯隱 石咬。那問題來了,這些組件除了能控制顯隱吹截,是否能在不修改源碼的基礎(chǔ)上對(duì)其進(jìn)行擴(kuò)展重寫呢续挟?答案是當(dāng)然可以坪哄!但并不是所有的組件都能重寫帝际,本節(jié)主要講解在不修改源碼的基礎(chǔ)上,如何對(duì)以下三個(gè)常用的控件進(jìn)行修改涮拗,以達(dá)到快速實(shí)現(xiàn)實(shí)際中業(yè)務(wù)需求的功能乾戏。當(dāng)然,如果您對(duì) Cesium 源碼研究的比較深入三热,也可以通過修改源碼的方式實(shí)現(xiàn)鼓择。

homeButton組件

homeButton 功能在實(shí)際的應(yīng)用場(chǎng)景中很常見而且功能也很實(shí)用,該組件的主要功能是返回到系統(tǒng)初始化時(shí)的位置就漾。默認(rèn)是整個(gè)球的位置呐能,如下圖:

但是在實(shí)際的業(yè)務(wù)場(chǎng)景中,一般初始化范圍都是某一個(gè)城市或園區(qū)的位置抑堡,如果使用 Cesium 自帶的 homeButton 組件摆出,就需要對(duì)其進(jìn)行修改,使我們?cè)邳c(diǎn)擊homeButton時(shí)首妖,相機(jī)不是定位到Cesium自帶的默認(rèn)位置偎漫,而是定位到我們想要的位置。我們?cè)撊绾涡薷哪兀?/p>

1)修改相機(jī)的默認(rèn)矩形范圍

    Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(
      110.15,
      34.54,
      110.25,
      34.56
    ); //Rectangle(west, south, east, north)

2)在 homeButton 的 viewModel 中添加監(jiān)聽事件

    if (viewer.homeButton) {
      viewer.homeButton.viewModel.command.beforeExecute.addEventListener(
        function (e) {
          e.cancel = true;
          //你要飛的位置
          viewer.camera.flyTo({
            destination: Cesium.Cartesian3.fromDegrees(117.16, 32.71, 15000.0),
          });
        }
      );
    }

Geocoder組件

Geocoder 是地理編碼的意思有缆,我們常用的 POI 搜索就是就是 Geocoder 的功勞象踊。通過查看 Cesium 源碼(Source/Widgets/Geocoder/GeocoderViewModel.js 第73行),我們發(fā)現(xiàn)Cesium 默認(rèn)采用的是 Bing 地圖服務(wù)來實(shí)現(xiàn)地理編碼的功能棚壁,并且是通過 geocode 方法實(shí)現(xiàn)的杯矩。那么我們就可以通過覆寫 geocoder 方法的方式來實(shí)現(xiàn)自定義的地理編碼服務(wù),下面我們重寫geocode方法袖外,將 Cesium 默認(rèn)的 Bing 地圖服務(wù)改為OSM地圖服務(wù)史隆。

  function OpenStreetMapNominatimGeocoder() {}
   OpenStreetMapNominatimGeocoder.prototype.geocode = function (input) {
      var url = "https://nominatim.openstreetmap.org/search";
      var resource = new Cesium.Resource({
        url: url,
        queryParameters: {
          format: "json",
          q: input,
        },
      });

      return resource.fetchJson().then(function (results) {
        var bboxDegrees;
        return results.map(function (resultObject) {
          bboxDegrees = resultObject.boundingbox;
          return {
            displayName: resultObject.display_name,
            destination: Cesium.Rectangle.fromDegrees(
              bboxDegrees[2],
              bboxDegrees[0],
              bboxDegrees[3],
              bboxDegrees[1]
            ),
          };
        });
      });
    };

    var viewer = new Cesium.Viewer("cesiumContainer", {
      geocoder: new OpenStreetMapNominatimGeocoder(),
    });

BaseLayerPicker組件

Cesium為我們提供了默認(rèn)的底圖、地形圖的選擇面板在刺,通過修改baseLayerPicker的屬性ture或false來控制顯隱逆害,通過選擇面板中的底圖或地形圖來實(shí)現(xiàn)對(duì)應(yīng)圖層的切換與顯示。Cesum 提供的默認(rèn)選擇面板如下圖所:

這些圖層都是在線的資源蚣驼,如果是離線環(huán)境,或者是只顯示客戶提供的幾個(gè)圖層數(shù)據(jù)相艇,我們?cè)撊绾螌?shí)現(xiàn)呢颖杏。要實(shí)現(xiàn)這個(gè)功能,首先坛芽,我們看一下 BaseLayerPicker 的主要邏輯關(guān)系圖留储,如下圖翼抠。

從上圖我們可以看出,對(duì)于開發(fā)者而言获讳,要實(shí)現(xiàn)不同的ImageryProvider阴颖,只需要提供不同的ProviderViewModel,比如BingMap丐膝、OSM量愧、ArcGIS、GoogleMaps的帅矗,這樣在BaseLayerPicker的UI中偎肃,就會(huì)有多個(gè)Provider供用戶選擇,而交互則由BaseLayerPickerViewModel類負(fù)責(zé)浑此,用戶并不需要關(guān)心內(nèi)部的實(shí)現(xiàn)累颂,BaseLayerPickerViewModel類已經(jīng)幫我們都實(shí)現(xiàn)了。下面我們利用 BaseLayerPicker 的邏輯關(guān)系凛俱,實(shí)現(xiàn)自定義的 ImageryProvider(高德矢量圖)和 TerrainPovider(ArcGIS地形)紊馏,并將其顯示在選擇器面板中。下面為核心代碼和結(jié)果截圖蒲犬。

    // 自定義影像圖層
    var imageProviderVMs = [];
    let gaodeImageProvider = new Cesium.UrlTemplateImageryProvider({
      url:
        "http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",
      subdomains: ["1", "2", "3", "4"],
    });
    var gaodeVM = new Cesium.ProviderViewModel({
      name: "高德矢量",
      iconUrl: Cesium.buildModuleUrl(
        "Widgets/Images/ImageryProviders/openStreetMap.png"
      ),
      tooltip: "高德矢量 地圖服務(wù)",
      creationFunction: function () {
        return gaodeImageProvider;
      },
    });
    imageProviderVMs.push(gaodeVM);
    viewer.baseLayerPicker.viewModel.imageryProviderViewModels = imageProviderVMs;

    // 自定義地形圖層
    var terrainProviderVMs = [];
    var terrainProvider = new Cesium.ArcGISTiledElevationTerrainProvider({
      url:
        "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer",
      token:
        "KED1aF_I4UzXOHy3BnhwyBHU4l5oY6rO6walkmHoYqGp4XyIWUd5YZUC1ZrLAzvV40pR6gBXQayh0eFA8m6vPg..",
    });
    var arcgisVM = new Cesium.ProviderViewModel({
      name: "ArcGIS地形",
      iconUrl: Cesium.buildModuleUrl(
        "Widgets/Images/TerrainProviders/Ellipsoid.png"
      ),
      tooltip: "ArcGIS地形服務(wù)",
      creationFunction: function () {
        return terrainProvider;
      },
    });
    terrainProviderVMs.push(arcgisVM);
    viewer.baseLayerPicker.viewModel.terrainProviderViewModels = terrainProviderVMs;

獲取完整代碼朱监,可查看本人 GitHub 地址https://github.com/ls870061011/cesium_training/tree/main/examples 中的3_1部分。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暖哨,一起剝皮案震驚了整個(gè)濱河市赌朋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篇裁,老刑警劉巖沛慢,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異达布,居然都是意外死亡团甲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門黍聂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躺苦,“玉大人,你說我怎么就攤上這事产还∑ダ澹” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵脐区,是天一觀的道長(zhǎng)愈诚。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么炕柔? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任酌泰,我火速辦了婚禮,結(jié)果婚禮上匕累,老公的妹妹穿的比我還像新娘陵刹。我一直安慰自己,他們只是感情好欢嘿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布衰琐。 她就那樣靜靜地躺著,像睡著了一般际插。 火紅的嫁衣襯著肌膚如雪碘耳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天框弛,我揣著相機(jī)與錄音辛辨,去河邊找鬼。 笑死瑟枫,一個(gè)胖子當(dāng)著我的面吹牛斗搞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慷妙,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼僻焚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了膝擂?” 一聲冷哼從身側(cè)響起虑啤,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎架馋,沒想到半個(gè)月后狞山,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叉寂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年萍启,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屏鳍。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勘纯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钓瞭,到底是詐尸還是另有隱情驳遵,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布山涡,位于F島的核電站超埋,受9級(jí)特大地震影響搏讶,放射性物質(zhì)發(fā)生泄漏佳鳖。R本人自食惡果不足惜霍殴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望系吩。 院中可真熱鬧来庭,春花似錦、人聲如沸穿挨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽科盛。三九已至帽衙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贞绵,已是汗流浹背厉萝。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榨崩,地道東北人谴垫。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像母蛛,于是被迫代替她去往敵國(guó)和親翩剪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容