Як отримати координати клацання на векторну функцію / шар у OpenLayers?


15

Мені потрібно отримати координату клацання, коли користувач натискає на векторну функцію на карті OpenLayers. SelectControl надає лише ту функцію, яку натиснули, а не координати клацання. У будь-якому випадку, щоб потрапити на координати клацання вектора? Мені потрібно показати AnchoredBubble у точці клацання користувача.

Відповіді:


16

Насправді, зразок події клацання дає вам те, що ви хочете.

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

        });

Якщо потрібно, ви можете перетворити координати в пікселі, щоб відобразити спливаюче вікно.

Редагувати - щоб отримати координати лише для вибору функції :

   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, мені потрібно викликати подію натискання лише при натисканні на векторний шар або функцію, яка мене цікавить. Я думаю, що приклад вище захоплює та викликає обробник подій клацання на всій карті, а не лише на векторних шарах. Дякую, Виш
Vish

@Vish: у такому випадку див. Відповідь Тіма Шауба та мою редакцію вище.
simo

Здравствуйте, simo, звідки походить 'e' у методі getCoordinate?
Виш

е подія . Я додав його до декларації функції getCoordinate (e) . Я впевнений, що ти зможеш передати цю функцію, але я не впевнений у події. Зробіть тест.
simo

@simo, в ньому йдеться про те, що на OnSelect слід очікувати виклику з функцією, а не подією: dev.openlayers.org/docs/files/OpenLayers/Control/…
Кріс

6

API не забезпечує способу отримати місце SelectFeatureкерування від елемента управління, але це повинно. Це було б тривіальним доповненням ( xyвключити участь у featureselectedзаході). Якщо ви придбаєте цей квиток, це був би перший крок у його здійсненні.

Тим часом ви можете отримати доступ до події миші на обробці функцій, який використовується елементом SelectFeatureуправління. Отже, у вас може бути слухач, який виглядає приблизно так:

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

Це передбачає (очевидно), що ви маєте посилання на SelectFeatureелемент управління та свою карту.


3

Мені вдалося отримати Lat lon події натискання, використовуючи наступне:

Всередині clickFeatureобробника

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

де selectFeatureReferenceпосилання на SelectFeatureстворене вами.


Це спрацювало, але мені довелося видалити Ext.getCmp ("coreRef"). Батьків з коду
Matthew Lock

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

Ось як я зрозумів це в v3.8.2, щоб отримати координати на зразок наступного:
[-1.1645507812500016, 53.2257684357902]
коли я натискаю Великобританію.


Це найпростіший і найпростіший спосіб. Можна підтвердити, що він також працює з v5.3.
Райдок

0

Можна використовувати feature.getBounds().getCenterLonLat(). Працює для особливостей типу «точка / лінія / полігон». І не потрібно знати, що це таке, адже це працює для всіх.


Привіт Вадиме, мені потрібна координата клацання, оскільки я хочу прив’язати міхур там, а не в центрі. Дякую,
Виш

0

Якщо хтось наткнеться на це старе питання, як я, в останньому випуску OpenLayers цього часу (3.20.0) ви можете отримати натиснуту позицію, використовуючи e.mapBrowserEvent.coordinateмісце eподії Select.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.