2017-08-01 96 views
0

所以,我很新的JS。 我创造了我的RGB层的中央风格作为标记的功能,并将其与该代码分配给数组:Openlayers 4:从数组中加载功能

 for (var i = 0, len = Layers.length; i < len; i++) { 
      var mExtent = ol.proj.transformExtent(Layers[i].BoundingBox[0].extent, 'EPSG:4326', 'EPSG:3857'); 

      var X = mExtent[0] + (mExtent[2]-mExtent[0])/2; 
      var Y = mExtent[1] + (mExtent[3]-mExtent[1])/2; 

    var iconFeature = new ol.Feature({ 
    geometry: new ol.geom.Point([X, Y]), 
    name: Layers[i].Title, 
    layername: Layers[i].Name, 
    description: Layers[i].Abstract 
    });     
    var iconStyle = new ol.style.Style({ 
    image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({ 
     anchor: [0.5, 46], 
     anchorXUnits: 'fraction', 
     anchorYUnits: 'pixels', 
     src: ortho 
    })) 
    }); 

    iconFeature.setStyle(iconStyle); 

    var vectorSource = new ol.source.Vector({ 
    features: [iconFeature] 
    }); 

var vectorLayer = new ol.layer.Vector({source: vectorSource, zIndex: 100 }); 
layers2[i] = vectorLayer 
      } 

当我尝试再打电话与地图:

var map = new ol.Map({ 
    layers:[BaseLayers, POI, layers2],  
    target: document.getElementById('map') 
}); 

我的图层2功能阵列未显示在地图上。 如果当时我尝试添加在控制台手动此阵的特点:

map.addLayer(layers2) 

我获得以下错误:

TypeError: a.addEventListener is not a function 

但如果我尝试手动调用从数组中的元素像这样:

map.addLayer(layers2[0]) 

它工作正常。 我的包含基础层(OSM + mapbox)的阵列工作正常。我很确定我的数组类型有问题。 但是不知道是什么。

感谢您的光临。

编辑1

试图把我的所有功能,RGB层和底图单个阵列中的“层”。 因此,代码在第一循环中变更从

layers2[i] = vectorLayer; 

要:

layers.push(vectorLayer); 

哪里“层”已经包含了所有其余的层对象。 当调用地图时 - 没有“vectorLayer”功能。 在使用map.addLayer(图层)在控制台中手动调用“图层”时仍然会得到相同的错误。 例如,当调用map.addLayer(layers[2])的特定“矢量图层”功能时,它会显示出来。

回答

0

通过查看代码layers2是一个层数组。虽然创建ol.Map对象layers属性应该是单维数组,但在您的代码中它是一个2维数组,如下所示。这就是它给错误的原因。

[ BaseLayer, POI, [layers[0],layers2[1],.....]]

溶液1:创建一个使用循环地图对象后添加层的阵列。

var map = new ol.Map({ 
    layers:[BaseLayers, POI],  
    target: document.getElementById('map') 
}); 

for (var i=0; i<layers2.length; i++) { 
    map.addLayer(layers2[i]); 
}; 

解决方案2:插入BaseLayersPOIlayers2然后只layers2声明配置ol.Map

+0

你的评论是正确的。您也可以尝试'图层:BaseLayers.concat(Layers2).concat(POI)'。它应该给你一个单一的所有图层的dimmension数组。 – pavlos

+0

感谢您的回复。 我以前尝试的第一个解决方案,它确实有效,是的,但这是我想避免的。 至于解决方案2 - 我试图把我所有的图层与layers.push(vectorLayer)放在一个数组中。在第一个循环中,并将剩余的图层推送到相同的数组(层) - 但仍然不起作用。 当我尝试调用一个数组中的所有图层的地图时,“vectorLayer”中的要素不会显示出来,并且如果尝试在控制台中再次调用该数组图层,仍会得到相同的错误。 会在第一篇文章中做一些调整。 – Malebolgea

+0

如果您之前已经尝试过,那么当您提问时应该提及它。如果您不想使用解决方案1,请使用2或@Pavlos提供的解决方案。 –