天天看點

ArcGIS API for JavaScript 4.2學習筆記[8] 2D與3D視圖同步

同一份資料不同視圖檢視可能用的比較少,因為3D視圖放大很多後就和2D地圖差不多了,畸變很小,用于超大範圍的地圖顯示時有用,很多時候都是在平面地圖上進行分析、查詢、操作。教學需要可能會對這個有要求?

本文沒有深究兩個比較複雜的函數,希望有朝一日能讀懂吧,對于這種同一個Map對象不同視圖的同步顯示,建議直接copy後半截内容即可。

鷹眼功能和這個類似,不過鷹眼功能(即上一篇文章)是利用watch()和watchUtils.when()來實作的同步,這個例子又有什麼不同呢?探究之。

直接看結果圖:

ArcGIS API for JavaScript 4.2學習筆記[8] 2D與3D視圖同步

看起來就是兩個無邊框的DIV,寬度各占50%。

實際上操作的結果就是,在任意一個視圖拖動、縮放、旋轉視圖,另一個也跟着變,幾乎就是放大版的鷹眼,也可以說是鷹眼的另一種寫法。

給出require的引用:

require(
    [
      "esri/Map",
      "esri/views/MapView",
      "esri/views/SceneView",
      "esri/core/watchUtils",
      "dojo/domReady!"
    ],
     function(Map,MapView, SceneView,watchUtils){
          //你的代碼  
     }
);      

嗯?又是watchUtils?看來和監聽少不了幹系了。

//事實上,本例還是用watch監聽和watchUtils監聽完成的同步,但是代碼難于了解,就沒有仔細深究。

看骨幹部分:

function(Map,MapView,SceneView,watchUtils){
    var map = new Map({});
    var view1 = new SceneView({});
    var view2 = new MapView({});
    
    var synchronizeView = function(view, others){};
    var synchronizeViews = function(views){};
    synchronizeViews([view1,view2]);
}      

執行個體化一張地圖,執行個體化兩個視圖,看來和上一個例子還是有差別的。

對此,部落客表示暫時保留原代碼。

因為synchronizeView長達60行,這個方法一定不普通。

部落客的建議是:

如果需要對同一份底圖的2D和3D視圖進行同步觀察顯示,那麼請直接把這兩個syn方法copy過來,甚至包裝成一個方法都可以,傳入參數是兩個view即可。

有興趣的同學可以查閱這個類:esri/core/Collection

這兩個難于了解的方法體内用到了這個類和其幾個方法,如map()方法、slice()方法、concat()方法。

繼續閱讀