Страница 1 из 2

OpenLayers.Strategy.Refresh

Добавлено: 10 мар 2011, 09:14
posmotret
Здравствуйте!

Задача: нужно отобразить на карте точку которая будет двигаться, не перезагружая страницу. пример: http://bus62.ru но там на флеше.
Делаю так:

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

lay_vector = new OpenLayers.Layer.Vector("Маршрутки",{strategies: [new OpenLayers.Strategy.Refresh({interval: 1000})]});
		OpenLayers.Request.GET({
			url: 'http://localhost/example/test/test.kml',
			success: function(e) {
			doc = e.responseText;
			parser = new OpenLayers.Format.KML({
				'internalProjection': new OpenLayers.Projection("EPSG:900913"),
				'externalProjection': new OpenLayers.Projection("EPSG:4326")
			});
			lay_vector.addFeatures(parser.read(doc));
		}
		});
		map.addLayer(lay_vector);
Точка отображается, но изменяет свое положение только после обновления страницы в браузере. Почему ?

еще пробовал вот так:

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

var tr = new OpenLayers.Layer.Vector("Маршрутки", {
                projection: mercator,
                strategies: [new OpenLayers.Strategy.Refresh({interval:1000})],
                protocol: new OpenLayers.Protocol.HTTP({
                    url: 'http://localhost/example/test/test.kml',
                    format: new OpenLayers.Format.KML({
				'internalProjection': new OpenLayers.Projection("EPSG:900913"),
				'externalProjection': new OpenLayers.Projection("EPSG:4326")
			})
                })
            });
		map.addLayer(tr);
Точка не отображается вообще

Re: OpenLayers.Strategy.Refresh

Добавлено: 10 мар 2011, 09:50
Denis Rykov
Второй вариант правильный, только вы забыли в массиве стратегий указать стратегию для загрузки данных, например Fixed или BBOX:

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

strategies: [new OpenLayers.Strategy.Refresh({interval:10000}), new OpenLayers.Strategy.Fixed()]

Re: OpenLayers.Strategy.Refresh

Добавлено: 10 мар 2011, 09:56
posmotret
ааааа оно движется!!)))

DR спасибо

Re: OpenLayers.Strategy.Refresh

Добавлено: 20 июл 2011, 09:58
San
Уважаемые, а посмотрите мой случай...

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

markers = new OpenLayers.Layer.Vector("Markers", {
					projection: map.displayProjection,
					strategies: [
						new OpenLayers.Strategy.Refresh({force: true, interval:10000}),
						new OpenLayers.Strategy.BBOX({resFactor: 1.1})
					],
					protocol: new OpenLayers.Protocol.HTTP({
						url: "markers.php",
						format: new OpenLayers.Format.Text(),
						params: {
							'delta': delta,
							'cache': Math.random( new Date().getTime() )
						}
					})
				});
				map.addLayer(markers);
Сложность в том, что в скрипте markers.php мне нужен параметр delta. А на web-сервер приходят начальные значения (при каждом обновлении) delta и cache :

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

"GET /markers.php?delta=0&cache=0.7394038223293401[?box=25.299058876492,41.04154898644,42.750941114036,47.798025199912 HTTP/1.1"

Re: OpenLayers.Strategy.Refresh

Добавлено: 20 июл 2011, 10:35
Mavka
В приведенном коде переменная delta используется не по ссылке, а по значению. И при изменении нужно повторно менять в протоколе. Как то так:

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

markers.protocol.params['delta'] = delta; 

Re: OpenLayers.Strategy.Refresh

Добавлено: 20 июл 2011, 13:14
San
Ага, понял.
Всё именно так, как Вы и сказали.

СПАСИБО!

Вот что получилось в итоге: http://blacksea.sytes.net/ - показываю кораблики рядом с Севастополем.

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 11:06
J_Mnemonic
А можно немного освежить эту тему своим вопросом?
У меня такая ситуация (одна из... :)) :
Есть механизм фильтрации, который влияет на отображение на карте объектов по их аттрибутам.
И если после применения фильтра, мне нужно убрать или добавить маркеры на карту и пересчитать кластеры (динамически), можно ли менять visible маркеров и повлияет ли это на кластеризацию?

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 12:30
Denis Rykov
Может стоит сначала попробовать?

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 12:40
J_Mnemonic
Да, как раз собирался, но сначала нужно решить другую проблему, которая упирается как раз в рефреш стратегии...
я пытаюсь новую стратегию применить (с которой Вы мне помогли) только на самом верхнем уровне zoom.

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

map.events.register("zoomend", map, function (e) {
                var strategies = [];
                if (map.getZoom() !== 3) {
                    markersLayer.strategies = new OpenLayers.Strategy.Cluster({ distance: 20 });
                } else {
                    markersLayer.strategies = new OpenLayers.Strategy.AttributeCluster({
                        'attribute': 'group',
                        'distance': 800,
                        'thresholdDistance': 10
                    });
                }
                markersLayer.removeFeatures(markersLayer.features);
                markersLayer.addFeatures(features);
Читал про Strategy.Refresh но не могу до конца понять как это работает... :oops:
Как я понял, чтобы рефрешнуть стретегию, нужно добавить в markersLayer.strategies ещё добавить что то типа:
(взял из образца выше)

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

new OpenLayers.Strategy.Refresh({force: true, interval:10000}),
new OpenLayers.Strategy.BBOX({resFactor: 1.1})
Но мне не нужно чтобы она по интервалу рефрешилась...
Не могли бы Вы, пожалуйста, объяснить в нескольких словах основные принципы работы рефреша? Видимо мой инглиш не позволяет мне до конца понять принцип работы

P.S. вообще читал что есть у слоя метод redraw, но он почему то не работает...

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 13:09
Denis Rykov
Если не нужно обновлять слой по таймеру, значит стратегия Refresh вам не нужна.

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 13:12
J_Mnemonic
:( а не подскажете что мне нужно в моём случае?
пересоздавать весь слой?

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 13:19
Denis Rykov
Посмотрите здесь, там немного переопределен метод cluster и добавлен метод recluster. Diff с примерами можно посмотреть здесь.

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 13:22
J_Mnemonic
да, я видел этот пост :) но подумал, может есть штатный а главное более простой способ... (это я про recluster)
второй щас гляну, спасибо

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 13:25
Denis Rykov
В этом случае просто вызывайте метод cluster вручную.

Re: OpenLayers.Strategy.Refresh

Добавлено: 11 июл 2013, 13:30
J_Mnemonic
я только не совсем понял, где прописывается код, указанный в секции "lib/OpenLayers/Strategy/Cluster.js"...

это нужно править какую то штатную библиотеку или это нужно создать js свой?

всё. понял. То есть создания нового класса не избежать...