查询 FeatureLayerView 的要素

FeatureLayerView 允许访问显示在视图中的图层中的要素。

当视图加载完成时,需要设置 updating 监听。在执行查询之前,不许等待视图中的所有要素更新完成。

lyrView.watch("updating", function (val) {
//...
}

获取到视图中的图形之后,有很多种用途。在本示例中使用获取到的图形创建了列表,当单击列表节点的时候,将在和节点相关的图形的位置处弹窗。

程序完整源代码:

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

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

        var map = new Map({
          basemap: "dark-gray"
        });

        var view = new MapView({
          container: "sceneDiv",
          map: map,
          center: [-73.950, 40.702],
          zoom: 11,
          padding: {
            right: 300
          }
        });

        // 列表元素
        var listNode = document.getElementById("nyc_graphics");

        // 创建弹窗模板
        var popupTemplate = { 
          title: "Marriage in NY, Zip Code: {ZIP}",
          content: "<p><b> Marriage Rate: {MARRIEDRATE}% </b></p>" +
            "<p> Married: {MARRIED_CY}</p>" +
            "<p> Never Married: {NEVMARR_CY}</p>" +
            "<p> Divorced: {DIVORCD_CY}</p>"
        };

        // 创建图层并引用弹窗模板
        var featureLayer = new FeatureLayer({
          url: "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/ArcGIS/rest/services/NYCDemographics1/FeatureServer/0",
          outFields: ["*"],
          popupTemplate: popupTemplate
        });
        map.add(featureLayer);

        var graphics;

        view.whenLayerView(featureLayer).then(function(lyrView) {
          lyrView.watch("updating", function(val) {
            if (!val) { // 等待视图更新完成

              // 查询可用的要素
              lyrView.queryFeatures().then(function(results) {

                graphics = results;

                var fragment = document.createDocumentFragment();

                results.forEach(function(result, index) {
                  var attributes = result.attributes;
                  var name = attributes.ZIP + " (" +
                    attributes.PO_NAME + ")"

                  // 创建列表
                  var li = document.createElement("li");
                  li.classList.add("panel-result");
                  li.tabIndex = 0;
                  li.setAttribute("data-result-id", index);
                  li.textContent = name;

                  fragment.appendChild(li);
                });
                // 更新列表节点内容
                listNode.innerHTML = "";
                listNode.appendChild(fragment);
              });
            }
          });
        });

        // 监听列表单击事件
        listNode.addEventListener("click", onListClickHandler);

        function onListClickHandler(event) {
          var target = event.target;
          var resultId = target.getAttribute("data-result-id");

          // 获取相关图形
          var result = resultId && graphics && graphics[parseInt(resultId, 10)];

          if (result) {
            // 弹窗
            view.popup.open({
              features: [result],
              location: result.geometry.centroid
            });
          }
        }

      });
  </script>

  <style>
    html,
    body,
    #sceneDiv {
      height: 100%;
      width: 100%;
      margin: 0;
      padding: 0;
      font-family: sans-serif;
    }

    .panel-container {
      position: relative;
      width: 100%;
      height: 100%;
    }

    .panel-side {
      padding: 2px;
      box-sizing: border-box;
      width: 300px;
      height: 100%;
      position: absolute;
      top: 0;
      right: 0;
      color: #fff;
      background-color: rgba(0, 0, 0, 0.6);
      overflow: auto;
      z-index: 60;
    }

    .panel-side h2 {
      padding: 0 20px;
      margin: 20px 0;
    }

    .panel-side ul {
      list-style: none;
      margin: 0;
      padding: 0;
    }

    .panel-side li {
      list-style: none;
      padding: 10px 20px;
    }

    .panel-result {
      cursor: pointer;
      margin: 2px 0;
      background-color: rgba(0, 0, 0, 0.3);
    }

    .panel-result:hover,
    .panel-result:focus {
      color: orange;
      background-color: rgba(0, 0, 0, 0.75);
    }
  </style>

</head>

<body>
  <div class="panel-container">
    <div class="panel-side">
      <h2>Marriage in NY by Zip</h2>
      <ul id="nyc_graphics">
        <li>Loading&hellip;</li>
      </ul>
    </div>
    <div id="sceneDiv"></div>
  </div>
</body>

</html>

程序运行效果:

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

(完)

results matching ""

    No results matching ""