保存网络场景

这个示例演示了如何保存一个网络场景到 ArcGIS for Portal item (要么创建一个新的 item,要么覆盖一个已经存在的 item)。

保存网络场景很容易。只需要一个有效的 Portal 即可。

保存到一个新的 item

新建一个空的 WebScene 实例和 用来保存场景的 Portal 。加载 Portal 将会触发用户认证,如果成功则 item 会被保存到 Portal 中。

/************************************************************
* 新建一个空的 WebScene 实例 
* 一个空的 WebScene 实例至少必须定义 basemap 属性
************************************************************/
var scene = new WebScene({
  basemap: "topo"
});

/************************************************************
* 新建一个 Potal 实例并立刻请求用户认证
************************************************************/
var portal = new Portal({
  authMode: "immediate"
});

/************************************************************
* 加载 Portal 将会触发用户认证,如果成功则 item 会被保存到 Portal 中
************************************************************/
portal.load().then(function(){
  scene.saveAs({
    title: "Empty WebScene",
    portal: portal
  });
});

覆盖一个已经存在的 item

新建一个 WebScene 实例并设置 Portal item ID 。加载 Portal 将会触发用户认证,如果成功则 item 会被保存到 Portal 中。

/************************************************************
* 新建一个 WebScene 实例. WebScene 应该引用 PortalItem ID
* 这个 ID 代表保存在 argcis.com 或者内置门户网中的 网络场景
************************************************************/
var scene = new WebScene({
  portalItem: {
    id: "3a9976baef9240ab8645ee25c7e9c096"
  }
});

/************************************************************
* 新建一个 Portal 实例并立刻请求用户认证
************************************************************/
var portal = new Portal({
  authMode: "immediate"
});

/************************************************************
* 加载 Portal 将会触发用户认证,如果成功则 item 会被保存到 Portal 中
************************************************************/
scene.load().then(function(){
  portal.load().then(function(){
    scene.portalItem.title = "Modified WebScene";
    scene.portalItem.portal = portal;
    scene.save();
  });
})

程序完整源代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
  <title>Save a web scene - 4.5</title>

  <link rel="stylesheet" href="https://raw.githubusercontent.com/Esri/calcite-bootstrap/gh-pages/styles/calcite-bootstrap.css">

  <!-- 用于授权弹窗的主题-->
  <link rel="stylesheet" href="https://js.arcgis.com/4.5/dijit/themes/claro/claro.css">

  <link rel="stylesheet" href="https://js.arcgis.com/4.5/esri/css/main.css">
  <script src="https://js.arcgis.com/4.5/"></script>

  <script>
    require([
      "esri/identity/OAuthInfo",
      "esri/identity/IdentityManager",
      "esri/views/SceneView",
      "esri/WebScene",
      "dojo/dom",
      "dojo/on",
      "dojo/domReady!"
    ], function(
      OAuthInfo, esriId, SceneView, WebScene, dom, on
    ) {

      // 注册认证信息
      var info = new OAuthInfo({
        // Swap this ID out with a registered application ID
        appId: "q244Lb8gDRgWQ8hM",
        // 如果要使用自己的 Portal,你可以取消注释下一行代码 
        // portalUrl: "https://<host>:<port>/arcgis"
        // 取消注释下一行,可以防止用户的登录状态与具有相同authNamespace值的同一域中的其他应用程序共享。
        // authNamespace: "portal_oauth_inline",
        popup: true
      });
      esriId.registerOAuthInfos([info]);

      /************************************************************
       * 创建 WebScene 实例
       ************************************************************/
      var scene = new WebScene({
        portalItem: { 
          id: "90e3c30bdbbe4886a94f75c2cdd7edce"
        }
      });

      /************************************************************
       * 新建 SceneView 实例
       ************************************************************/
      var view = new SceneView({
        map: scene,
        container: "viewDiv",
        padding: {
          top: 40
        }
      });

      view.then(function() {
        // 场景加载完成时,显示标题
        var sidebar = dom.byId("sidebarDiv");
        var title = sidebar.getElementsByTagName("input")[0];
        var save = sidebar.getElementsByTagName("input")[1];

        title.value = "WebScene Saving Sample";
        save.disabled = false;

        var overlay = dom.byId("overlayDiv");
        var ok = overlay.getElementsByTagName("input")[0];

        function statusMessage(head, info) {
          (overlay.getElementsByClassName("head")[0]).innerHTML = head;
          (overlay.getElementsByClassName("info")[0]).innerHTML = info;
          overlay.style.visibility = "visible";
        }

        on(ok, "click", function() {
          overlay.style.visibility = "hidden";
        });

        on(save, "click", function() {
          var item = {
            title: title.value,
          };

          // 更新场景属性,这一句应该在保存场景之前调用
          scene.updateFrom(view);

          scene.saveAs(item)
            // 保存成功
            .then(function(item) {

              // 链接到新建的 item
              var itemPageUrl = item.portal.url +
                "/home/item.html?id=" + item.id;
              var link = "<a target=\"_blank\" href=\"" +
                itemPageUrl + "\">" +
                title.value + "</a>";

              statusMessage("Save Webscene",
                "Successfully saved as <i>" + link +
                "</i>");
            })
            // 保存出错
            .otherwise(function(err) {
              statusMessage("Save Webscene", "Error " + err);
            });
        });
      });
    });
  </script>

  <style>
    html,
    body {
      padding: 0;
      margin: 0 !important;
      height: 100%;
      width: 100%;
    }

    #sidebarDiv {
      position: absolute;
      left: 0;
      top: 0;
      bottom: 0;
      width: 300px;
    }

    #overlayDiv {
      z-index: 1;
      position: absolute;
      margin: auto auto;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      width: 400px;
      height: 230px;
      padding: 10px;
      background-color: white;
      border: 1px solid grey;
      visibility: hidden;
    }

    #viewDiv {
      position: absolute;
      right: 0;
      left: 300px;
      top: 0;
      bottom: 0;
    }

    .head,
    .info {
      margin: 0 auto;
      width: 100%;
      padding: 20px;
    }

    .info {
      font-size: 75%;
      font-weight: 200;
    }

    input[type="button"] {
      margin: 20px;
    }

    input[type="text"] {
      width: 100%;
    }

    h6 {
      margin: 0 !important;
    }
  </style>
</head>

<body class="claro">
  <div id="sidebarDiv">
    <label class="head">Save Webscene</label>
    <label class="info">Title:
      <input type="text">
    </label>
    <input type="button" value="Save" disabled>
  </div>
  <div id="overlayDiv">
    <label class="head"></label>
    <label class="info"></label>
    <input type="button" value="Ok">
  </div>
  <div id="viewDiv"></div>
</body>

</html>

程序执行效果:

沙箱地址:https://developers.arcgis.com/javascript/latest/sample-code/sandbox/index.html?sample=webscene-save

(完)

results matching ""

    No results matching ""