Страница 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 используется не по ссылке, а по значению. И при изменении нужно повторно менять в протоколе. Как то так:
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 но не могу до конца понять как это работает...
Как я понял, чтобы рефрешнуть стретегию, нужно добавить в 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 свой?
всё. понял. То есть создания нового класса не избежать...