OpenLayers.Strategy.Refresh

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
posmotret
Новоприбывший
Сообщения: 11
Зарегистрирован: 02 мар 2011, 16:06
Репутация: 0

OpenLayers.Strategy.Refresh

Сообщение posmotret » 10 мар 2011, 09:14

Здравствуйте!

Задача: нужно отобразить на карте точку которая будет двигаться, не перезагружая страницу. пример: 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);
Точка не отображается вообще

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

Re: OpenLayers.Strategy.Refresh

Сообщение Denis Rykov » 10 мар 2011, 09:50

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

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

strategies: [new OpenLayers.Strategy.Refresh({interval:10000}), new OpenLayers.Strategy.Fixed()]
Spatial is now, more than ever, just another column- The Geometry Column.

posmotret
Новоприбывший
Сообщения: 11
Зарегистрирован: 02 мар 2011, 16:06
Репутация: 0

Re: OpenLayers.Strategy.Refresh

Сообщение posmotret » 10 мар 2011, 09:56

ааааа оно движется!!)))

DR спасибо

San
Новоприбывший
Сообщения: 8
Зарегистрирован: 31 май 2011, 20:38
Репутация: 0

Re: OpenLayers.Strategy.Refresh

Сообщение San » 20 июл 2011, 09:58

Уважаемые, а посмотрите мой случай...

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

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"

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers.Strategy.Refresh

Сообщение Mavka » 20 июл 2011, 10:35

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

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

markers.protocol.params['delta'] = delta; 
лангольеры под окном жрали время ом-ном-ном

San
Новоприбывший
Сообщения: 8
Зарегистрирован: 31 май 2011, 20:38
Репутация: 0

Re: OpenLayers.Strategy.Refresh

Сообщение San » 20 июл 2011, 13:14

Ага, понял.
Всё именно так, как Вы и сказали.

СПАСИБО!

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

J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers.Strategy.Refresh

Сообщение J_Mnemonic » 11 июл 2013, 11:06

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

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

Re: OpenLayers.Strategy.Refresh

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

Может стоит сначала попробовать?
Spatial is now, more than ever, just another column- The Geometry Column.

J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers.Strategy.Refresh

Сообщение J_Mnemonic » 11 июл 2013, 12:40

Да, как раз собирался, но сначала нужно решить другую проблему, которая упирается как раз в рефреш стратегии...
я пытаюсь новую стратегию применить (с которой Вы мне помогли) только на самом верхнем уровне 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, но он почему то не работает...

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

Re: OpenLayers.Strategy.Refresh

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

Если не нужно обновлять слой по таймеру, значит стратегия Refresh вам не нужна.
Spatial is now, more than ever, just another column- The Geometry Column.

J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers.Strategy.Refresh

Сообщение J_Mnemonic » 11 июл 2013, 13:12

:( а не подскажете что мне нужно в моём случае?
пересоздавать весь слой?

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

Re: OpenLayers.Strategy.Refresh

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

Посмотрите здесь, там немного переопределен метод cluster и добавлен метод recluster. Diff с примерами можно посмотреть здесь.
Spatial is now, more than ever, just another column- The Geometry Column.

J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers.Strategy.Refresh

Сообщение J_Mnemonic » 11 июл 2013, 13:22

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

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

Re: OpenLayers.Strategy.Refresh

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

В этом случае просто вызывайте метод cluster вручную.
Spatial is now, more than ever, just another column- The Geometry Column.

J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers.Strategy.Refresh

Сообщение J_Mnemonic » 11 июл 2013, 13:30

я только не совсем понял, где прописывается код, указанный в секции "lib/OpenLayers/Strategy/Cluster.js"...

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

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

Ответить

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

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

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