OpenLayers 函数通过循环打开多个图层
OpenLayers function to switch many layers on by a loop
我有一个图层切换控件包含名为 (yyyy-mm-dd_hhmmss
) 的(日期),当我点击它们时它们工作正常。
另外,我有用于输入(开始)和(结束)的标签以及用于在这两个值之间循环图层的按钮。
我需要的是 function
来让这个按钮激活图层(日期)或让它们以间隔
循环打开
PS:这里我们可以使用title
作为参考,displayInLayerSwitcher,true
和setVisible(true)
我的代码如下
singleLayer = {}
singleLayer['1'] = new ol.layer.Tile({
title: "1",
baseLayer: false,
visible: false,
source: new ol.source.XYZ({
projection: 'EPSG:4326',
wrapX: false,
url: 'folder/yyyy-mm-dd_hhmmss/{z}/{x}/{-y}.png'
})
})
singleLayer['2'] = new ol.layer.Tile({
title: "2",
baseLayer: false,
visible: false,
source: new ol.source.XYZ({
projection: 'EPSG:4326',
wrapX: false,
url: 'folder/yyyy-mm-dd_hhmmss/{z}/{x}/{-y}.png'
})
})
singleLayer['3'] = new ol.layer.Tile({
title: "3",
baseLayer: false,
visible: false,
source: new ol.source.XYZ({
projection: 'EPSG:4326',
wrapX: false,
url: 'folder/yyyy-mm-dd_hhmmss/{z}/{x}/{-y}.png'
})
})
})
var dates = new ol.layer.Group({
openInLayerSwitcher: false,
visible: false,
layers:[
singleLayer['1'],
singleLayer['2'],
singleLayer['3'],
]
});
<p>Loop Layers<p>
<p>From date: <input type="text" name="fromdate" id="fromdate" value="yyyy-mm-dd_hhmmss"></p>
<p>To date: <input type="text" name="todate" id="todate" value="yyyy-mm-dd_hhmmss"></p>
<button onclick="loopLayer()">Loop layer by time interval</button>
function loopLayer() {
.........
}
var time = new ol.layer.Group({ ....... });
let intervalHandle = null;
let activeLayerIndex = -1;
function startAnimation() {
// check if interval is already running
if (!intervalHandle) {
activeLayerIndex = 0;
// make sure all layers of the group are hidden
time.getLayers().forEach(layer => layer.setVisible(false));
intervalHandle = setInterval(function() {
const allLayers = time.getLayers();
if (activeLayerIndex >= allLayers.getLength()) {
// we reached the end, stop animating
stopAnimation();
}
allLayers.item(activeLayerIndex).setVisible(true);
if (activeLayerIndex > 0) {
// hide the previous layer
allLayers.item(activeLayerIndex -1).setVisible(false);
}
activeLayerIndex += 1;
}, 500 /* milliseconds */);
}
}
function stopAnimation() {
if(intervalHandle) {
clearInterval(intervalHandle);
intervalHandle = null;
}
}
我有一个图层切换控件包含名为 (yyyy-mm-dd_hhmmss
) 的(日期),当我点击它们时它们工作正常。
另外,我有用于输入(开始)和(结束)的标签以及用于在这两个值之间循环图层的按钮。
我需要的是 function
来让这个按钮激活图层(日期)或让它们以间隔
PS:这里我们可以使用title
作为参考,displayInLayerSwitcher,true
和setVisible(true)
我的代码如下
singleLayer = {}
singleLayer['1'] = new ol.layer.Tile({
title: "1",
baseLayer: false,
visible: false,
source: new ol.source.XYZ({
projection: 'EPSG:4326',
wrapX: false,
url: 'folder/yyyy-mm-dd_hhmmss/{z}/{x}/{-y}.png'
})
})
singleLayer['2'] = new ol.layer.Tile({
title: "2",
baseLayer: false,
visible: false,
source: new ol.source.XYZ({
projection: 'EPSG:4326',
wrapX: false,
url: 'folder/yyyy-mm-dd_hhmmss/{z}/{x}/{-y}.png'
})
})
singleLayer['3'] = new ol.layer.Tile({
title: "3",
baseLayer: false,
visible: false,
source: new ol.source.XYZ({
projection: 'EPSG:4326',
wrapX: false,
url: 'folder/yyyy-mm-dd_hhmmss/{z}/{x}/{-y}.png'
})
})
})
var dates = new ol.layer.Group({
openInLayerSwitcher: false,
visible: false,
layers:[
singleLayer['1'],
singleLayer['2'],
singleLayer['3'],
]
});
<p>Loop Layers<p>
<p>From date: <input type="text" name="fromdate" id="fromdate" value="yyyy-mm-dd_hhmmss"></p>
<p>To date: <input type="text" name="todate" id="todate" value="yyyy-mm-dd_hhmmss"></p>
<button onclick="loopLayer()">Loop layer by time interval</button>
function loopLayer() {
.........
}
var time = new ol.layer.Group({ ....... });
let intervalHandle = null;
let activeLayerIndex = -1;
function startAnimation() {
// check if interval is already running
if (!intervalHandle) {
activeLayerIndex = 0;
// make sure all layers of the group are hidden
time.getLayers().forEach(layer => layer.setVisible(false));
intervalHandle = setInterval(function() {
const allLayers = time.getLayers();
if (activeLayerIndex >= allLayers.getLength()) {
// we reached the end, stop animating
stopAnimation();
}
allLayers.item(activeLayerIndex).setVisible(true);
if (activeLayerIndex > 0) {
// hide the previous layer
allLayers.item(activeLayerIndex -1).setVisible(false);
}
activeLayerIndex += 1;
}, 500 /* milliseconds */);
}
}
function stopAnimation() {
if(intervalHandle) {
clearInterval(intervalHandle);
intervalHandle = null;
}
}