¿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.

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

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.


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.


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.


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.