2017-01-26 6 views
1

OpenLayers 3では、5つのマップマーカー以下のクラスタがクラスタ化されず、代わりに個々のマップマーカーを表示するように最小クラスタサイズを指定するにはどうすればよいですか?クラスタ層のol.layer.Vectorオブジェクト内でこれを行う方法はありますか?Open Layers Clusteringで最小クラスタサイズを指定する

let clusterSource = new ol.source.Cluster({ 
    distance: CLUSTER_DISTANCE, 
    source: features 
}); 
let clusterLayer = new ol.layer.Vector({ 
    source: source, 
    style: function(feature, resolution) { } 
}); 
+0

可能なソリューションのためのhttp://viglino.github.io/OL3-AnimatedCluster/を見てください。 –

+0

私はあなたがそれぞれのジオメトリを持つスタイルの配列を返さなければならないかもしれないと思う。 –

答えて

0

コードにはいくつの機能があるかチェックインできます。あまりにも多い場合は、すでに追加したベクトルソースに基づいて新しいベクトルレイヤーにクラスターソースを作成することができます。そうでない場合は、既存のベクターソースでベクターレイヤーを作成することができます。

ソースをレイヤーに動的に設定する方法がないため、ベクターレイヤーを目的のソースで作成する必要があります。 5つ以上の機能でどのように動作するかを見たい場合は、コメント行のコメントを外してください。

var features = [ 
 
    new ol.Feature({ 
 
    \t geometry: new ol.geom.Point([0,0]) 
 
    }), 
 
    new ol.Feature({ 
 
    \t geometry: new ol.geom.Point([100000,500000]) 
 
    }), 
 
    new ol.Feature({ 
 
    \t geometry: new ol.geom.Point([500000,100000]) 
 
    }), 
 
    new ol.Feature({ 
 
    \t geometry: new ol.geom.Point([5000000,1000000]) 
 
    }), 
 
    new ol.Feature({ 
 
    \t geometry: new ol.geom.Point([1000000,500000]) 
 
    }) 
 
    /*,new ol.Feature({ 
 
    \t geometry: new ol.geom.Point([1800000,800000]) 
 
    })*/ 
 
\t ], 
 
    source = new ol.source.Vector({ 
 
    \t features: features 
 
    }); 
 

 
var layer; 
 
if (features.length > 5) { 
 
    var clusterSource = new ol.source.Cluster({ 
 
    distance: parseInt(40, 10), 
 
    source: source 
 
    }); 
 

 
    var styleCache = {}; 
 
    layer = new ol.layer.Vector({ 
 
    source: clusterSource, 
 
    style: function(feature) { 
 
     var size = feature.get('features').length; 
 
     var style = styleCache[size]; 
 
     if (!style) { 
 
     style = new ol.style.Style({ 
 
      image: new ol.style.Circle({ 
 
      radius: 10, 
 
      stroke: new ol.style.Stroke({ 
 
       color: '#AAA' 
 
      }), 
 
      fill: new ol.style.Fill({ 
 
       color: '#DDD' 
 
      }) 
 
      }), 
 
      text: new ol.style.Text({ 
 
      text: size.toString(), 
 
      fill: new ol.style.Fill({ 
 
       color: '#B144FF' 
 
      }) 
 
      }) 
 
     }); 
 
     styleCache[size] = style; 
 
     } 
 
     return style; 
 
    } 
 
    }); 
 
} else { 
 
    layer = new ol.layer.Vector({ 
 
    source: source 
 
    }); 
 
} 
 

 
var map = new ol.Map({ 
 
    layers: [ 
 
    \t new ol.layer.Tile({ 
 
    \t \t source: new ol.source.OSM() 
 
\t \t }), 
 
    layer 
 
    ], 
 
    target: 'clusterMap', 
 
    view: new ol.View({ 
 
    center: [0, 0], 
 
    zoom: 2 
 
    }) 
 
});
<link href="https://openlayers.org/en/v3.20.1/css/ol.css" rel="stylesheet"/> 
 
<script src="https://openlayers.org/en/v3.20.1/build/ol.js"></script> 
 
<div id="clusterMap" class="map"></div>

+0

私は、5つ以上のマーカーがクラスタ化され、動的に機能する場合にのみクラスタリングするソリューションが必要だと思います。私はこれが(最初に)5つ以上の機能があるときにクラスタリングを使用すると信じています。それは質問とは非常に異なっています。 –

+0

問題が動的に発生するように指定されていないため、この解決策は単純な環境で問題を解決する必要があります。質問者は何も言わなかったので、私はそのまま答えを保持します。 – Icarus

関連する問題