Mehrere "selectControl" aktivieren?

Hallo,

ich lade via GeoJSON 2 unterschiedliche Arten von Markern.
Leider wird aber nur beim zuletzt geladenen Marker das selectControl (“map.addControl(selectControlHaltestellen);”) geladen.
D.h. beim zuletzt geladenen Marker funktioniert bsp. das Mouseover, während die erst ausgegebenen Marker nur angezeigt werden.

Gibt es eine Möglichkeit, beide selectControl zu laden, bzw zu aktivieren?


standort = new OpenLayers.Layer.Vector
(
    'Standort',
    {
        displayInLayerSwitcher: false,
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.HTTP({
        url: 'standort-osm.php',
        params: {bbox: bbox.toBBOX()},
        format: new OpenLayers.Format.GeoJSON()}),
        
        eventListeners:
        {
            'loadend': function() {reload = setTimeout('aktualisierung()', 10000);},
            'moveend': function() {if (standort){standort.protocol.params.bbox = map.getExtent().transform(map.getProjectionObject(), new OpenLayers.Projection('EPSG:4326')).toBBOX();}}
        },
        
        styleMap: new OpenLayers.StyleMap
        ({
            'default': new OpenLayers.Style
            ({
                externalGraphic: '${icon}.png',
                graphicWidth: 26,
                graphicHeight: 26
            }),
            
            'select': new OpenLayers.Style
            ({
                backgroundGraphic: 'bg.png',
                backgroundHeight: 20,
                backgroundWidth: '${getBackgroundWidth}',
                backgroundYOffset: 15,
                label: '${ziel}',
                labelYOffset: -30,
                labelAlign: 'cb',
                fontFamily: 'Arial',
                fontSize: 15,
                cursor: 'pointer'
            },{
                context:
                {
                    getBackgroundWidth: function(feature)
                    {
                        String.prototype.visualLength = function()
                        {
                            var sizer = document.getElementById("sizer");
                            sizer.innerHTML = this;
                            return sizer.offsetWidth;
                        }

                        var s = feature.attributes.ziel + 10;
                        return(s.visualLength());
                    }
                }
            })
        })
    }
);
map.addLayer(standort);

var selectControlStandort = new OpenLayers.Control.SelectFeature(standort, {hover: true});
map.addControl(selectControlStandort);
selectControlStandort.activate();

haltestellen = new OpenLayers.Layer.Vector
(
    'Haltestellen',
    {
        displayInLayerSwitcher: false,
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.HTTP({
        url: 'haltestellen-osm.php',
        params: {bbox: map.getExtent().transform(new OpenLayers.Projection('EPSG:4326'), map.getProjectionObject()).toBBOX()},
        format: new OpenLayers.Format.GeoJSON()}),
        
        eventListeners:
        {
            'moveend': function() {if (haltestellen){haltestellen.protocol.params.bbox = map.getExtent().transform(map.getProjectionObject(), new OpenLayers.Projection('EPSG:4326')).toBBOX(); haltestellen.refresh();}}
        },
        
        styleMap: new OpenLayers.StyleMap
        ({
            'default': new OpenLayers.Style
            ({
                externalGraphic: 'bhs14.png',
                graphicWidth: '${iconSize}',
                graphicHeight: '${iconSize}'
            }),
            
            'select': new OpenLayers.Style
            ({
                backgroundGraphic: 'bg.png',
                backgroundHeight: 20,
                backgroundWidth: '${getBackgroundWidth}',
                backgroundYOffset: 15,
                label: '${title}',
                labelYOffset: -30,
                labelAlign: 'cb',
                fontFamily: 'Arial',
                fontSize: 15,
                cursor: 'pointer'
            },{
                context:
                {
                    getBackgroundWidth: function(feature)
                    {
                        String.prototype.visualLength = function()
                        {
                            var sizer = document.getElementById("sizer");
                            sizer.innerHTML = this;
                            return sizer.offsetWidth;
                        }

                        var s = feature.attributes.title + 10;
                        return(s.visualLength());
                    }
                }
            })
        })
    }
);
map.addLayer(haltestellen);

selectControlHaltestellen = new OpenLayers.Control.SelectFeature(haltestellen, {hover: true});
map.addControl(selectControlHaltestellen);
selectControlHaltestellen.activate();

Gruß Wayne

versuch es mal so:


                var selcontrol = new OpenLayers.Control.SelectFeature([standort,haltestellen],
               {hover:        true });
               
            map.addControl(selcontrol);
            selcontrol.activate();

nicht getestet - nur irgendwo bei mir nachgesehen.

also beide layers angeben. deine Anpassungen müssten natürlich noch rein.

Gruss
Walter

Vielen Dank Walter… :slight_smile:
Genau das war das Problem.

Wenn ich jetzt noch versuche, ein Popup zu öffnen

haltestellen.events.on({'featureselected': onFeatureSelect, 'featureunselected': onFeatureUnselect});

wird dieses nur während des Mouseovers angezeigt…

Ne Funktion wie “haltestellen.events.on(‘click’, onFeatureSelect);” find ich leider keine.

Gruß Wayne

Das ist der Effekt von diesm “hover: true”, oder? Weil als ich das letzte Mal mit sowas gespielt hab, gabs diesen Effekt nicht…

Genau.
Aber diesen benötige ich ja für mein Mouseover. > http://tinyurl.com/7kgejy7

Holla,

habe nun mehrere Möglichkeiten probiert, aber keine klappt so wie es sein sollte.
Jedes mal wird auch das Popup bereits beim Hover angezeigt.


haltestellen.events.on({'featureselected': onFeatureSelect, 'featureunselected': onFeatureUnselect});

Ich vermute, ich brauch noch ein zusätzliches Control, welches nur den Markerklick bei den Haltestellen verarbeitet.


var ClickControl = new OpenLayers.Control.SelectFeature(haltestellen, {hover: false................................});
map.addControl(ClickControl);
ClickControl.activate();

Aber das Problem bei der Sache wird sein, das durch das erste Control ja auch den Haltestellen das Hover mitgegeben wird.

Gruß Wayne

Hallo,

leider muß ich mein Problem noch einmal nach oben “pushen”… :slight_smile:
Ich fummel immer noch am zusätzlichen Popup (zusätzlich zum Hover) herum.

In diesem Beispiel (http://openlayers.org/dev/examples/highlight-feature.html) von E-Malte (http://forum.openstreetmap.org/viewtopic.php?id=8296) und auch hier (http://www.mail-archive.com/users@openlayers.org/msg11241.html) werden beide Funktionen angewendet:

       
var highlightCtrl = new OpenLayers.Control.SelectFeature(vectors, {
   hover: true,
   highlightOnly: true,
   renderIntent: "temporary",
   eventListeners: {
      beforefeaturehighlighted: report,
      featurehighlighted: report,
      featureunhighlighted: report
   }
});

var selectCtrl = new OpenLayers.Control.SelectFeature(vectors,
   {clickout: true}
);

map.addControl(highlightCtrl);
map.addControl(selectCtrl);

highlightCtrl.activate();
selectCtrl.activate();

Es muß doch also möglich sein, bei den Haltestellen noch ein “click” mit einzubauen.
Wirklich keiner ne Idee wie man das realisieren könnte??? >> http://tinyurl.com/7kgejy7 >> Langsam verzweifle ich echt… :slight_smile:

Hoffnungsvolle Grüße
Wayne

Nahmd,

Ich hab vor einiger Zeit ein ähnliches Problem gehabt: ein GPX-Layer (vom modernen Vector-Typ) über einem Marker-Layer (vom veralteten Typ). Da konnte man die Marker nicht mehr anklicken.

Der Grund war: der Vector-Layer hat alle Mausklicks abgefangen. Das muss er, weil er zuerst in seinen Daten nachschauen muss, ob er was mit dem Klick anfangen kann. Das ist ok. Der hat aber ungenutzte Klicks nicht an den nächsten Layer weitergereicht. Und das ist doof.

Lösung war damals, den Markerlayer per z-index nach oben zu legen. Der Markerlayer ist brav und reicht nicht benötigte Klicks nach unten durch (genauer: er sieht sie erst gar nicht).

Bei Dir ist die Sache kniffliger, weil Du zwei Vector-Layer hast. Der jeweils zuletzt geladene liegt oben, und der fängt die Klicks ab. Auch ungenutzte nicht weiterzugeben kann man als Feature sehen; dieses sollte aber deaktivierbar sein. Guck mal in der Doku zur Konfiguration der Layer, ob es da was mit “propagate” im Namen gibt? Das sollte man dann einschalten.

Wenn es das nicht geben sollte, dann müsste jemand (wahrscheinlich tief) in das Framework eingreifen :confused:

Gruß Wolf

Nahmd,

Nicht verzweifeln!

Gruß Wolf

Edit: URL geändert, weil Demoseite getilgt.

Abnormal…

So schnell kann ich mich ja in “propagate” gar nicht einlesen wie du das Problem hier fixst. :slight_smile:
Ich weiß wirklich nicht was ich sagen soll.

Vielen vielen Dank Wolf.
Es macht mir von Tag zu Tag noch mehr Spaß, mit OSM zu arbeiten !!!

Gruß Wayne

Moins,

"Wir stellen die Normailtät augenblich wieder her – sobald wir wissen, was eigentlich normal ist.

Den Versuch “mehrere SelectFeature-Controls” habe ich abgebrochen, die Logik ist über zu viele Klassen verteilt. Das sollte aber zu fixen sein, möglicherweise fehlt einfach irgendwo ein “return true”.

Der Paramter “hover” beim SelectFeatures führt nicht (wie man erwarten würde) dazu, dass das Hovering zusätzlich erfolgt, sondern ausschließlich. Hover ein → Click aus. Es gibt noch das “highlightOnly”. Das führt aber nicht dazu, dass hover highlighted und click selected, sondern das click bleibt weiter inaktiv.

Alles unsere Ideen mussten da scheitern.

Die Lösung besteht (leider) in einem Patch für OpenLayers.js.
BTW: dann kann gerne jemand beim OpenLayers-Projekt einbringen.

Einfach bei Gelegenheit ne Tüte Gummibären rüberwandern lassen. :wink:

Willkommen im Club. :slight_smile:

Gruß Wolf