Come posso ottenere le coordinate di un clic su feature / layer vettoriali in OpenLayers?


15

Devo ottenere le coordinate del clic quando l'utente fa clic su una funzione vettoriale sulla mappa OpenLayers. SelectControl fornisce solo la funzione su cui è stato fatto clic e non le coordinate del clic. In ogni caso per ottenere le coordinate del clic su un vettore? Devo mostrare AnchoredBubble al punto del clic dell'utente.

Risposte:


16

In realtà, l' esempio dell'evento click ti offre ciò che desideri.

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");
            }

        });

Se necessario, puoi convertire le coordinate in pixel per visualizzare il popup.

Modifica - per ottenere le coordinate solo sulla selezione della funzione :

   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");
}

Ciao simo, ho bisogno che l'evento click sia chiamato solo quando faccio clic sul layer vettoriale o sulla funzione che mi interessa. Penso che l'esempio sopra catturi e chiami il gestore eventi click sull'intera mappa e non solo sui layer vettoriali. Grazie, Vish
Vish,

@Vish: in quel caso, vedi la risposta di Tim Schaub e la mia modifica sopra.
simo

Ehi simo, da dove viene la 'e' nel metodo getCoordinates?
Vish,

e è l' evento . L'ho aggiunto alla dichiarazione della funzione getCoordinates (e) . Sono sicuro che puoi passare la funzionalità, ma non sono sicuro dell'evento. Fai un test.
simo

@simo, dice che onSelect dovrebbe aspettarsi di essere chiamato con una funzione, non un evento: dev.openlayers.org/docs/files/OpenLayers/Control/…
Chris

6

L'API non fornisce un modo per ottenere la posizione dei clic dal SelectFeaturecontrollo, ma dovrebbe. Sarebbe un'aggiunta banale (da xyincludere featureselectednell'evento). Se lo paghi, sarebbe il primo passo per realizzarlo.

Nel frattempo, è possibile accedere all'evento del mouse sul gestore funzionalità utilizzato dal SelectFeaturecontrollo. Quindi, potresti avere un ascoltatore che assomiglia a questo:

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);
});

Ciò presuppone (ovviamente) che tu abbia un riferimento al SelectFeaturecontrollo e alla tua mappa.


3

Sono stato in grado di ottenere il lat lon dell'evento click usando quanto segue:

All'interno del clickFeaturegestore

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

dove selectFeatureReferenceè il riferimento a quello SelectFeatureche hai creato.


Questo ha funzionato, ma ho dovuto rimuovere Ext.getCmp ("coreRef"). Padre dal codice
Matthew Lock

3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

È così che l'ho capito nella v3.8.2 per ottenere coordinate come le seguenti:
[-1.1645507812500016, 53.2257684357902]
quando clicco in giro per il Regno Unito.


Questo è il modo più semplice e facile. Posso confermare che funziona anche con v5.3.
Raidok,

0

È possibile utilizzare feature.getBounds().getCenterLonLat(). Funziona con funzionalità di tipo punto / linea / poligono. E non devi sapere di cosa si tratta, dal momento che funziona per tutti.


Ciao Vadim, ho bisogno delle coordinate del clic poiché voglio ancorare la mia bolla lì e non al centro. Grazie,
Vish,

0

Nel caso in cui qualcuno si imbattesse in questa vecchia domanda come ho fatto io, nell'ultima versione di OpenLayers in questo momento (3.20.0) puoi ottenere la posizione cliccata usando e.mapBrowserEvent.coordinatedove si etrova l'evento Select.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.