OpenLayers.Strategy.Refresh

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers.Strategy.Refresh

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

Создал JS на основании указанного Вами решения.
Подключил файл к проекту и странице.
делаю так:

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

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

-----------
что то странное вообще... как только начинаю листать и смотреть созданный JS файл, VS2010 насмерть зависает... именно с этим файлом.. хм...
----------
Заменил стандартный класс новым (прям в OpenLayers.js). Метод recluster вызывется - проверил это поместив алерт в сам метод в классе - результата 0 :(
может быть я не правильно присваиваю стратегию?
сделал так, но тоже не работает:

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

map.events.register("zoomend", map, function (e) {
    var strategies = [];
    if (map.getZoom() !== 3) {
        strategies.push(new OpenLayers.Strategy.Cluster({ distance: 20 }));
    } else {
        strategies.push(new OpenLayers.Strategy.AttributeCluster({
            'attribute': 'group',
            'distance': 800,
            'thresholdDistance': 10
        }));
    }
    markersLayer.strategies = strategies;
    strategies.recluster();
});

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

Re: OpenLayers.Strategy.Refresh

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

похоже recluster() не работает... иначе я не понимаю.
при помощи алерта вездесущего убедился что при зуме стратегия меняется (дистанция то 20 то 800)

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

var clustering;
if (map.getZoom() > 3) {
    clustering = new OpenLayers.Strategy.Cluster({ distance: 20 });
} else {
    clustering = new OpenLayers.Strategy.AttributeCluster({
        'attribute': 'group',
        distance: 800,
        'thresholdDistance': 10
    });
}
markersLayer.strategies = clustering;
alert(markersLayer.strategies.distance);
clustering.recluster();

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

Re: OpenLayers.Strategy.Refresh

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

Все нормально с recluster-ом. Вот написал небольшую демку, убедитесь в том, что он работает. Сначала на пустом фоне будут появляться алерты, вы их просто прощелкайте, затем, когда приложение загрузится сверху нажмите кнопку Run, снова на вас повалятся алерты - жмите OK и параллельно следите за картой.
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, 22:23

Подобный пример я видел в другом месте. Где меняют дистанцию. И там было даже без recluster. Может быть дело в том что Вы меняете только один аттрибут, а я меняю полностью тип стратегии?

Можете поменять в примере не дистанцию а тип стратегии? как у меня?

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

Re: OpenLayers.Strategy.Refresh

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

А лучше ещё повесить это на zoomend :) может быть дело где то там? Может я не правильно стратегию вешаю. хотя...

map.events.register("zoomend", map, function (e) {
var clustering;
if (map.getZoom() > 3) {
clustering = new OpenLayers.Strategy.Cluster({ distance: 20 });
} else {
clustering = new OpenLayers.Strategy.AttributeCluster({
'attribute': 'group',
distance: 800,
'thresholdDistance': 10
});
}
}
markersLayer.strategies = strategies;
strategies.recluster();
});

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

Re: OpenLayers.Strategy.Refresh

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

Стратегии в OpenLayers не рассчитаны на добавление к слою после его инициализации, конечно можно выкрутиться, но это будет большой костыль. Я бы на вашем месте создал 2 одинаковых слоя, но с разными стратегиями и при смене масштабного уровня просто менял бы видимость этих слоев.
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 » 12 июл 2013, 08:27

Дело в том, что у меня на слое завязано много логики, поэтому тогда придётся и дублировать её..
пришлось сделать такой костыль. вроде работает. Но спасибо за участие :)

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

            map.events.register("zoomend", map, function (e) {
                var clustering = [];
                if (map.getZoom() > 3) {
                    clustering.push(new OpenLayers.Strategy.Cluster({ distance: 20 }));
                } else {
                    clustering.push(new OpenLayers.Strategy.AttributeCluster({
                        'attribute': 'group',
                        distance: 800,
                        'thresholdDistance': 10
                    }));
                }
                map.removeLayer(markersLayer);
                markersLayer = new OpenLayers.Layer.Vector("Markers", { styleMap: stylemap, strategies: clustering });
                map.addLayer(markersLayer);
                markersLayer.addFeatures(features);

                selectControl = new OpenLayers.Control.SelectFeature(markersLayer,
                { onSelect: onFeatureSelect, onUnselect: onFeatureUnselect });
                map.addControl(selectControl);
                selectControl.activate();
            });

Ответить

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

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

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