OpenLayers, хорошая кластеризация маркеров

Знаете ли вы, как создать хорошую кластеризацию в OpenLayers, такую ​​как пример Google ?


person apneadiving    schedule 10.07.2011    source источник
comment
Привет, ты не говоришь о маркерах Openlayer, верно? ( dev.openlayers.org/docs/files/OpenLayers/Marker-js .html )   -  person eMarine    schedule 07.09.2015
comment
@eMarine нет о кластерах маркеров   -  person apneadiving    schedule 07.09.2015


Ответы (6)


Вы можете добавить метку к pointStyle в приведенном выше примере и объяснить контекст этой метки. Ваш код должен быть примерно таким:

var pointStyle = new OpenLayers.Style({
    // ...
    'label': "${label}",
    // ...
  }, {
    context: {
      // ...
      label: function(feature) {
        // clustered features count or blank if feature is not a cluster
        return feature.cluster ? feature.cluster.length : "";  
      }
      // ..
    }
});

var styleMap = new OpenLayers.StyleMap({
  'default': pointStyle,
});

var googleLikeLayer = new OpenLayers.Layer.Vector("GoogleLikeLayer", {
  // ...
  styleMap  : styleMap,
  // ... 
});
person unibasil    schedule 02.08.2012

Используйте OpenLayers.Strategy.Cluster для кластеризации.

person igorti    schedule 10.07.2011
comment
Я его еще не видел, но это далеко не мой пример :) - person apneadiving; 10.07.2011
comment
так чего ты хочешь? у вас есть ответ на ваш вопрос - вы используете стратегию кластеризации и стилизуете ее с теми же изображениями, что и Google! - person igorti; 10.07.2011
comment
В примере, который я привел, представлены кластеры с числами внутри дизайна + они автоматически исчезают, чтобы позволить маркеру появляться, когда это необходимо. - person apneadiving; 10.07.2011

Я только что реализовал так называемую стратегию AnimatedCluster для OpenLayers. Подробнее об этом можно узнать по адресу: http://www.acuriousanimal.com/2012/08/19/animated-marker-cluster-strategy-for-openlayers.html

Это только первая версия, но она добавляет красивую анимацию к кластерам. Есть много вещей, которые нужно улучшить, но это отправная точка.

person EricSonaron    schedule 22.08.2012
comment
Вы не против адаптировать вашу замечательную стратегию AnimatedCluster к последней версии OpenLayers, то есть 2.13+? Я немного протестировал это, но кажется, что есть определенный конфликт в анимации между замедлением кластера и изменением масштаба слоя (они сделали анимацию для этого в последних версиях). Жаль, что в OpenLayers 3 пока нет кластеров, может быть, будет неплохо адаптировать и AnimatedClusters? ;) (кстати, OL3 уже выглядит великолепно). - person unibasil; 21.02.2014
comment
можешь поправить ссылку пожалуйста? - person I.G. Pascual; 15.04.2016
comment
обновлено до acuriousanimal.com/2012/ 19.08.. Спасибо !!! - person EricSonaron; 15.04.2016

В OpenLayers 3 есть отличный пример кластеризации.

Я создал jsFiddle из кода, чтобы вы могли поиграть с ним.

По сути, вам нужно создать ol.source.Cluster с группировка на расстоянии от ol.source.Vector сформированного массивом ol.Feature. Каждый ol.Feature создан из ваших исходных координат в виде ol.geom.Point.

var features = [
  new ol.Feature(new ol.geom.Point([lon1, lat1])),
  new ol.Feature(new ol.geom.Point([lon2, lat2])),
  ...
];

var cluster = new ol.source.Cluster({
  distance: 50,
  source: new ol.source.Vector({ features: features });
});

var map = new ol.Map({
  layers: [
    new ol.source.MapQuest({layer: 'sat'}), // Map
    new ol.layer.Vector({ source: cluster }) // Clusters
  ],
  renderer: 'canvas',
  target: 'map'
});
person I.G. Pascual    schedule 14.04.2016

вы можете сделать это, как сказал Игорь. решение использует класс OpenLayers.Strategy.Cluster и стиль вашего слоя с помощью класса OpenLayers.Style...

для стайлинга:

var pointStyle = new OpenLayers.Style({
'default': new OpenLayers.Style({
'pointRadius': '${radius}',
'externalGraphic': '${getgraph}'
....
},{
context:{
radius: function(feature){
    return Math.min(feature.attributes.count,7)+3;
},{
getgraph : function(feature){
    return 'ol/img/googlelike.png';
}}}};

это должно помочь вам, больше силы для вас!

person Aragon    schedule 13.07.2011
comment
Я боюсь, что на кластеризаторе не будет отображаться количество маркеров. Это все еще не то, что я ищу. - person apneadiving; 13.07.2011

Вот JSfiddle для кластеризации на основе пользовательских атрибутов, добавленных к слоям. Я немного боролся с этим, поэтому разместил его здесь; Также показано создание сводного изображения круговой диаграммы при уменьшении масштаба кластеризованных данных http://jsfiddle.net/alexcpn/518p59k4/

Также создан небольшой учебник по openlayer, чтобы объяснить это Расширенная кластеризация OpenLayers

    var getClusterCount = function (feature) {

    var clustercount = {};
    var planningcount = 0;
    var onaircount = 0;
    var inerrorcount = 0;

    for (var i = 0; i < feature.cluster.length; i++) {

        if (feature.cluster[i].attributes.cluster) {
        //THE MOST IMPORTANT LINE IS THE ONE BELOW, While clustering open layers removes the orginial feature layer with its own. So to get the attributes of the feature you have added add it to the openlayer created feature layer
            feature.attributes.cluster = feature.cluster[i].attributes.cluster;
            switch (feature.cluster[i].attributes.cluster) {

 ......
    return clustercount;
};
person Alex Punnen    schedule 28.03.2013