¿Cómo obtengo las coordenadas de un clic en la entidad / capa vectorial en OpenLayers?

15

Necesito obtener la coordenada del clic cuando el usuario hace clic en una entidad vectorial en el mapa OpenLayers. SelectControl solo proporciona la función en la que se hizo clic y no las coordenadas del clic. De todos modos para llegar a las coordenadas del clic en un vector? Necesito mostrar AnchoredBubble en el punto del clic del usuario.

Vish
fuente

Respuestas:

16

En realidad, la muestra de evento de clic te da lo que quieres.

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

        });

Si es necesario, puede convertir coordenadas a píxeles para mostrar la ventana emergente.

Editar: para obtener coordenadas solo al seleccionar la función :

   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
fuente
Hola, simo, necesito que se llame al evento de clic solo cuando se hace clic en la capa o entidad vectorial que me interesa. Creo que la muestra anterior captura y llama al controlador de eventos de clic en todo el mapa y no solo en las capas de vector. Gracias, Vish
Vish
@Vish: en ese caso, vea la respuesta de Tim Schaub y mi edición anterior.
simo
Hola simo, ¿de dónde viene la 'e' en el método getCoordinates?
Visite
e es el evento . Lo agregué a la declaración de la función getCoordinates (e) . Estoy seguro de que puede pasar la función, pero no estoy seguro sobre el evento. Haz un examen.
simo
@simo, dice que onSelect debería esperar ser llamado con una función, no un evento: dev.openlayers.org/docs/files/OpenLayers/Control/…
Chris
6

La API no proporciona una forma de obtener la ubicación del clic desde el SelectFeaturecontrol, pero debería. Sería una adición trivial (haber xyincluido en el featureselectedevento). Si usted registra esto, sería el primer paso para hacerlo realidad.

Mientras tanto, puede acceder al evento del mouse en el controlador de funciones utilizado por SelectFeature control. Entonces, es posible que tenga un oyente que se vea así:

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

Esto supone (obviamente) que tiene una referencia al SelectFeaturecontrol y su mapa.

Tim Schaub
fuente
3

Pude obtener el último tiempo del evento de clic usando lo siguiente:

Dentro del clickFeaturecontrolador

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

donde selectFeatureReferenceestá la referencia al SelectFeatureque creaste.

Chris
fuente
Esto funcionó, pero tuve que eliminar Ext.getCmp ("coreRef"). Parent del código
Matthew Lock
3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

Así es como lo descubrí en v3.8.2 para obtener coordenadas como las siguientes:
[-1.1645507812500016, 53.2257684357902]
cuando hago clic en Reino Unido.

khandaniel
fuente
Esta es la forma más simple y fácil. Puede confirmar que también funciona con v5.3.
Raidok
0

Puedes usar feature.getBounds().getCenterLonLat(). Funciona para características de tipo punto / línea / polígono. Y no tiene que saber qué es, ya que funciona para todos.

Vadim
fuente
Hola Vadim, necesito la coordenada del clic ya que quiero anclar mi burbuja allí y no en el centro. Gracias,
Vish
0

En caso de que alguien tropiece con esta vieja pregunta como lo hice yo, en la última versión de OpenLayers en este momento (3.20.0) puede obtener la posición en la que se hizo clic usando e.mapBrowserEvent.coordinatedónde eestá el evento Seleccionar.

Adam Franco
fuente