private static void ClusterFeatures(
ICollection<Cluster> clusters,
IEnumerable<IFeature> features,
double minDistance,
IStyle layerStyle,
double resolution)
{
var style = layerStyle;
// todo: This method should repeated several times until there are no more merges
foreach (var feature in features.OrderBy(f => f.Geometry.GetBoundingBox().GetCentroid().Y))
{
if (layerStyle is IThemeStyle) style = (layerStyle as IThemeStyle).GetStyle(feature);
if ((style == null) ||
(style.Enabled == false) ||
(style.MinVisible > resolution) ||
(style.MaxVisible < resolution)) continue;
var found = false;
foreach (var cluster in clusters)
if (cluster.Box.Grow(minDistance).Contains(feature.Geometry.GetBoundingBox().GetCentroid()))
{
cluster.Features.Add(feature);
cluster.Box = cluster.Box.Join(feature.Geometry.GetBoundingBox());
found = true;
break;
}
if (found) continue;
clusters.Add(new Cluster
{
Box = feature.Geometry.GetBoundingBox().Clone(),
Features = new List<IFeature> {feature}
});
}
}