2012-04-16 6 views
3

У меня есть карта, которая отображает векторный слой KML с некоторыми маркерами. Когда вы нажимаете на маркер, появляется всплывающее окно с информацией. Я хочу иметь возможность автоматически всплывать информационное окно на основе параметра, переданного на страницу. Я думаю, мне нужно сделать это, используя getFeaturesByAttribute(), чтобы найти имя, однако массив функций всегда кажется пустым. (Хотя я могу видеть содержимое, когда я использую FireBug)OpenLayers features array пуст

Что мне нужно сделать, чтобы получить элементы в массиве?

Код:

function init() 
{ 
     var options = { 
      projection: new OpenLayers.Projection("EPSG:900913"), 
      displayProjection: new OpenLayers.Projection("EPSG:4326"), 
      units: "m", 
     }; 
     map = new OpenLayers.Map('map', options); 
     var mapnik = new OpenLayers.Layer.OSM("OpenStreetMap"); 
     var gmap = new OpenLayers.Layer.Google("Google", {sphericalMercator:true}); 
     var gsat = new OpenLayers.Layer.Google(
      "Google Satellite", 
      {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22} 
     ); 

     groups = new OpenLayers.Layer.Vector("Groups", { 
      projection: map.displayProjection, 
      strategies: [new OpenLayers.Strategy.Fixed()], 
      protocol: new OpenLayers.Protocol.HTTP({ 
       url: "http://maps.google.co.uk/maps/ms?msa=0&msid=210450558816094618535.0004bd79ceb30e9acb9da&output=kml", 
       format: new OpenLayers.Format.KML({ 
        extractStyles: true, 
        extractAttributes: true 
       }) 
      }) 
     }); 

     map.addLayers([mapnik, gmap, gsat, groups]); 

     select = new OpenLayers.Control.SelectFeature(groups); 

     groups.events.on({ 
      "featureselected": onFeatureSelect, 
      "featureunselected": onFeatureUnselect 
     }); 

     map.addControl(select); 
     select.activate(); 

     map.addControl(new OpenLayers.Control.LayerSwitcher()); 

     var center = new OpenLayers.LonLat(-2.58789,51.52283).transform(map.displayProjection, map.projection); 
     var zoom = 12 
     map.setCenter(center, zoom); 

     alert(groups.features.length); // is always 0 

    } 

ответ

2

Этот вопрос, как мне кажется, потому что вызов HTTP происходит асинхронно, чтобы заполнить особенности слоя. Поэтому вы вызываете предупреждение (groups.features.length) до того, как HTTP-вызов вернулся, и, следовательно, у слоя нет функций, поэтому groups.features.length справедливо 0. Если вы хотите увидеть количество функций таким образом, вам нужно присоедините функцию к layer loadend event, которая вызывается после того, как событие HTTP вернется, и вы сможете опросить все функции.

+0

Спасибо, работал блестяще! – Paul