7 votos

La desactivación de Openlayers Clúster después de un cierto nivel de zoom

Quiero desactivar la estrategia de grupo después de que el nivel de zoom 16. La estrategia de grupo obtiene desactiva y yo también cambiar el estilo de las características originales y volver a dibujar la capa. Pero todavía se necesita los estilos definidos para los clusters en lugar de tomar la nueva definición de estilos.

var test_style = new OpenLayers.Style({
    'fillColor': '#CC66CC',
    'fillOpacity': .8
});
var test_style_map = new OpenLayers.StyleMap({
    'default':test_style
});                  
var test_layer_name=clusterStrategy.layer;
if(zoom_level>16) {
    clusterStrategy.deactivate();
    test_layer_name.styleMap=test_style_map;
    test_layer_name.redraw();
}

1voto

dariapra Puntos 1976

La fuerza bruta y simple solución puede ser la eliminación de la capa en el mapa y, después de eso, la adición de uno nuevo con el mismo nombre que, además, sería usar un estilo diferente del mapa y no cuentan con la estrategia de grupo.

1voto

TM. Puntos 20051

Mirando hacia atrás, veo que su pregunta estaba relacionada con el código que estoy escribiendo.

Intente esto experimental código:

var clusterStrategy = new CustomCluster({
  zoomSettings: [{zoomRange: [17, 99], settings:{enabled: false}}]
});

donde customCluster está:

var CustomCluster = OpenLayers.Class(OpenLayers.Strategy.Cluster, {
    enabled: true,
    zoomSettings: null,
    defaultSettings: null,
    initialize: function() {
        OpenLayers.Strategy.Cluster.prototype.initialize.apply(this, arguments);
        this.defaultSettings = OpenLayers.Util.applyDefaults(
            this.defaultSettings, {
                distance: this.distance,
                threshold: this.threshold,
                enabled: this.enabled
            }
        );
    },
    cacheFeatures: function(event) {
        if (this.clustering) { return; }
        if (this.enabled) {
            return OpenLayers.Strategy.Cluster.prototype
                                          .cacheFeatures.apply(this, arguments);
        } else if (this.features) {
            this.uncluster();
        }
    },
    cluster: function(event) {
        if (event && event.zoomChanged) {
            var zoomSettings = this.zoomSettings,
                zoomLevel = this.layer.map.getZoom();
            OpenLayers.Util.extend(this, this.defaultSettings);
            for (var i=0, len = zoomSettings.length; i<len; i++) {
                var item = zoomSettings[i];
                if (zoomLevel >= item.zoomRange[0] && zoomLevel <= item.zoomRange[1]) {
                    OpenLayers.Util.extend(this, item.settings);
                    break;
                }
            }
        }
        if (this.enabled) {
            if (!this.features) {
                this.features = this.layer.features.slice();
            }
            OpenLayers.Strategy.Cluster.prototype.cluster.apply(this, arguments);
        } else {
            if (this.features) {
                this.uncluster();
            }
        }
    },
    uncluster: function() {
        // Warning: methods that call this function should monitor that `this.features` has value.
        var features = this.features.slice();
        this.clearCache();
        this.clustering = true;
        this.layer.removeAllFeatures();
        this.layer.addFeatures(features);
        this.clustering = false;
    }
});

0voto

Hannesh Puntos 315

Cada característica tiene también una referencia a la capa. Esa capa tiene un stylemap, más probable es que el antiguo. (se puede comprobar en su DOM inspector) Fácil sollution sería la llamada a la

test_layer_name.removeFeatures(test_layer_name.features);

antes de volver a dibujar. De esa manera funciones de agregado con todas las nuevas propiedades de capa. (usted debe comprobar si las características son eliminadas por disabeling la estrategia)

Otra forma sería la de añadir contexto a tu stylemap y comprobar la función.clúster De esa manera usted no tiene que seguir cambiando el stylemaps.

0voto

Hannesh Puntos 315

Yo he venido a través de un problema similar en mi propia. Para mostrar un infowindows para cada unidad en el mapa, tengo algunos problemas si que cuenta estaba en un clúster, así que me acercado a esa característica. Si estas características están muy cerca, todavía podría ser agrupado. Así que yo quería para deshabilitar la agrupación de un cierto zoomlevel.

Yo ya tenía algunos problemas para deshabilitar la agrupación, así que me he venido arriba con esto:

Si establece el umbral de la agrupación de la estrategia para el total de la cuenta + 1 no hay ninguna agrupación. Si usted tiene una función de conmutación, se puede registrar para el zoomend evento.

La he usado ya en una función de conmutación. Sólo he añadido unas feas si las declaraciones para comprobar quién está llamando a la función de conmutación. La función de registro de llamadas al oyente con un objeto.

Así que después de la creación de la capa y la estrategia:

myMap.map.events.register("zoomend", "zoom", toggleCluster);

(Yo no tengo ni idea de lo que el segundo parámetro....) El objeto myMap contiene el mapa el myUnit objeto contiene una referencia a la capa y también la función de conmutación.

toggleCluster: function(status) {
    if (myUnit.layer.strategies[0].features != null){
        var max = myUnit.layer.strategies[0].features.length;
    } else {
        // no features, don't care
        return;
    }

    if (status && status.type == "zoomend") {
        if (myMap.map.zoom > myUnit.zoomThreshold-1 ) {
            console.log("cluster off");
            myUnit.layer.strategies[0].threshold = max + 1;
        } else {
            console.log("cluster on");
            myUnit.layer.strategies[0].threshold = myUnit.clusterThreshold;
        }
    } else {
        if (myUnit.layer.strategies[0].threshold == myUnit.clusterThreshold) {
            myUnit.layer.strategies[0].threshold = max + 1;
        } else {
            myUnit.layer.strategies[0].threshold = myUnit.clusterThreshold;    
        }
    }
    myUnit.layer.removeFeatures(tbUnit.layer.features);
    myUnit.layer.redraw();

},

0voto

wavedrop Puntos 36

También puedes seguir esta Guía: OpenLayers estrategia de grupo de activos del estado en función de la escala actual del mapa. Yo refactorizar un poco, el código importante es

clusteringThreshold: 9, 
previousZoom: 0,

// init: function () {  
    // ...
    // register callbacks at initilization
    this.map.events.register("zoomend", this, this.dontClusterAtLowestZoom);
    // ...
// }


dontClusterAtLowestZoom: function () {
    if ( this.comingFromBelowClusterThreshold() && this.clusterThresholdReached() ) {
        this.vectorLayer.strategies[0].deactivate();
        this.vectorLayer.refresh({force: true});
    }

    if ( !this.comingFromBelowClusterThreshold() && !this.clusterThresholdReached() ) {
        this.vectorLayer.strategies[0].activate();
        this.vectorLayer.refresh({force: true});
    }

    this.previousZoom = this.map.getZoom();        
},

comingFromBelowClusterThreshold: function () {
    return this.previousZoom < this.clusteringThreshold;        
},

clusterThresholdReached: function () {
    var currentZoom = this.map.getZoom();
    return currentZoom >= this.clusteringThreshold;
},

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X