创建局部场景

这个示例显示了怎样创建一个局部场景并添加到 SceneView 。这个示例加载了两个图层,一个图层描绘了堪萨斯州的石油和天然气井,另一个图层显示了附近的发生过地震的位置。这些图层渲染在地面以及地面以下。

你可以导航到底图以下,观察石油和天然气井的位置和深度以及附近的地震点的确切的位置。为了看到地面以下的要素,你必须翻转场景。翻转场景的操作方式是按住鼠标右键前后拖动。

SceneView 的 viewingMode 属性决定了场景显示为局部还是地球。clipingArea 属性决定了局部场景的范围。

constranints 属性决定了用户是否能看到地面以下。

程序完整源代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
  <title>Create a local scene - 4.5</title>
  <style>
    html,
    body,
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }

    #homeDiv {
      left: 15px;
      top: 130px;
      z-index: 35;
      position: absolute;
    }
  </style>

  <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/Map",
      "esri/views/SceneView",
      "esri/layers/FeatureLayer",
      "esri/widgets/Home",
      "dojo/domReady!"
    ], function(Map, SceneView, FeatureLayer, Home) {

      var wellsUrl =
        "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/HarperSumnerOGWells/FeatureServer/0";
      var quakesUrl =
        "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/ks_earthquakes_since_2000/FeatureServer/0";

      // 场景的范围
      var kansasExtent = {
        xmax: -10834217,
        xmin: -10932882,
        ymax: 4493918,
        ymin: 4432667,
        spatialReference: {
          wkid: 3857
        }
      };

      /********************************************************
       * 用于显示石油和天然气信息的弹窗模板
       *******************************************************/

      var wellsTemplate = { 
        title: "WELL",
        content: "<b>API No.:</b> {API_NUMBER}<br>" +
          "<b>Lease: </b> {LEASE}<br>" +
          "<b>Operator: </b> {CURR_OPERATOR} km<br>" +
          "<b>Drilled: </b> {SPUD}<br>" +
          "<b>Completed: </b> {COMPLETION}<br>" +
          "<b>Status: </b> {STATUS2}<br>" +
          "<b>Depth: </b> {DEPTH} meters<br>",
        fieldInfos: [{
          fieldName: "SPUD",
          format: {
            dateFormat: "short-date"
          }
        }, {
          fieldName: "COMPLETION",
          format: {
            dateFormat: "short-date"
          }
        }, {
          fieldName: "DEPTH",
          format: {
            places: 0,
            digitSeparator: true
          }
        }]
      };

      /*********************************************************
       * 渲染器 用于对地面上的石油和天然气井进行符号化
       *********************************************************/

      var wellsSurfaceRenderer = {
        type: "simple", 
        symbol: {
          type: "point-3d",
          symbolLayers: [{
            type: "icon", 
            material: {
              color: "#785226"
            },
            resource: {
              primitive: "x"
            },
            size: 4
          }]
        }
      };

      /**************************************************
       * 渲染器 用于对地下的石油和天然气井进行符号化
       **************************************************/

      var startDate = new Date("Thu Jul 25 2013 00:00:00 GMT-0700 (PDT)");
      var endDate = new Date("Mon Nov 09 2015 00:01:40 GMT-0800 (PST)");

      var wellsDepthRenderer = {
        type: "simple", 
        symbol: {
          type: "point-3d", 
          symbolLayers: [{
            type: "object", 
            resource: {
              primitive: "cylinder" //图元:圆筒
            },
            anchor: "top",
            width: 50
          }]
        },
        visualVariables: [{
          type: "size",
          field: "DEPTH",
          axis: "height",
          valueUnit: "feet"
        }, {
          type: "size",
          axis: "width",
          useSymbolValue: true // sets the width to 50m
        }, {
          type: "color",
          field: "SPUD",
          stops: [{
            value: startDate.valueOf(),
            color: "white"
          }, {
            value: endDate.valueOf(),
            color: "red"
          }]
        }]
      };

      /**************************************************
       * 描绘油气井的图层
       **************************************************/

      // 描绘地面以下的油气井的图层
      var wellsLyr = new FeatureLayer({
        url: wellsUrl,
        definitionExpression: "Status = 'CBM' OR Status = 'EOR' OR Status = 'GAS' OR Status = 'INJ' OR Status = 'O&G' OR Status = 'OIL' OR Status = 'SWD'",
        outFields: ["*"],
        popupTemplate: wellsTemplate,
        renderer: wellsDepthRenderer,
        // 防止圆筒冲出地面
        elevationInfo: {
          mode: "relative-to-ground",
          offset: -100
        }
      });

      // 描绘地面上的油气井的图层
      var wellsSurfaceLyr = new FeatureLayer({
        url: wellsUrl,
        definitionExpression: "Status = 'CBM' OR Status = 'EDR' OR Status = 'GAS' OR Status = 'INJ' OR Status = 'O&G' OR Status = 'OIL' OR Status = 'SWD'",
        outFields: ["*"],
        popupTemplate: wellsTemplate,
        renderer: wellsSurfaceRenderer,
        elevationInfo: {
          mode: "on-the-ground"
        }
      });

      /********************************************************
       * 渲染器 :用于对地面以下的地震点进行符号化
       *
       * 地震点被符号化为球 
       * 
       * 球的大小表示地震级数
       * 颜色表示地震发生的日期. T
       * 
       * 颜色越白,地震发生时间越远;颜色越红,地震发生时间越近
       *******************************************************/

      var quakesRenderer = {
        type: "simple", 
        symbol: {
          type: "point-3d", 
          symbolLayers: [{
            type: "object", 
            resource: {
              primitive: "sphere" //图元:球
            }
          }]
        },
        visualVariables: [{
          type: "color",
          field: "date_evt",
          stops: [{ 
            value: startDate.valueOf(),
            color: "white"
          }, {
            value: endDate.valueOf(),
            color: "red"
          }] 
        }, {
          type: "size",
          field: "mag",
          axis: "all",
          stops: [
          {
            value: 2,
            size: 100
          },
          {
            value: 5,
            size: 2000
          }]
        }]
      };

      /********************************************************
       * 渲染器 : 用于对地面以上的地震点进行符号化
       *******************************************************/

      // 地震点将符号化为圆形
      var surfaceSym = {
        type: "point-3d", 
        symbolLayers: [{
          type: "icon", 
          material: {
            color: [179, 75, 75]
          },
          resource: {
            primitive: "circle"
          }
        }]
      };

      // 符号大小取决于地震级数
      var quakesSurfaceRenderer = {
        type: "simple", 
        symbol: surfaceSym,
        visualVariables: [{
          type: "size",
          field: "mag",
          axis: "all",
          stops: [
          {
            value: 2,
            size: 3
          },
          {
            value: 5,
            size: 50
          }]
        }]
      };

      /********************************************************
       * 弹窗模板,用于显示地震要素
       *******************************************************/

      var quakeTemplate = { 
        title: "{place}",
        content: "<b>Date and time:</b> {date_evt}<br>" +
          "<b>Magnitude (0-10): </b> {mag}<br>" +
          "<b>Depth: </b> {depth} km<br>",
        fieldInfos: [{
          fieldName: "date_evt",
          format: {
            dateFormat: "short-date-short-time"
          }
        }],
        actions: [{
          id: "find-wells",
          title: "Nearby wells",
          className: "esri-icon-notice-round"
        }]
      };

      /********************************************************
       * 创建描绘地震的图层 (一个地上的,一个地下的). 
       *******************************************************/

      // 定义一个图层来绘制地震在地面以下的确切位置。
      var quakesDepthLyr = new FeatureLayer({
        url: quakesUrl,
        // 只显示 2 级及以上地震
        definitionExpression: "mag >= 2",
        outFields: ["*"],
        renderer: quakesRenderer,
        popupTemplate: quakeTemplate,
        returnZ: true,
        elevationInfo: {
          mode: "relative-to-ground"
        }
      });

      // 定义一个描绘地震地表位置的图层
      var quakesSurfaceLyr = new FeatureLayer({
        url: quakesUrl,
        definitionExpression: "mag >= 2",
        outFields: ["*"],
        renderer: quakesSurfaceRenderer,
        popupTemplate: quakeTemplate,
        opacity: 0.6,
        elevationInfo: {
          mode: "on-the-ground"
        }
      });

      var map = new Map({
        basemap: "topo",
        layers: [quakesDepthLyr, quakesSurfaceLyr, wellsLyr,
          wellsSurfaceLyr
        ]
      });

      /********************************************************************
       * 创建一个局部场景
       *
       * 创建局部场景必须设置 viewingMode 为 "local"
       * 为了定义一个小的局部区域,需要设置 clippingArea 属性
       *
       * 禁用 constraints 的 collision 属性将允许用户查看地面以下
       ********************************************************************/
      var view = new SceneView({
        container: "viewDiv",
        map: map,
        viewingMode: "local",
        clippingArea: kansasExtent,
        extent: kansasExtent,
        constraints: {
          collision: {
            enabled: false
          },
          tilt: {
            max: 179.99
          }
        },
        // 关闭大气和星星设置
        environment: {
          atmosphere: null,
          starsEnabled: false
        }
      });

      /********************************************************
       * 设置行为:返回地震点 10 km 范围内的油气井数量
       *******************************************************/

      // 默认参数 :用于选择单击位置 10 km 范围内的油气井
      var wellsBufferParams = {
        spatialRelationship: "esriSpatialRelIntersects",
        distance: 10,
        units: "kilometers",
        where: "Status = 'CBM' OR Status = 'EDR' OR Status = 'GAS' OR Status = 'INJ' OR Status = 'O&G' OR Status = 'OIL' OR Status = 'SWD'"
      };

      view.popup.on("trigger-action", function(event) {
        if (event.action.id === "find-wells") {
          wellsBufferParams.geometry = view.popup.selectedFeature.geometry;
          wellsLyr.queryFeatureCount(wellsBufferParams).then(function(
            response) {
            var results = "<b>" + response +
              "</b> active wells are within 10 km of this earthquake.";
            view.popup.content = results;
          }).otherwise(
            function(err) {
              console.log("action failed: ", err);
            });
        } else {
          return;
        }
      });

      // 设置 Home 按钮,用于使场景恢复到初始视图
      var homeBtn = new Home({
        view: view
      }, "homeDiv");
    });
  </script>
</head>

<body>
  <div id="viewDiv"></div>
  <div id="homeDiv"></div>
</body>
</html>

程序运行效果:

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

(完)

results matching ""

    No results matching ""