创建要素后,当有新数据出现时,我将替换图层源,但在地图上仍可删除要素ArcGIS-js-api 4

问题描述

我创建了一个要素图层,每隔5秒,外部服务将以JSON格式获取新数据。当新数据到来时,我用新数据覆盖要素图层源并调用layer.refresh方法。我观察到的仍然没有从地图中删除的旧数据,如果打开了弹出窗口,则内容不会更新。 我不想使用creati的apply edits。

问题: 当我替换/覆盖图层源时,在地图上仍然有一些旧的已删除功能,并且在弹出窗口中未反映更新的数据

问题: 覆盖要素图层源后,如何更新地图和弹出内容

解决方法

下面的代码显示source属性是初始化本地FeatureLayer的选项。为了操作这些功能,您需要使用applyEdits

在添加和删除功能时,请看source的长度。 [剧透,永远不变]

我认为您正在尝试的问题与我提到的问题有关。

<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
  <title>ArcGIS API for JavaScript Hello World App</title>
  <style>
    html,body,#viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }
  </style>

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

  <script>
    require([
      'esri/Map','esri/views/MapView','esri/layers/FeatureLayer','esri/Graphic'
    ],function (Map,MapView,FeatureLayer,Graphic) {

      const quakesUrl =
        'https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/ks_earthquakes_since_2000/FeatureServer/0';
      
      const quakesLayer = new FeatureLayer({
        url: quakesUrl,visible: false
      });

      let lastAddFeatureResults = [];

      const resultsLayer = new FeatureLayer({
        source: [],geometryType: 'point',renderer: {
          type: 'simple',symbol: {
            type: 'simple-marker',style: 'circle',size: `8px`,color: [255,.6],outline: {
              color: 'black',width: '0.5px'
            }
          }
        },fields: [
          {
            name: 'OBJECTID',alias: 'ObjectID',type: 'oid'
          },{
            name: 'time',alias: 'Time',type: 'string'
          },{
            name: 'mag',alias: 'Magnitude',type: 'double'
          },{
            name: 'magType',alias: 'Magnitude Type',{
            name: 'place',alias: 'Place',{
            name: 'type',alias: 'Type',type: 'string'
          }
        ],popupEnable: true,popupTemplate: {
          title: '{place}'
        }
      });

      const map = new Map({
        basemap: "gray",layers: [quakesLayer,resultsLayer]
      });

      const view = new MapView({
        container: "viewDiv",map: map,center: [-97.75188,37.23308],zoom: 9
      });

      function queryEarthquakes(mag) {
        const query = quakesLayer.createQuery();
        query.where = `mag = ${mag}`;
        
        return quakesLayer.queryFeatures(query);
      }

      function displayResults(results) {
        const addFeatures = results.features;
        resultsLayer.applyEdits({
          addFeatures,deleteFeatures: updates % 2 === 0 ? lastAddFeatureResults : []
        }).then(results => {
          // console.log(results.addFeatureResults);
          // console.log(results.deleteFeatureResults);
          lastAddFeatureResults = updates % 2 === 0 ?
            results.addFeatureResults :
            lastAddFeatureResults.concat(results.addFeatureResults);
          console.log(`[after update ${updates}] features:${lastAddFeatureResults.length}  source.length:${resultsLayer.source.length} added:${results.addFeatureResults.length} deleted:${results.deleteFeatureResults.length}`)
        });
      }

      function updateLayer() {
        updates++;
        console.log(`[before update ${updates}] features:${lastAddFeatureResults.length} source.length:${resultsLayer.source.length}`)
        console.timeLog('update layer');
        queryEarthquakes(updates % 2 ? 3 : 4).then(displayResults);
      }
      
      console.time('update layer');

      let updates = 0;
      updateLayer();

      setInterval(updateLayer,5000);

    });
  </script>
</head>

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

</html>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...