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

OpenLayers: Сложное правило кластеризации

Добавлено: 10 июл 2013, 16:59
J_Mnemonic
Добрый вечер всем!
Подскажите пожалуйста. Возможно ли сделать сложное правило кластеризации?
Опишу исходную ситуацию:
Есть карта OL: OSM. На карте около 100 маркеров-кластеров. Графически кластеры выглядят как круги диаметром 10px. В данный момент стратегия у меня настроена на расстояние между объектами (distance: 800) и на аттрибут маркера - group
тоесть, все объекты с одной группой на расстоянии друг от друга в 800px группируются в кластер. но из за того, что некоторые кластеры очень близко друг с другом находятся (ближе чем 10px), происходит наложение их друг на друга - что не есть гуд.
Вот можно ли как то реализовать такое правило, чтоб если объекты друг от друга ближе чем 10 px , они объединялись тоже в кластер (не смотря на разные группы). но ТОЛЬКО те, которые ближе 10px, для остальных чтоб действовало старое правило (distance: 800 и аттрибут - group)
я пытался взять за основу (скелет) пример Пример кластеризации но не могу сообразить как такое rule сделать...

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

                // clazz smaller than 4
                strategies.push(new OpenLayers.Strategy.RuleCluster({
                    rule: new OpenLayers.Rule({
                        filter: new OpenLayers.Filter.Comparison({
                            type: OpenLayers.Filter.Comparison.LESS_THAN,
                            property: "clazz",
                            value: 4
                        })
                    })
                }));
тоесть в примере как я понимаю правило такое - если свойство clazz меньше чем 4, объеденить в кластер.
мне получается нужно в условие сравнивать дистанцию, + группу. И плюс одновременно чтоб работало правило группировки по атрибуту "группа" и дистанс 800.
Тоесть число логически это должно быть примерно так:
Делать кластер
ЕСЛИ:
(группа одинаковая и расстояние не больше 800 px)
ИЛИ
(расстояние меньше 10 px)

Re: OpenLayers: Сложное правило кластеризации

Добавлено: 11 июл 2013, 06:42
Denis Rykov
Не проверял, но по аналогии можно написать так:

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

OpenLayers.Strategy.AttributeCluster = OpenLayers.Class(OpenLayers.Strategy.Cluster, {

attribute: null,

thresholdDistance: null,

shouldCluster: function(cluster, feature) {
var cc_attrval = cluster.cluster[0].attributes[this.attribute];
var fc_attrval = feature.attributes[this.attribute];
var superProto = OpenLayers.Strategy.Cluster.prototype;
return cc_attrval === fc_attrval && superProto.shouldCluster.apply(this, arguments) || superProto.shouldCluster.apply({'distance': this.thresholdDistance, 'resolution': this.resolution}, arguments)
},
CLASS_NAME: "OpenLayers.Strategy.AttributeCluster"
});

После чего в вашем случае стратегия может быть определена следующим образом:

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

var cluster = new OpenLayers.Strategy.AttributeCluster({
'distance': 800,
'thresholdDistance': 10,
'attribute': 'group'
});

Re: OpenLayers: Сложное правило кластеризации

Добавлено: 11 июл 2013, 08:30
J_Mnemonic
Спасибо, Денис, но не помогло :(
Маркеры по прежнему налезают друг на друга и не сливаются.

Re: OpenLayers: Сложное правило кластеризации

Добавлено: 11 июл 2013, 08:31
Denis Rykov
Я немного подправил код (передал resolution в apply), попробуйте еще раз. Если не поможет, будем дальше смотреть.

Re: OpenLayers: Сложное правило кластеризации

Добавлено: 11 июл 2013, 09:04
J_Mnemonic
Денис, как всегда выручил! Спасибо ОГРОМНОЕ! :) Работает.

Re: OpenLayers: Сложное правило кластеризации

Добавлено: 16 июл 2013, 00:20
J_Mnemonic
Денис, Вы не поможете мне снова? :) В этом правиле вылезла такая брешь - один из маркеров, находящийся поодаль от своих собратьев по группе (group), но при этом находящийся рядом с другой группой, залез в кластер к чужим. Хотя по идее (по постановке), кластеризация по группе должна быть в приоритете, и только уже если одна группа, полностью укомплектованная своими одногруппниками, рядом с другой группой (меньше чем на 10 px), то тогда они должны сливаться в один кластер.
надеюсь смог объяснить внятно.
Очень надеюсь на Вашу помощь...

Re: OpenLayers: Сложное правило кластеризации

Добавлено: 17 июл 2013, 05:25
Denis Rykov
В том варианте, что я написал нет никакого приоритета группы. То есть работает все это следующим образом: берется точка и последовательно проверяется необходимость ее отнесения к тому или иному кластеру - если атрибут совпадает с атрибутом кластера или точка расположена ближе расстояния thresholdDistance, то она относится в кластер.

Re: OpenLayers: Сложное правило кластеризации

Добавлено: 17 июл 2013, 10:41
J_Mnemonic
Да, я это уже понял. А нельзя сделать такое правило как я описал? (последним)

хотя что то мне подсказывает - нельзя... :(

Re: OpenLayers: Сложное правило кластеризации

Добавлено: 18 июл 2013, 10:39
J_Mnemonic
А подскажите пожалуйста. Допустим у меня есть два маркера. с разным аттрибутом "group". и они объеденились в кластер. Как мне при клике на этот кластер получить "group" обоих (возможно и больше)?


P.S. извините - тупанул )) понял как