2017-08-01 94 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提供的解決方案。 –