2017-08-01 8 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の機能の配列はマップに表示されません。 その後、私は、コンソールで手動の特徴のこの配列を追加しようとした場合:

TypeError: a.addEventListener is not a function 

しかし、私は手動なように配列から要素を呼び出そうとします:私は次のエラーを取得する

map.addLayer(layers2) 

map.addLayer(layers2[0]) 

正常に動作します。 ベースレイヤー(OSM +マップボックス)を含む配列が正常に動作します。 私の配列タイプには何か問題があります。 しかし、何がわからない。

お越しいただきありがとうございます。

編集1

は、単一のアレイ「層」にすべての私の特徴、RGB層とベースマップを入れてみました。 「層」は、すでにすべての残りの層のオブジェクトが含まれてい

layers.push(vectorLayer); 

: だからコードが

layers2[i] = vectorLayer; 

からする最初のループで変更されました。 マップを呼び出すときに、 "vectorLayer"機能はありません。 map.addLayer(layers)を使用してコンソールで「レイヤー」を手動で呼び出すと、同じエラーが発生します。 たとえば、map.addLayer(layers[2])という特定の「vectorLayer」機能を呼び出すときは、表示されます。

答えて

0

コードを見て、layers2はレイヤーの配列です。 ol.Mapオブジェクトlayersの属性を作成するときは、1次元配列である必要がありますが、コード内には以下のような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

あなたの発言は正しいです。 'layers:BaseLayers.concat(Layers2).concat(POI)'も試してみてください。それはあなたにすべての層の単一dimmension配列を与える必要があります。 – pavlos

+0

あなたの返信をありがとう。 私が以前に試した最初の解決策は、うまくいきますが、それは避けたいものです。 解決策2として、私はlayers.push(vectorLayer)で1つの配列にすべてのレイヤーを配置しようとしました。残りのレイヤーを同じアレイ(レイヤー)にプッシュしますが、まだ動作しません。 "vectorLayer"の機能が表示されず、コンソールでそのレイヤーの配列を再度呼び出すと、同じエラーが表示されます。 最初の投稿でいくつかの調整を行います。 – Malebolgea

+0

これまでに試したことがあるのなら、あなたは質問しているときに言及するべきです。あなたが解決策1を使いたくないなら、2か@Pavlosによって与えられた解決策を使用してください。 –

関連する問題