Select to view content in your preferred language

Change layer definitions properly repeatedly

1021
5
11-21-2016 10:13 PM
PitersonPaulgek
Deactivated User

Hi,

We do time series "manually" for some reasons.

We created recursive function.

The issue is with changing of layer definitions repeatedly. The layer disappears between first and second (recursive) call to the function.

var isPlay = true;
var layerDefinitionsTS = [];

var currentTimeSeriesLayer = (initialized outside);
function PlayTimeSeries(startYear, endYear, timeIntervalMilliSeconds) {
   if (startYear == endYear)
      return;
   if (isPlay == false)
      return;
//layerDefinitionsTS = [];
      currentTimeSeriesLayer.setLayerDefinitions(null, true);

      layerDefinitionsTS[currentTimeSeriesLayer.visibleLayers[0]] = "Year = " + startYear;
      currentTimeSeriesLayer.setLayerDefinitions(layerDefinitionsTS, false);

      setTimeout(function (startYear, endYear, timeIntervalMilliSeconds) {
      startYear = startYear;
      console.log("Year: " + startYear);

      startYear = startYear + 1;

      PlayTimeSeries(startYear, endYear, timeIntervalMilliSeconds);
   }, timeIntervalMilliSeconds, startYear, endYear, timeIntervalMilliSeconds);
};

Any help will be appreciated.

0 Kudos
5 Replies
FC_Basson
MVP Regular Contributor

Setting timeouts within the function scope might not be the best option.  You should also create handlers for each timeout  which you can clear before updating the layer definitions e.g. 

...

var toHandler = setTimeout( function(...){
   ...
   clearTimeout(toHandler);
})‍‍‍‍

Why not consider time-enabling your layer and displaying it with a Time Slider (TimeSlider | API Reference | ArcGIS API for JavaScript 3.18)?

0 Kudos
PitersonPaulgek
Deactivated User

Thank you for response FC Basson,

In your code, where is setLayerDefinition()?

We cannot use ESRI widget because the custom requirements for time slider UI.

0 Kudos
FC_Basson
MVP Regular Contributor

Same line as yours. Seeing that you are calling the PlayTimeSeries function recursively, you can call the clearTimeout method just before the setTimeout method.

0 Kudos
PitersonPaulgek
Deactivated User

FCBasson,
Should we use a global variable "toHandler" to clearTimeout(toHandler)?

Like this? -

var isPlay = true;
var layerDefinitionsTS = [];
var currentTimeSeriesLayer = (initialized outside);
var toHandler;

function PlayTimeSeries(startYear, endYear, timeIntervalMilliSeconds) {
   if (startYear == endYear)
      return;
   if (isPlay == false)
      return;
//layerDefinitionsTS = [];
      currentTimeSeriesLayer.setLayerDefinitions(null, true);
      layerDefinitionsTS[currentTimeSeriesLayer.visibleLayers[0]] = "Year = " + startYear;
      currentTimeSeriesLayer.setLayerDefinitions(layerDefinitionsTS, false);
      clearTimeout(toHandler);
      toHandler = setTimeout(function (startYear, endYear, timeIntervalMilliSeconds) {
      startYear = startYear;
      console.log("Year: " + startYear);
      startYear = startYear + 1;
      PlayTimeSeries(startYear, endYear, timeIntervalMilliSeconds);
   }, timeIntervalMilliSeconds, startYear, endYear, timeIntervalMilliSeconds);
};

0 Kudos
PitersonPaulgek
Deactivated User

I tried - the layer is not visible.

I can see the layer in the map.layerIDs.

I can get the count by queryTask.executeForCount() after applying layer definitions - each time different.

What is the reason the layer is not visible? How to check it?

0 Kudos