OpenLayers. Не работает VectorLayer.getFeatureFromEvent(evt)

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
vdann
Новоприбывший
Сообщения: 2
Зарегистрирован: 10 июл 2013, 17:24
Репутация: 0

OpenLayers. Не работает VectorLayer.getFeatureFromEvent(evt)

Сообщение vdann » 10 июл 2013, 17:41

Создаю несколько векторных слоев, помещаю их на карту, переопределяю обработчик щелчка мышью, хочу получить точечный объект при срабатывании обработчика.
Код обработчика:

Код: Выделить всё

(function (map) {
	OLC.Click = OL.Class(OLC, {
		defaultHandlerOptions: {
			'single': true,
			'double': false,
			'pixelTolerance': 1,
			'stopSingle': false,
			'stopDouble': false
		},

		initialize: function (options) {
			this.handlerOptions = OL.Util.extend(
				{}, this.defaultHandlerOptions);

			OLC.prototype.initialize.apply(
				this, arguments);

			this.handler = new OL.Handler.Click(
				this,
				{ 'click': this.trigger },
				this.handlerOptions
			);
		},

		trigger: function (evt) {
			//		evt = event || window.event;
			var lonlat = m_map.getLonLatFromViewPortPx(evt.xy),
				ll = m_map.getLayersByClass(OL.Layer.Vector.prototype.CLASS_NAME),
				l = null,
				f = null,
				i = 0,
				n = ll.length;

			for (; i < n; ++i) {
				f = ll[i].getFeatureFromEvent(evt);
				if (f != null
					&& f.geometry.CLASS_NAME === OL.Geometry.Point.prototype.CLASS_NAME) {
					//changeSelect(ll[i], f, tooViewer.callbackGetId(f));
					// RESULT: получение необходимых объектов
					return;
				}
			}

		}); // end OLC.Click

	/** Создаем, добавляем в карту и активируем клик мыши */
	var click = new OLC.Click();
	map.addControl(click);
	click.activate();
} (m_map));
А дальше я попадаю к комментарию RESULT только когда щелкаю мышью по объектам верхнего слоя,
более того такая проблема во всех браузерах кроме IE8, в нем работает корректно.

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: OpenLayers. Не работает VectorLayer.getFeatureFromEvent(

Сообщение bim2010 » 10 июл 2013, 18:11

Chrome и FF не работают .Click. Им требуется onmousedown.
if (show_c.addEventListener) { //Если TRUE значит браузер не IE
show_c.onmousedown = function() {show_comm(id);}; // Назначение onclcik для Chrome и FF
} else {
show_c.onclick=function() {show_comm(id);}; //Назначение onclcik для IE
}

vdann
Новоприбывший
Сообщения: 2
Зарегистрирован: 10 июл 2013, 17:24
Репутация: 0

Re: OpenLayers. Не работает VectorLayer.getFeatureFromEvent(

Сообщение vdann » 11 июл 2013, 00:34

Собственно само события щелчка срабатывает, не корректно работает метод векторного слоя getFeatureFromEvent(evt).
Он возвращает векторный объект в слое над которым произошло событие.
Завтра пример напишу, выложу.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Не работает VectorLayer.getFeatureFromEvent(

Сообщение Denis Rykov » 11 июл 2013, 12:26

Для таких случаев есть вспомогательный тип слоя OpenLayers.Layer.Vector.RootContainer:
A special layer type to combine multiple vector layers inside a single renderer root container. This class is not supposed to be instantiated from user space, it is a helper class for controls that require event processing for multiple vector layers.
В качестве примера я написал простой контрол, который по клику выводит в консоль имя слоя по фиче которого был выполнен клик:

Код: Выделить всё

var ClickControl = OpenLayers.Class(OpenLayers.Control, {

initialize: function(options) {
OpenLayers.Control.prototype.initialize.apply(this, [options]);
this.handler = new OpenLayers.Handler.Click(this, {
click: this.clickCallback
});
// Формируем единый контейнер рендерера
this.layer = new OpenLayers.Layer.Vector.RootContainer('container', {layers: options.layers});
},

// Выводим в консоль имя слоя к которому принадлежит фича
clickCallback: function (evt) {
console.log(this.layer.getFeatureFromEvent(evt).layer.name);
},

// Добавляем слой OpenLayers.Layer.Vector.RootContainer на карту
activate: function () {
if (!this.active) {
this.map.addLayer(this.layer);
}
return OpenLayers.Control.prototype.activate.apply(this, arguments);
},

// Удаляем слой OpenLayers.Layer.Vector.RootContainer с карты
deactivate: function () {
if (this.active) {
this.map.removeLayer(this.layer);
}
return OpenLayers.Control.prototype.deactivate.apply(this, arguments);
}
});


LIVE DEMO
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Не работает VectorLayer.getFeatureFromEvent(

Сообщение Denis Rykov » 13 июл 2013, 05:24

Ну как, получилось?
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость