ARCGIS: скрытие полигонов, полученных в результате пространственного запроса

У меня есть куча веб-слоев, и я хочу скрыть все многоугольники, которые пересекаются с заданной геометрией/другим слоем.

Я фильтрую эти пересекающиеся полигоны с помощью пространственного запроса, но потом не знаю, как их скрыть. Я думал, что можно манипулировать визуализатором полученных полигонов, что-то вроде: hide(), opacity = 0, visible=false... Это правильный подход, или мне нужно сначала запросить полигоны, которые не пересекаются, а затем добавить результаты в новый слой и визуализировать только их? Что в таком случае должно быть query.spatialRelationship?

Вот мой запрос:

    view.whenLayerView(layer).then(function(layerView){
       var query = layer.createQuery();
       query.geometry = new Extent({ 
         xmin: 6902682.7633,
         ymin: -3519872.5095,
         xmax: 11221869.7958,
         ymax: -2276864.0272,
         spatialReference: 102100
       });
       query.spatialRelationship = "intersects";    

       layer.queryFeatures(query).then(function(results){
         for (var index in results.features) { 
           //hide as manipulate its rendering    
         }    
        // or something like layerView.highlight(results.features)    
       })
    });

person urukhai    schedule 30.01.2019    source источник
comment
не уверен, сколько функций мы говорим в этой области, но после того, как у вас есть пересекающиеся функции, которые вы хотите скрыть; вы можете обновить выражение определения функционального слоя на что-то вроде objectid NOT IN (1, 2, 3, 4...)   -  person BigGerman    schedule 30.01.2019
comment
Именно то, что я сделал: я запрашиваю ObjectIds, а затем устанавливаю определение слояExpression = NOT OBJECTID IN ( + queryResults.join() + ), но разве это не медленная операция, если имеется большое количество полигональных функций?   -  person urukhai    schedule 31.01.2019
comment
Просто к сведению: ваше значение для query.spatialRelationship неверно. В документах по API говорится, что это должно быть взято из констант список для класса Query.   -  person Juffy    schedule 12.02.2019
comment
@Juffy Я думаю, что он использует v4.x API. См.: developers.arcgis.com/ javascript/последняя/ссылка на API/   -  person Below the Radar    schedule 12.02.2019
comment
Да, я использую JS API версии 4.10.   -  person urukhai    schedule 13.02.2019


Ответы (2)


Если вы вообще не хотите отображать функции, вы можете использовать QueryTask для извлечения только тех объектов, которые пересекают экстент из MapService. Затем вы можете создать FeatureLayer с результатами.

require(["esri/tasks/QueryTask", "esri/tasks/support/Query", "esri/geometry/Extent", "esri/layers/FeatureLayer"], function(QueryTask, Query, Extent, FeatureLayer){
  var layerUrl = " ... "; // Represents the REST endpoint for your layer
  var queryTask = new QueryTask({
    url: layerUrl 
  });
  var query = new Query();
  query.returnGeometry = true;
  query.outFields = ["*"];
  query.geometry = new Extent({ 
     xmin: 6902682.7633,
     ymin: -3519872.5095,
     xmax: 11221869.7958,
     ymax: -2276864.0272,
     spatialReference: 102100
  });
  query.spatialRelationship = "intersects";

  // When resolved, create the featureLayer with the results
  queryTask.execute(query).then(function(results){
    var layer = new FeatureLayer({
      source: results.features
    });
  });
});

Этот ответ может быть лучшим с точки зрения производительности, потому что пересечение выполняется на стороне сервера, и клиенту не придется загружать ненужные функции.

person Below the Radar    schedule 01.02.2019

Вы можете изменить свойство visible графики на false

view.whenLayerView(layer).then(function(layerView){
   var query = layer.createQuery();
   query.geometry = new Extent({ 
     xmin: 6902682.7633,
     ymin: -3519872.5095,
     xmax: 11221869.7958,
     ymax: -2276864.0272,
     spatialReference: 102100
   });
   query.spatialRelationship = "intersects";    

   layer.queryFeatures(query).then(function(results){
     for (var index in results.features) { 
       results.features[index].visible = false;  
     }    
    // or something like layerView.highlight(results.features)    
   })
});
person Below the Radar    schedule 01.02.2019