Wie erhalte ich in OpenLayers die Koordinaten eines Klick-Vektor-Features / Layers?

15

Ich muss die Koordinate des Klicks ermitteln, wenn der Benutzer auf ein Vektor-Feature in der OpenLayers-Karte klickt. Das SelectControl gibt nur die angeklickte Funktion und nicht die Koordinaten des Klicks an. Wie auch immer, um die Koordinaten des Klickens auf einen Vektor zu erhalten? Ich muss AnchoredBubble beim Klicken des Benutzers anzeigen.

Vish
quelle

Antworten:

16

Das Beispiel für ein Klickereignis gibt Ihnen genau das, was Sie möchten.

OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
            defaultHandlerOptions: {
                'single': true,
                'double': false,
                'pixelTolerance': 0,
                'stopSingle': false,
                'stopDouble': false
            },

            initialize: function(options) {
                this.handlerOptions = OpenLayers.Util.extend(
                    {}, this.defaultHandlerOptions
                );
                OpenLayers.Control.prototype.initialize.apply(
                    this, arguments
                ); 
                this.handler = new OpenLayers.Handler.Click(
                    this, {
                        'click': this.trigger
                    }, this.handlerOptions
                );
            }, 

            trigger: function(e) {
                var lonlat = map.getLonLatFromViewPortPx(e.xy);
                alert("You clicked near " + lonlat.lat + " N, " +
                                          + lonlat.lon + " E");
            }

        });

Bei Bedarf können Sie Koordinaten in Pixel konvertieren , um das Popup anzuzeigen.

Bearbeiten - um Koordinaten nur bei Auswahl der Funktion zu erhalten :

   var options = {
    onSelect: getCoordinates,
};

var selectEt = new OpenLayers.Control.SelectFeature(mylayer, options);
map.addControl(selectEt);

function getCoordinates(e) {
 // this should work
 var lonlat = map.getLonLatFromViewPortPx(e.xy);
 alert("You clicked near " + lonlat.lat + " N, " +
                                          + lonlat.lon + " E");
}
simo
quelle
Hallo Simo, ich brauche das Click-Ereignis nur aufzurufen, wenn ich auf den Vektor-Layer oder das Feature klicke, an dem ich interessiert bin. Ich denke, das obige Beispiel erfasst und ruft den Click-Event-Handler auf der gesamten Karte auf und nicht nur auf den Vektor-Layern. Vielen Dank, Vish
Vish
@ Vish: In diesem Fall siehe Tim Schaubs Antwort und meine Bearbeitung oben.
Simo
Hey, simo, woher kommt das 'e' in der getCoordinates-Methode?
Vish
e ist das Ereignis . Ich habe es der Deklaration der Funktion getCoordinates (e) hinzugefügt . Ich bin mir sicher, dass Sie das Feature bestehen können, aber ich bin mir nicht sicher, was das Ereignis angeht. Einen Test machen.
simo
@simo, es heißt, dass onSelect erwarten sollte, mit einem Feature und nicht mit einem Ereignis aufgerufen zu werden
Chris
6

Die API bietet keine Möglichkeit, die Klickposition vom SelectFeatureSteuerelement abzurufen - sollte es aber. Es wäre eine triviale Ergänzung ( xyin die featureselectedVeranstaltung aufgenommen zu haben). Wenn Sie dies buchen, wäre dies der erste Schritt, um dies zu erreichen.

In der Zwischenzeit können Sie über den vom SelectFeatureSteuerelement verwendeten Feature-Handler auf das Mausereignis zugreifen . Vielleicht haben Sie einen Listener, der ungefähr so ​​aussieht:

layer.events.on({featureselected: function(event) {
    // should be event.xy, but it's not available currently
    var pixel = control.handlers.feature.evt.xy;
    var location = map.getLonLatFromPixel(pixel);
    alert("You clicked near " + location);
});

Dies setzt (offensichtlich) voraus, dass Sie einen Verweis auf das SelectFeatureSteuerelement und Ihre Karte haben.

Tim Schaub
quelle
3

Ich konnte das Lat-Lon des Click-Ereignisses folgendermaßen abrufen:

Im clickFeatureHandler

var clickedlonlat = 
    Ext.getCmp("coreRef").parent.map.getLonLatFromPixel(
        new OpenLayers.Pixel(
            selectFeatureReference.handlers.feature.evt.layerX,
            selectFeatureReference.handlers.feature.evt.layerY
        ));

Wo selectFeatureReferenceist der Verweis auf die SelectFeature, die Sie erstellt haben.

Chris
quelle
Dies funktionierte, aber ich musste Ext.getCmp ("coreRef"). Parent aus dem Code entfernen
Matthew Lock
3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

So habe ich es in Version 3.8.2 herausgefunden, um Koordinaten wie die folgenden zu erhalten:
[-1.1645507812500016, 53.2257684357902]
Wenn ich in Großbritannien herumklicke .

khandaniel
quelle
Dies ist der einfachste und einfachste Weg. Kann bestätigen, dass es auch mit v5.3 funktioniert.
Raidok
0

Sie können verwenden feature.getBounds().getCenterLonLat(). Funktioniert für Features vom Typ Punkt / Linie / Polygon. Und Sie müssen nicht wissen, was es ist, da es für alle funktioniert.

Vadim
quelle
Hallo Vadim, ich brauche die Koordinate des Klicks, da ich meine Blase dort verankern möchte und nicht in der Mitte. Vielen Dank,
Vish
0

Falls jemand wie ich über diese alte Frage stolpert, können Sie in der neuesten Version von OpenLayers zu diesem Zeitpunkt (3.20.0) die angeklickte Position ermitteln, indem Sie angeben, e.mapBrowserEvent.coordinatewo esich das Select-Ereignis befindet.

Adam Franco
quelle