同一份資料不同視圖檢視可能用的比較少,因為3D視圖放大很多後就和2D地圖差不多了,畸變很小,用于超大範圍的地圖顯示時有用,很多時候都是在平面地圖上進行分析、查詢、操作。教學需要可能會對這個有要求?
本文沒有深究兩個比較複雜的函數,希望有朝一日能讀懂吧,對于這種同一個Map對象不同視圖的同步顯示,建議直接copy後半截内容即可。
鷹眼功能和這個類似,不過鷹眼功能(即上一篇文章)是利用watch()和watchUtils.when()來實作的同步,這個例子又有什麼不同呢?探究之。
直接看結果圖:

看起來就是兩個無邊框的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()方法。