22 votos

¿Cómo puedo obtener las coordenadas de un clic en una característica vectorial/capa en OpenLayers2?

Necesito obtener la coordenada del clic cuando el usuario hace clic en una característica vectorial en el mapa de OpenLayers. El SelectControl sólo da la característica en la que se hizo clic y no las coordenadas del clic. ¿Cómo puedo obtener las coordenadas del clic en un vector? Necesito mostrar AnchoredBubble en el punto del clic del usuario.

17voto

eplawless Puntos 2076

En realidad, el ejemplo 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 las coordenadas en píxeles para mostrar la ventana emergente.

Editar - para obtener las coordenadas sólo al seleccionar la característica :

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

0 votos

Hola simo, necesito que el evento clic sea llamado sólo cuando se haga clic en la capa vectorial o característica que me interesa. Creo que el ejemplo anterior captura y llama al manejador del evento click en todo el mapa y no solo en las capas vectoriales. Gracias, Vish

0 votos

@Vish : en ese caso, vea la respuesta de Tim Schaub y mi edición anterior.

0 votos

Hey simo, ¿de dónde viene la 'e' en el método getCoordinates?

9voto

Ant Puntos 121

La API no proporcionan una forma para obtener la ubicación del clic de la SelectFeature de control - pero debería. Sería trivial adición (a ha xy incluido en el featureselected de eventos). Si usted billete de esto, sería el primer paso para hacer que suceda.

En tanto, usted puede tener acceso a el evento de ratón en la función de controlador utilizado por el SelectFeature de control. Así, usted puede tener un oyente que se ve algo como esto:

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 a la SelectFeature de control y su mapa.

9voto

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

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

3voto

Mike Wills Puntos 6132

Pude obtener el lat lon del evento click usando lo siguiente:

Dentro de la clickFeature manipulador

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

donde selectFeatureReference es la referencia al SelectFeature que has creado.

0 votos

Esto funcionó, pero tuve que eliminar Ext.getCmp("coreRef").parent del código

0voto

Yaakov Ellis Puntos 15470

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

0 votos

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X