Как получить координаты щелчка по векторному объекту / слою в OpenLayers?

15

Мне нужно получить координату клика, когда пользователь нажимает на векторный объект на карте OpenLayers. SelectControl предоставляет только функцию, которая была нажата, а не координаты щелчка. В любом случае, чтобы получить в координаты клика по вектору? Мне нужно показать AnchoredBubble в точке щелчка пользователя.

Вишь
источник

Ответы:

16

На самом деле, пример события click дает вам то, что вы хотите.

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");
}
Симо
источник
Привет, симо, мне нужно, чтобы событие click вызывалось только при нажатии на векторный слой или интересующую меня функцию. Я думаю, что в приведенном выше примере захватывается и вызывается обработчик события click на всей карте, а не только на векторных слоях. Спасибо, Виш
Виш
@Vish: в этом случае, см. Ответ Тима Шауба и мое редактирование выше.
Симо
Эй, симо, откуда взято 'e' в методе getCoordinates?
Виш
е это событие . Я добавил это в объявление функции getCoordinates (e) . Я уверен, что вы можете передать функцию, но я не уверен насчет события. Сделайте тест.
Симо
@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

Я смог получить информацию о событии click, используя следующее:

Внутри 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"). Parent из кода
Мэтью Локк
3
map.on('click', function(evt){
    console.log(ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'));
});

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

khandaniel
источник
Это самый простой и легкий способ. Можно подтвердить, что это также работает с v5.3.
Райдок
0

Вы можете использовать feature.getBounds().getCenterLonLat(). Работает для объектов типа точка / линия / полигон. И вам не нужно знать, что это такое, поскольку это работает для всех.

Вадим
источник
Привет Вадим, мне нужна координата щелчка, так как я хочу закрепить свой пузырь там, а не в центре. Спасибо,
Виш
0

В случае, если кто-нибудь наткнется на этот старый вопрос, как я, в последнем выпуске OpenLayers в это время (3.20.0) вы можете получить позицию, по e.mapBrowserEvent.coordinateкоторой щелкнули, с помощью где eнаходится событие Select.

Адам Франко
источник