需要在OL3中克隆图层
Need to clone layer in OL3
如何在 OL3 中克隆图层?
目前我尝试这样做,但它给了我一个不同的对象,具有真实 ol.layer 的不同方面。就像您在内部控制台日志中看到的那样,我丢失了该层的实例,保留它对我来说很重要。
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://openlayers.org/en/v3.20.1/css/ol.css" type="text/css">
<!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://openlayers.org/en/v3.20.1/build/ol.js"></script>
</head>
<body>
<div id="map" class="map" tabindex="0"></div>
<script>
var map = new ol.Map({
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
target: 'map',
view: new ol.View({
center: [0, 0],
zoom: 2
})
});
console.log("map layer is an instanceof ol.layer.tile? ", map.getLayers().getArray()[0] instanceof ol.layer.Tile)
function cloneLayer() {
map.getLayers().getArray().forEach(function(layer) {
var copyLayer = jQuery.extend(true, {}, layer);
console.log("CopyLayer is an instanceof ol.layer.tile? ", copyLayer instanceof ol.layer.Tile)
console.log("CopyLayer is equal to mapLayer? ", map.getLayers().getArray()[0] == copyLayer)
});
}
cloneLayer()
</script>
</body>
</html>
我对 OL3 不熟悉,但也许你可以尝试使用你原来的对象作为新对象的原型
var copyLayer = Object.create(layer.prototype)
我正在寻找一种情况,您需要克隆一个图层,但我没有找到。
ol3 中的许多其他 类 有他们的方法 clone
可以做到这一点。克隆图层涉及复制您的源,它具有功能和许多其他对象。
jQuery.extend 适用于 DOM 元素,适用于 DOM 个对象,see docs 适用于作为自定义实例的复杂对象 类, prototyped 类, 就像所有的 ol 类 一样,克隆一个对象比迭代它的属性并复制每个对象要复杂得多。
所以,如果您需要另一个具有相同特征的图层,我建议您创建一个新图层并复制他们的选项。
或者,如果你能解释一下你需要克隆一个层的情况,也许我们可以有一个替代方案。
如何在 OL3 中克隆图层?
目前我尝试这样做,但它给了我一个不同的对象,具有真实 ol.layer 的不同方面。就像您在内部控制台日志中看到的那样,我丢失了该层的实例,保留它对我来说很重要。
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://openlayers.org/en/v3.20.1/css/ol.css" type="text/css">
<!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://openlayers.org/en/v3.20.1/build/ol.js"></script>
</head>
<body>
<div id="map" class="map" tabindex="0"></div>
<script>
var map = new ol.Map({
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
target: 'map',
view: new ol.View({
center: [0, 0],
zoom: 2
})
});
console.log("map layer is an instanceof ol.layer.tile? ", map.getLayers().getArray()[0] instanceof ol.layer.Tile)
function cloneLayer() {
map.getLayers().getArray().forEach(function(layer) {
var copyLayer = jQuery.extend(true, {}, layer);
console.log("CopyLayer is an instanceof ol.layer.tile? ", copyLayer instanceof ol.layer.Tile)
console.log("CopyLayer is equal to mapLayer? ", map.getLayers().getArray()[0] == copyLayer)
});
}
cloneLayer()
</script>
</body>
</html>
我对 OL3 不熟悉,但也许你可以尝试使用你原来的对象作为新对象的原型
var copyLayer = Object.create(layer.prototype)
我正在寻找一种情况,您需要克隆一个图层,但我没有找到。
ol3 中的许多其他 类 有他们的方法 clone
可以做到这一点。克隆图层涉及复制您的源,它具有功能和许多其他对象。
jQuery.extend 适用于 DOM 元素,适用于 DOM 个对象,see docs 适用于作为自定义实例的复杂对象 类, prototyped 类, 就像所有的 ol 类 一样,克隆一个对象比迭代它的属性并复制每个对象要复杂得多。
所以,如果您需要另一个具有相同特征的图层,我建议您创建一个新图层并复制他们的选项。
或者,如果你能解释一下你需要克隆一个层的情况,也许我们可以有一个替代方案。