拖放门户项目

尝试一下在线预览

此例子展示了如何从 GeoScene 门户中加载 PortalItem 到您的应用程序。

1. 定义一个显示项的模板


您需要为应用程序中显示的每个 PortalItem 定义一个模板。

            
1
2
3
4
5
6
7
8
9
10
11
12
var template =
  '<div data-itemid="{id}" class="card block" draggable="true">' +
    '<figure class="card-image-wrap"><img class="card-image" src="{thumbnailUrl}" alt="Card Thumbnail">' +
      '<figcaption class="card-image-caption">{title}</figcaption>' +
    "</figure>" +
    '<div class="card-content">' +
      "<ul>" +
        "<li>Published Date:</li>" + "{created}" +
        "<li>Owner:</li>" + "{owner}" +
      "</ul>" +
    "</div>" +
  "</div>";

2. 加载门户项目

在此应用程序中创建使用的所有门户项的数组。在创建门户项目时我们希望加载它们,因为希望使用 idowner等信息在应用程序中显示。

     
1
2
3
4
5
var portalItems = layerItems.map(function(itemid) {
  return new PortalItem({
    id: itemid
  }).load();
});

3. 创建 DOM 元素在页面展示项目细节

使用  geoscene / core / promiseUtils 的 eachAlways 方法等待门户项目完成加载。然后,您可以使用 geoscene/intl.substitute() 方法创建 DOM 元素,并且在页面上显示使用每个门户项目的详细信息。此外,您还需要监听 DOM 元素的dragStart 事件, 并将一些数据分配到该元素被删除的位置。

                  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
promiseUtils.eachAlways(portalItems).then(function(items) {
  var docFrag = document.createDocumentFragment();
  items.map(function(result) {
    var item = result.value;
    var card = intl.substitute(template, item);
    var elem = document.createElement("div");
    elem.innerHTML = card;
    // This is a technique to turn a DOM string to a DOM element.
    var target = elem.firstChild;
    docFrag.appendChild(target);
    target.addEventListener("dragstart", function(event) {
      var id = event.currentTarget.getAttribute("data-itemid");
      event.dataTransfer.setData("text", id);
    });
  });
  document.querySelector(".cards-list").appendChild(docFrag);
  ...
});

4. 管理拖动事件

在 MapView 上用正确的方式拖动门户项目进行监听 drop 和dragover 事件。接下来,您可以获取 PortalItem 的 id ,并使用 Layer.fromPortalItem 添加到 WebMap 中。

                     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
promiseUtils.eachAlways(portalItems).then(function(items) {
  ...
  view.container.addEventListener("dragover", function(event) {
    event.preventDefault();
    event.dataTransfer.dropEffect = "copy";
  })
  view.container.addEventListener("drop", function(event) {
    var id = event.dataTransfer.getData("text");
    // Get the first item that matches
    var resultItem = items.find(function(x) { return x.id === id; });
    var item = result.value;
    if (item && item.isLayer) {
      Layer.fromPortalItem({
        portalItem: item
      }).then(function(layer) {
        webmap.add(layer);
        view.extent = item.extent;
      });
    }
  })
});

关于JavaScript 的 GeoScene API 如何使用门户项目的信息,请参考 GeoScene 官方网站

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.