天天看點

ArcGIS API for JavaScript 4.2學習筆記[10] 2D添加指北針widget、視圖儲存、視圖padding(第二章完結)

這幾個例子是第二章除了入門之外比較簡單的幾個,就做個合集,把最核心的代碼(第二參數)和 引用放上來即可,不作多解釋。

2D地圖添加指北針widget

2D地圖一般修正方向為正北方就需要這個widget。

引用:

[
        "esri/Map",
        "esri/views/MapView",
        "esri/widgets/Compass",
        "dojo/domReady!"
]      

在function(Map,MapView,Compass)執行個體化Map和MapView後,添加這兩行代碼:

var compassWidget = new Compass({view: view});
view.ui.add(compassWidget, "top-left");      

即可。有關Compass這個widget的構造函數,可以查閱API了解更多,我感覺不會那麼少吧...還有這個ui.add()方法,感覺日後添加widget布局的時候可以仔細學學。

ps:Compass在SceneView中是預設顯示的。

視圖padding改變

這個幾乎沒有難度。

給個圖預覽吧:

ArcGIS API for JavaScript 4.2學習筆記[10] 2D添加指北針widget、視圖儲存、視圖padding(第二章完結)

本來小島這種東西就應該在地圖的最中央位置,但是由于右邊多了一塊DIV(寬度320px),是以地圖為了避開DIV而對齊就必須把視圖的padding值改為320(和DIV一樣)。在百度地圖舊版本中,就喜歡搞一個面闆,用于提供搜尋資訊的輸入框和結果框、篩選按鈕等。

直接給出源代碼:

require(
    [ "esri/Map", "esri/views/MapView", "dojo/domReady!" ], 
    function(Map,MapView) {
      var map = new Map({
        basemap: "topo"
      });
      var view = new MapView({
        container: "viewDiv",
        map: map,
        center: [-74.045459, 40.690083], 
        zoom: 16,
        padding: {
          right: 320 
        }
      });
    });      

僅僅是在view的執行個體化中把padding的right改為320,在html中:

<body>
  <div id="viewDiv">
    <div id="sidebar">
      <div id="text">
            内容雲雲,此處省略
      </div>
    </div>
  </div>
</body>      

在style标簽中,把sidebar這個div的width設定成了同樣的320px。

視圖儲存

這個就比較有趣了。首先要提供一個輸入title的地方,還要有一個儲存image的地方。

這個例子,使用了SceneView,SceneView的map屬性使用了伺服器上的WebScene(專題三維地圖)。由于這個比較容易,就忽略了。

<body>
  <div id="viewDiv"></div>
  <div id="createSlideDiv">
    New slide: <input type="text" id="createSlideTitleInput" size="10" />
    <button
      id="createSlideButton">Create</button>
  </div>
  <div id="slidesDiv"></div>
</body>      

從html代碼可以看出,提供了一個createSlideDiv,内含input和一個button以供輸入。

還有一個slidesDiv以供儲存img清單。

見下圖:

ArcGIS API for JavaScript 4.2學習筆記[10] 2D添加指北針widget、視圖儲存、視圖padding(第二章完結)

第一步,把這幾個div加入到view對象的ui中去。

view.ui.add(["createSlideDiv", "slidesDiv"], "top-right");      

第二步,在view建立好後,執行以下代碼。關于then(),請檢視鷹眼一文的末尾。

view.then(function() {
        dom.byId("slidesDiv").style.visibility = "visible";
        var slides = scene.presentation.slides;
        slides.forEach(createSlideUI);

        on(dom.byId("createSlideButton"), "click", function() {
          Slide.createFrom(view).then(function(slide) {
            slide.title.text = dom.byId("createSlideTitleInput")
              .value;
            scene.presentation.slides.add(slide);
            createSlideUI(slide, "first");
          });
        });
      });      

首先,将slidesDiv置為可視。

第二,若WebScene存在slide,那麼就全部裝到清單中去。

然後var一個slides變量,擷取WebScene執行個體scene的目前所有的slides。

然後周遊每一個slides成員,對其進行createSlideUI操作(見下,即建立DIV清單裡的UI對象)。

第三,調用dojo的on(DOM元素,事件類型,事件方法體),為新增slide的那個按鈕添加click事件。

注意Slide.createFrom()方法,它将從view中建立slide。

在這個方法的回調函數中,設定輸入框的文本slide的标題。

然後把slide添加到scene這個WebScene中去。

最後調用createSlideUI建立div即可。

function createSlideUI(slide, placement) {
        var slideElement = domConstruct.create("div", {
          id: slide.id,
          className: "slide"
        });
        var position = placement ? placement : "last";
        domConstruct.place(slideElement, "slidesDiv", position);
        domConstruct.create("div", {
          textContent: slide.title.text,
          className: "title"
        }, slideElement);
        domConstruct.create("img", {
          src: slide.thumbnail.url,
          title: slide.title.text
        }, slideElement);
        on(slideElement, "click", function() {
          query(".slide").removeClass("active");
          domClass.add(slideElement, "active");
          slide.applyTo(view);
        });
      }      

createSlideUI()方法就是建立DIV了,首先用domConstruct.create()方法建立一個divDOM元素,然後确定位置position,

緊接着在這個div裡添加标題div、圖檔div,最後為這個div添加click事件。

雖然最後一個例子看起來比較長,但是邏輯都很清晰,代碼也沒什麼碎片化,完全可以直接照抄兩個代碼段。

至此,第二章的學習就差不多了,關于WebScene、WebMap這兩個從Map類中派生出來的子類(和Basemap同級),我覺得查閱API更有效果,而且可能是得配合ArcServer才能弄懂的東西,就先不學了。

要說資料準備這塊這一章還真沒寫,是以極有可能在Layers那章才會學到了吧,再不濟,百度啊谷歌啊幹什麼用的?

是以,整理一下所學,開始準備學習Popups(彈出框)、Searching(空間查詢)和Analysis(空間分析)吧~

Layers和Widgets兩章留給三月份研讀。

繼續閱讀