Jak uzyskać współrzędne kliknięcia elementu / warstwy wektorowej w OpenLayers?

15

Muszę uzyskać współrzędną kliknięcia, gdy użytkownik kliknie element wektorowy na mapie OpenLayers. SelectControl podaje tylko funkcję, która została kliknięta, a nie współrzędne kliknięcia. W każdym razie, aby uzyskać współrzędne kliknięcia wektora? Muszę pokazać AnchoredBubble w momencie kliknięcia przez użytkownika.

Vish
źródło

Odpowiedzi:

16

W rzeczywistości próbka zdarzenia kliknięcia daje Ci to, czego chcesz.

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

        });

W razie potrzeby możesz przekonwertować współrzędne na piksele, aby wyświetlić wyskakujące okienko.

Edytuj - aby uzyskać współrzędne tylko po wybraniu obiektu :

   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
źródło
Cześć, potrzebuję wywołania zdarzenia kliknięcia tylko po kliknięciu warstwy wektorowej lub funkcji, która mnie interesuje. Myślę, że powyższa próbka przechwytuje i wywołuje moduł obsługi zdarzenia kliknięcia na całej mapie, a nie tylko na warstwach wektorowych. Dziękuję, Vish
Vish
@ Vish: w takim przypadku zobacz odpowiedź Tima Schauba i moją edycję powyżej.
simo
Hej simo, skąd pochodzi „e” w metodzie getCoordinates?
Vish,
e jest wydarzeniem . Dodałem go do deklaracji funkcji getCoordinates (e) . Jestem pewien, że możesz przekazać tę funkcję, ale nie jestem pewien tego wydarzenia. Zrób test.
simo
@simo, mówi, że onSelect powinien spodziewać się, że zostanie wywołany z funkcją, a nie zdarzeniem: dev.openlayers.org/docs/files/OpenLayers/Control/…
Chris
6

Interfejs API nie zapewnia sposobu uzyskania lokalizacji kliknięcia z SelectFeaturekontrolki - ale powinien. Byłby to trywialny dodatek (do xyuwzględnienia w featureselectedwydarzeniu). Jeśli to zrobisz, będzie to pierwszy krok do tego, aby tak się stało.

W międzyczasie możesz uzyskać dostęp do zdarzenia myszy w module obsługi funkcji używanym przez SelectFeaturekontrolkę. Możesz mieć słuchacza, który wygląda mniej więcej tak:

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

Zakłada się (oczywiście), że masz odniesienie do SelectFeaturekontrolki i mapy.

Tim Schaub
źródło
3

Udało mi się uzyskać lat lon zdarzenia kliknięcia, wykonując następujące czynności:

Wewnątrz clickFeatureobsługi

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

gdzie selectFeatureReferencejest odniesienie do SelectFeatureutworzonego przez Ciebie.

Chris
źródło
To działało, ale musiałem usunąć Ext.getCmp („coreRef”). Rodzic z kodu
Matthew Lock
3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

Właśnie tak to wymyśliłem w wersji 3.2.2, aby uzyskać współrzędne w następujący sposób:
[-1.1645507812500016, 53.2257684357902]
kiedy klikam w Wielkiej Brytanii.

Khandaniel
źródło
To jest najprostszy i najłatwiejszy sposób. Potwierdza, że ​​działa również z wersją 5.3.
Raidok
0

Możesz użyć feature.getBounds().getCenterLonLat(). Działa dla funkcji typu punkt / linia / wielokąt. I nie musisz wiedzieć, co to jest, ponieważ działa dla wszystkich.

Vadim
źródło
Cześć Vadim, potrzebuję współrzędnej kliknięcia, ponieważ chcę zakotwiczyć moją bańkę tam, a nie w środku. Dziękuję,
Vish
0

W przypadku, gdy ktoś natknie się na to stare pytanie, tak jak ja, w najnowszej wersji OpenLayers w tym czasie (3.20.0) możesz uzyskać pozycję kliknięcia, używając e.mapBrowserEvent.coordinategdzie ejest zdarzenie Select.

Adam Franco
źródło