Como obtenho as coordenadas de um clique no recurso / camada vetorial no OpenLayers?

15

Preciso obter a coordenada do clique quando o usuário clica em um recurso de vetor no mapa OpenLayers. O SelectControl fornece apenas o recurso que foi clicado e não as coordenadas do clique. Enfim, para obter as coordenadas do clique em um vetor? Preciso mostrar AnchoredBubble no ponto do clique do usuário.

Vish
fonte

Respostas:

16

Na verdade, a amostra do evento click fornece o que você deseja.

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 necessário, você pode converter coordenadas em pixels para exibir o pop-up.

Editar - para obter coordenadas apenas na seleção do recurso :

   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
fonte
Oi Simo, preciso que o evento click seja chamado apenas ao clicar na camada ou recurso vetorial em que estou interessado. Acho que a amostra acima captura e chama o manipulador de eventos click em todo o mapa e não apenas nas camadas vetoriais. Obrigado, Vish
Vish
@Vish: nesse caso, veja a resposta de Tim Schaub e minha edição acima.
simo
Ei, sim, de onde vem o 'e' no método getCoordinates?
Vish
e é o evento . Eu o adicionei à declaração da função getCoordinates (e) . Tenho certeza de que você pode aprovar o recurso, mas não tenho certeza sobre o evento. Faça um teste.
simo
@simo, ele diz que o onSelect deve esperar ser chamado com um recurso, não um evento: dev.openlayers.org/docs/files/OpenLayers/Control/…
Chris
6

A API não fornece uma maneira de obter o local do clique no SelectFeaturecontrole - mas deve. Seria uma adição trivial (ter xyincluído no featureselectedevento). Se você multar isso, seria o primeiro passo para que isso aconteça.

Enquanto isso, você pode acessar o evento do mouse no manipulador de recursos usado pelo SelectFeaturecontrole. Portanto, você pode ter um ouvinte parecido com isto:

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

Isso pressupõe (obviamente) que você tenha uma referência ao SelectFeaturecontrole e ao seu mapa.

Tim Schaub
fonte
3

Consegui obter a latitude do evento click usando o seguinte:

Dentro do clickFeaturemanipulador

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

Onde selectFeatureReferenceestá a referência à SelectFeatureque você criou.

Chris
fonte
Isso funcionou, mas eu tinha que remover Ext.getCmp ( "coreRef") dos pais a partir do código.
Matthew Bloqueio
3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

Foi assim que descobri na v3.8.2 para obter coordenadas como a seguir:
[-1.1645507812500016, 53.2257684357902]
quando clico no Reino Unido.

Khandaniel
fonte
Esta é a maneira mais simples e fácil. Pode confirmar que também funciona com a v5.3.
Raidok
0

Você pode usar feature.getBounds().getCenterLonLat(). Funciona para recursos do tipo ponto / linha / polígono. E você não precisa saber o que é, pois funciona para todos.

Vadim
fonte
Oi Vadim, preciso da coordenada do clique, pois quero ancorar minha bolha lá e não no centro. Obrigado,
Vish
0

Caso alguém se depare com essa pergunta antiga como eu, na versão mais recente do OpenLayers neste momento (3.20.0), você pode obter a posição clicada usando e.mapBrowserEvent.coordinateonde eestá o evento Selecionar.

Adam Franco
fonte