Делаем более одного векторного слоя кликабельным в OpenLayers - PullRequest
7 голосов
/ 04 февраля 2012

Я работаю над картой OpenLayers, которая будет отображать несколько слоев KML одновременно. Я хочу иметь возможность щелкнуть по объекту из любого слоя и получить всплывающее окно, показывающее мне некоторую информацию. Пока что я могу нажать только на самый последний добавленный слой. Если я хочу щелкнуть по ранее добавленному слою, я должен отключить все слои, которые были добавлены ранее. Очевидно, что это не идеально. Вот мой код:

var select = [];
function addLayer(layerId, layerLink, layerColor)
{

    var kmlLayer = new OpenLayers.Layer.Vector("Layer_"+layerId, {
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.HTTP({
            url: layerLink,
            format: new OpenLayers.Format.KML({
        extractStyles: true, 
        extractAttributes: true,
        maxDepth: 2
        })
    })
    });

    kmlLayer.events.on({
        "featureselected": onKMLSelect,
        "featureunselected": onKMLUnselect
    });

    select["Layer_"+layerId] = new OpenLayers.Control.SelectFeature(kmlLayer);
    map.addControl(select["Layer_"+layerId]);
    select["Layer_"+layerId].activate();  

    map.addLayer(kmlLayer);

}
function onKMLPopupClose(evt) {
    for(s in select)
    {
        select[s].unselectAll();
    }
}
function onKMLSelect(event) {
        var feature = event.feature;

    var content = "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description;
    popup = new OpenLayers.Popup.FramedCloud("chicken", 
                             feature.geometry.getBounds().getCenterLonLat(),
                             new OpenLayers.Size(100,100),
                             content,
                             null, true, onKMLPopupClose);
    feature.popup = popup;
    map.addPopup(popup);
}
function onKMLUnselect(event) {
    var feature = event.feature;
    if(feature.popup) {
        map.removePopup(feature.popup);
        feature.popup.destroy();
        delete feature.popup;
    }
}

Любая помощь будет принята с благодарностью. Спасибо,

Ответы [ 2 ]

10 голосов
/ 06 февраля 2012

У меня была такая же проблема некоторое время назад.Вы можете найти хороший пример об этом из Примеры Openlayers : Выбор элемента OpenLayers на примере нескольких слоев .

Вот основные части кода:

var map, selectControl;
function init(){
    map = new OpenLayers.Map('map');
    var wmsLayer = new OpenLayers.Layer.WMS(
        "OpenLayers WMS", 
        "http://vmap0.tiles.osgeo.org/wms/vmap0",
        {layers: 'basic'}
    ); 

    var vectors1 = new OpenLayers.Layer.Vector("Vector Layer 1");
    var vectors2 = new OpenLayers.Layer.Vector("Vector Layer 2");

    map.addLayers([wmsLayer, vectors1, vectors2]);
    map.addControl(new OpenLayers.Control.LayerSwitcher());

    selectControl = new OpenLayers.Control.SelectFeature(
        [vectors1, vectors2]
    );

    map.addControl(selectControl);
    selectControl.activate();

    map.setCenter(new OpenLayers.LonLat(0, 0), 3);

    vectors1.addFeatures(createFeatures());
    vectors2.addFeatures(createFeatures());


    vectors1.events.on({
        "featureselected": function(e) {
            showStatus("selected feature "+e.feature.id+" on Vector Layer 1");
        },
        "featureunselected": function(e) {
            showStatus("unselected feature "+e.feature.id+" on Vector Layer 1");
        }
    });
    vectors2.events.on({
        "featureselected": function(e) {
            showStatus("selected feature "+e.feature.id+" on Vector Layer 2");
        },
        "featureunselected": function(e) {
            showStatus("unselected feature "+e.feature.id+" on Vector Layer 2");
        }
    });
}
1 голос
/ 10 марта 2013

это то, что я делаю, чтобы все функции на слоях CHOSEN стали выбираемыми при вызове всплывающих окон:

var selectStop = new OpenLayers.Control.SelectFeature([layerKMLClient, layerKMLStops,  layerKMLTarget],{onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
    layerKMLStops.events.on({
                "featureselected": onFeatureSelect,
                "featureunselected": onFeatureUnselect
            });
    layerKMLClient.events.on({
                "featureselected": onFeatureSelect,
                "featureunselected": onFeatureUnselect
            });
    layerKMLTarget.events.on({
                "featureselected": onFeatureSelect,
                "featureunselected": onFeatureUnselect
            });
    map.addControl(selectStop);
    selectStop.activate(); 

обратите внимание, что у меня есть несколько других слоев (в основном из файлов KML, но также и некоторые векторные слои из файлов TXT), функции которых НЕ ВЫБИРАЮТСЯ. Вы можете изменить свое поведение, настроив onFeatureSelect для каждого типа слоя.

БОНУС: если вы решите использовать cluster strategy на (некоторых) ваших слоях (поверьте, в какой-то момент времени вы это сделаете) - включите проверку истинности feature.cluster в вашем onFeatureSelected утверждении функции :

function onFeatureSelect(event) {
   var feature = event.feature;
   if (feature.cluster) {
...