2013-06-11 2 views
2

У меня есть OpenLayers.Layer.Vector слой, что-то вроде этого:Как сохранить OpenLayers.StyleMap и OpenLayers.SelectFeature от конфликта?

layer = new OpenLayers.Layer.Vector("zzzzz", { 
    strategies: [ 
    new OpenLayers.Strategy.Fixed(), 
    ], 
    // styleMap: new OpenLayers.StyleMap({ 
    // 'default': { .. layer styles here ..} 
    // 'select': { .. selected styles here ..} 
    // }), 
    protocol: new OpenLayers.Protocol.HTTP({ 
    url: "/kml/zzzzzz.kml", 
    renderers: ['Canvas','SVG'], 
    format: new OpenLayers.Format.KML({ 
     extractStyles: false, 
     extractAttributes: true, 
     maxDepth: 0 
    }) 
    }) 
}); 

Тогда у меня есть контроль OpenLayers.Controls.SelectFeature, что-то вроде этого:

selectFeature = new OpenLayers.Control.SelectFeature(
    [layer], 
    { 
     renderIntent: "select", 
     clickout: true, 
     toggle: true 
    } 
); 

Затем я добавляю его на карте, например, так:

map = new OpenLayers.Map('map'); 
map.addLayer(layer); 
map.addControl(selectFeature); 
selectFeature.activate(); 

Теперь мгновенная что я раскомментировать эти StyleMap линии, все мои функции становятся незаметными и не реагируют на них. Мало того, что стили не отражают состояние, но состояния, похоже, не меняются вообще.

Что нужно сделать для поддержки пользовательских стилей И чтобы слои были нависшими и/или кликабельными?

ответ

2

Как вы разрабатываете намерения? Какова ценность вашего символьного хеша 'default': { .. layer styles here ..} ???

Я думаю, что вы создаете «пустой» объект и задавать только некоторые свойства используемого по умолчанию и выберите стиль, например:

default: { 
    strokeColor: "red" 
} 

который производит стиль только один атрибут и без LineWidth, strokeOpacity, и т. д.

Следующий код подходит для меня. Также обратите внимание, что renderers должен быть указан в слоях в протоколе.

var map = new OpenLayers.Map("map"); 

    // Create an OpenStreeMap raster layer and add to the map 
    var osm = new OpenLayers.Layer.OSM(); 
    map.addLayer(osm); 

    // Set view to zoom maximum map extent 
    map.zoomToMaxExtent(); 

    // Create symbolizers inherited from the predefined styles and change only some properties. 
    var defaultStyleSymbolizer = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); 
    defaultStyleSymbolizer.strokeColor = "green"; 
    var selectStyleSymbolizer = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['select']); 
    selectStyleSymbolizer.strokeColor = "red"; 

    // Create a vector layer 
    var layer = new OpenLayers.Layer.Vector("zzzzz", { 
     strategies: [ 
     new OpenLayers.Strategy.Fixed(), 
     ], 
     // Set the renderers 
     renderers: ['Canvas','SVG'], 
     // Apply the style map 
     styleMap: new OpenLayers.StyleMap({ 
     'default': defaultStyleSymbolizer, 
     'select': selectStyleSymbolizer 
     }), 
     protocol: new OpenLayers.Protocol.HTTP({ 
     url: "./global_undersea.kml", 
     format: new OpenLayers.Format.KML({ 
      extractStyles: false, 
      extractAttributes: true, 
      maxDepth: 0 
     }) 
     }) 
    }); 

    // The select control 
    var selectFeature = new OpenLayers.Control.SelectFeature([layer], { 
     renderIntent: "select", 
     clickout: true, 
     toggle: true 
    }); 

    // Add layer and control 
    map.addLayer(layer); 
    map.addControl(selectFeature); 
    selectFeature.activate(); 
Смежные вопросы