onClick Event/Feature bei KML?

Hallo zusammen,

gibt es eine Möglichkeit, den Linien, die ich aus einer KML heraus generiere, ein Callback Event oder sowas zuzuweisen?



    var data =  new OpenLayers.Layer.Vector("KML", {
        style : style,
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "xml.php",
            format: new OpenLayers.Format.KML({
                extractStyles: true, 
                extractAttributes: true
            })
        })
  });


Ich bin für jeden Tip zu haben…ich suche mir schon die Finger wund.

such dir was aus: http://openlayers.org/dev/examples/?q=click Dass die Daten per KML reinkommen , ist schnurzegal. Vektor ist Vektor.

Gruss
walter

Bitte entschuldige meine etwas plumpe Frageweise.

Ich habe nach diversen Tests und Herumsuchereien in irgendeinem Forenbeitrag gelesen, dass click-Events auf einem Vectorlayer gar nicht möglich sein.

Bevor ich dann aber weiter Stunden für eine Suche vergeude, die keine Ergebnisse liefert, habe ich gedacht: Ich frage hier.

Die auktuelle Lösung bei Verwendung einer GPX Datei sieht wie folgt aus:


var data =  new OpenLayers.Layer.Vector("GPX", {
        style : style,
        strategies: [new OpenLayers.Strategy.Fixed()],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "gpx.gpx",
            format: new OpenLayers.Format.GPX()
        }),
        style: {strokeColor: "green", strokeWidth: 5, strokeOpacity: 0.5},
				projection: new OpenLayers.Projection("EPSG:4326")
  });

map.addLayer(layer_mapnik);
map.addLayer(data);

           selectControl = new OpenLayers.Control.SelectFeature(
                [data],
                {
                    clickout: true, toggle: false,
                    multiple: false, hover: false,
                    toggleKey: "ctrlKey", // ctrl key removes from selection
                    multipleKey: "shiftKey" // shift key adds to selection
                }
            );
            
            map.addControl(selectControl);
            selectControl.activate();
            
            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
            
 
            data.events.on({
                "featureselected": function(e) {
                    showStatus("selected feature "+e.data.Name+" on Vector Layer 1");
                },
                "featureunselected": function(e) {
                    showStatus("unselected feature "+e.feature.id+" on Vector Layer 1");
                }
            });

Mal angenommen, das Format lautet:


<trkpt lat="49.771240" lon="8.814750">
<ele>188.520000</ele>
<time>2011-02-13T15:16:35.000Z</time>
</trkpt>

Wie kann ich nun per Click an herankommen?

Die dürfte bei Dir in e.feature.ele stehen. Frag doch mal Firebug innerhalb der featureselected-Funktion, was in “e” alles drin ist.

Mit KML hab ich wenig zu tun, aber bei GPX gehts relativ einfach, Clicks auszuwerten. Allerdings kenne ich das für GPX-Dateien nur bei Tracks und Waypoints, nicht bei einzelnen Trackpoints.

Ich denke, das Beispiel für GPX ist auf KML übertragbar: Man hat irgendein Element namens “name”, “ele” (…) und übergibt das an die featureselected-Funktion. Dort schaut man dann in evt.feature.attributes… nach seinen Elementen und gibt sie hübsch formatiert aus…

Grüße, Max

PS: Die Position des Popups beim Klick auf den Track muss man auch noch schöner machen. Der “Mittelpunkt” der Linie ist nicht das, was der klickende Anwender erwartet :wink:

Tach.

Deine Aufgabenstellung triff auf zwei Herausforderungen:

  1. Der Selection-Mechanismus liefert jeweils den ganzen Track als Line-Feature und damit auch die Attribute des Tracks und nicht die der Track-Elemente.

  2. Die für das Einlesen von Tracks zuständige Methode “extractSegment” der Klasse “OpenLayers.Format.GPX” nutzt aus den Trackpoint-Elementen nur die Koordinaten lon und lat. Die Höhe und alles andere gehen beim Einlesen verloren. Daher kommst Du an sie auch nicht heran. Watt fott es, es fott.

Ich sehe folgende Lösung: Du müsstest zum einen die “extractSegment”-Methode so modifizieren, dass sie die Attribute bewahrt, die Dich interessieren, und zum anderen bei einem Selection-Ereignis die Komponenten des übergebenen Line-Features durchsuchen nach der Komponente, die der Klick-Position am nächsten liegt, und deren Attribute für die Anzeige nutzen.

Das funktioniert, scheint mir aber zu kompliziert. Das sollte einfacher gehen.

Vieleicht kann ein OpenLayers-Kundiger eine bessere Lösung aufzeigen?

Der Assistent

Ist zum Glück völliger Blödsinn, den du da irgendwo aufgeschnappt hast. Das Vektor-Layer ist - zumindest für mich - DAS Layer, mit dem man fast alles machen kann. Es kreisen zwar immer noch alte Beispiele und Hinweise rum, die aber alle von Vector “erschlagen” werden.

Das war und ist absolut ok so. Nur erkennt man nicht immer, ob ein Laie/Newbie fragt, oder ob es doch ein “Wissender” ist. Da kommt dann schon mal leicht der Hinweis auf RTFM :wink:

Da die Kollegen meine Abwesenheit “ausgenutzt” haben, bist du ja schon gut beraten worden.

Gruss
walter