Comment obtenir les coordonnées d'un clic sur une entité / couche vectorielle dans OpenLayers?

15

J'ai besoin d'obtenir les coordonnées du clic lorsque l'utilisateur clique sur une entité vectorielle sur la carte OpenLayers. Le SelectControl ne donne que la fonction sur laquelle vous avez cliqué et non les coordonnées du clic. Quoi qu'il en soit pour obtenir les coordonnées du clic sur un vecteur? J'ai besoin de montrer AnchoredBubble au point du clic de l'utilisateur.

Vish
la source

Réponses:

16

En fait, l' exemple d'événement de clic vous donne ce que vous voulez.

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 nécessaire, vous pouvez convertir les coordonnées en pixels pour afficher la fenêtre contextuelle.

Modifier - pour obtenir les coordonnées uniquement lors de la sélection de l'entité :

   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
la source
Salut simo, j'ai besoin que l'événement click ne soit appelé que lorsque je clique sur la couche vectorielle ou l'entité qui m'intéresse. Je pense que l'exemple ci-dessus capture et appelle le gestionnaire d'événements click sur toute la carte et pas seulement les couches vectorielles. Merci, Vish
Vish
@Vish: dans ce cas, voir la réponse de Tim Schaub et ma modification ci-dessus.
simo
Hé simo, d'où vient le «e» de la méthode getCoordinates?
Vish
e est l' événement . Je l'ai ajouté à la déclaration de la fonction getCoordinates (e) . Je suis sûr que vous pouvez passer la fonctionnalité, mais je ne suis pas sûr de l'événement. Faites un test.
simo
@simo, il est dit que onSelect devrait s'attendre à être appelé avec une fonctionnalité, pas un événement: dev.openlayers.org/docs/files/OpenLayers/Control/…
Chris
6

L'API ne fournit pas un moyen d'obtenir l'emplacement du clic à partir du SelectFeaturecontrôle - mais cela devrait. Ce serait un ajout trivial (à xyinclure dans l' featureselectedévénement). Si vous ajoutez cela, ce serait la première étape pour y arriver.

En attendant, vous pouvez accéder à l'événement de souris sur le gestionnaire de fonctionnalités utilisé par le SelectFeaturecontrôle. Donc, vous pourriez avoir un écouteur qui ressemble à ceci:

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

Cela suppose (évidemment) que vous avez une référence au SelectFeaturecontrôle et à votre carte.

Tim Schaub
la source
3

J'ai pu obtenir le dernier lon de l'événement click en utilisant les éléments suivants:

À l'intérieur du clickFeaturegestionnaire

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

selectFeatureReferenceest la référence au SelectFeatureque vous avez créé.

Chris
la source
Cela a fonctionné, mais j'ai dû supprimer Ext.getCmp ("coreRef"). Parent du code
Matthew Lock
3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

C'est ainsi que je l'ai compris dans la v3.8.2 afin d'obtenir des coordonnées comme celle-ci:
[-1.1645507812500016, 53.2257684357902]
lorsque je clique sur UK.

khandaniel
la source
C'est le moyen le plus simple et le plus simple. Peut confirmer qu'il fonctionne également avec la v5.3.
Raidok
0

Vous pouvez utiliser feature.getBounds().getCenterLonLat(). Fonctionne pour les entités de type point / ligne / polygone. Et vous n'avez pas besoin de savoir ce que c'est, car cela fonctionne pour tous.

Vadim
la source
Salut Vadim, j'ai besoin des coordonnées du clic car je veux y ancrer ma bulle et non au centre. Merci,
Vish
0

Au cas où quelqu'un tomberait sur cette vieille question comme je l'ai fait, dans la dernière version d'OpenLayers à ce moment (3.20.0), vous pouvez obtenir la position cliquée en utilisant e.mapBrowserEvent.coordinateoù se etrouve l'événement Select.

Adam Franco
la source