概述:
前面的文章中,讲述了Arcgis for js中聚类分析与展示,在本文,讲述如何在Openlayers2中聚类分析的实现。
实现效果:
实现:
主要分为:1、点的聚类;2、聚类点随着地图缩放的更新;3、聚类点的详细。
1、点的聚类与更新
var style = new OpenLayers.Style({
pointRadius: "${radius}",
fillColor: "#ff0000",
label: "${name}",
fontSize: "8px",
cursor : "pointer",
fontWeight:"bold",
fontColor: "#ffffff",
fontFamily:"sans-serif",
fillOpacity: 0.8,
strokeColor: "#ff0000",
strokeWidth: "3",
strokeOpacity: 1
}, {
context: {
width: function ( feature ) {
return ( feature.cluster ) ? 2 : 1;
},
radius: function ( feature ) {
var pix = 2;
if ( feature.cluster ) {
pix = Math.min( feature.attributes.count, 7 ) + 5;
}
return pix;
},
name: function ( feature ) {
var name;
if ( feature.attributes.count > 1 ) {
name = feature.attributes.count;
} else {
name = feature.cluster[0].attributes.name;
}
return name;
}
}
});
strategy = new OpenLayers.Strategy.Cluster();
clusters = new OpenLayers.Layer.Vector( "Clusters", {
strategies: [strategy],
styleMap: new OpenLayers.StyleMap( {
"default": style,
"select": {
fillColor: "#0000ff",
strokeColor: "#0000ff"
}
} )
});
map.addLayer(clusters);
var distance = 150;
var threshold = 1;
strategy.distance = distance || strategy.distance;
strategy.threshold = threshold || strategy.threshold;
clusters.addFeatures(features2);
2、点的详细
var vectors = new OpenLayers.Layer.Vector("select",{
styleMap: new OpenLayers.StyleMap({
"default": {
fillColor: "#00ffff",
strokeColor: "#00ffff",
pointRadius: "2"
}
})
});
map.addLayer(vectors);
var select = new OpenLayers.Control.SelectFeature(
clusters,
{
clickout: true,
toggle: false,
multiple: false,
hover: false,
toggleKey: "ctrlKey", // ctrl key removes from selection
multipleKey: "shiftKey", // shift key adds to selection
box: false
}
);
map.addControl(select);
select.activate();
clusters.events.on({
'featureselected': function(feature) {
vectors.removeAllFeatures();
var cluster = feature.feature.cluster;
vectors.addFeatures(cluster);
},
'featureunselected': function(feature) {
vectors.removeAllFeatures();
}
});
map.events.register("zoomend",map,function(){
vectors.removeAllFeatures();
});
详细代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>openlayers map</title>
<link rel="stylesheet" href="../../../plugin/OpenLayers-2.13.1/theme/default/style.css" type="text/css">
<style>
html, body,#map{
padding:0;
margin:0;
height:100%;
overflow: hidden;
}
</style>
<script src="../../../plugin/OpenLayers-2.13.1/OpenLayers.js"></script>
<script src="../../../plugin/jquery/jquery-1.8.3.js"></script>
<script src="data/county.js"></script>
<script>
var map, strategy, clusters;
var features2 = [];
$(function(){
var bounds = new OpenLayers.Bounds(
73.45100463562233, 18.16324718764174,
134.97679764650596, 53.531943152223576
);
var mapOptions = {
resolutions: [0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 6.866455078125E-4, 3.4332275390625E-4, 1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.1457672119140625E-5, 1.0728836059570312E-5, 5.364418029785156E-6, 2.682209014892578E-6, 1.341104507446289E-6, 6.705522537231445E-7, 3.3527612686157227E-7],
projection: new OpenLayers.Projection('EPSG:4326'),
maxExtent: new OpenLayers.Bounds(-180.0,-90.0,180.0,90.0),
units: "degrees",
controls: []
};
map = new OpenLayers.Map('map', mapOptions );
map.addLayer(getWms("province"));
map.addControl(new OpenLayers.Control.Zoom());
map.addControl(new OpenLayers.Control.Navigation());
map.zoomToExtent(bounds);
addCluster();
});
function getWms(layer){
return new OpenLayers.Layer.WMS(
"Geoserver layers - Tiled",
"http://localhost:8088/geoserver/lzugis/wms",
{
"LAYERS": layer,
"STYLES": '',
format: 'image/png'
},
{
buffer: 0,
displayOutsideMaxExtent: true,
isBaseLayer: true,
yx : {'EPSG:4326' : true}
}
);
}
function addCluster(){
if ( countydata != null ) {
for (var i = 0; i < countydata.length; i++) {
var county = countydata[i];
var point3 = new OpenLayers.Geometry.Point(county.x, county.y );
var geometry = point3.clone();
var pointFeature3 = new OpenLayers.Feature.Vector(geometry);
pointFeature3.attributes = {
name: county.name
};
features2.push(pointFeature3);
}
}
var style = new OpenLayers.Style({
pointRadius: "${radius}",
fillColor: "#ff0000",
label: "${name}",
fontSize: "8px",
cursor : "pointer",
fontWeight:"bold",
fontColor: "#ffffff",
fontFamily:"sans-serif",
fillOpacity: 0.8,
strokeColor: "#ff0000",
strokeWidth: "3",
strokeOpacity: 1
}, {
context: {
width: function ( feature ) {
return ( feature.cluster ) ? 2 : 1;
},
radius: function ( feature ) {
var pix = 2;
if ( feature.cluster ) {
pix = Math.min( feature.attributes.count, 7 ) + 5;
}
return pix;
},
name: function ( feature ) {
var name;
if ( feature.attributes.count > 1 ) {
name = feature.attributes.count;
} else {
name = feature.cluster[0].attributes.name;
}
return name;
}
}
});
strategy = new OpenLayers.Strategy.Cluster();
clusters = new OpenLayers.Layer.Vector( "Clusters", {
strategies: [strategy],
styleMap: new OpenLayers.StyleMap( {
"default": style,
"select": {
fillColor: "#0000ff",
strokeColor: "#0000ff"
}
} )
});
map.addLayer(clusters);
var distance = 150;
var threshold = 1;
strategy.distance = distance || strategy.distance;
strategy.threshold = threshold || strategy.threshold;
clusters.addFeatures(features2);
var vectors = new OpenLayers.Layer.Vector("select",{
styleMap: new OpenLayers.StyleMap({
"default": {
fillColor: "#00ffff",
strokeColor: "#00ffff",
pointRadius: "2"
}
})
});
map.addLayer(vectors);
var select = new OpenLayers.Control.SelectFeature(
clusters,
{
clickout: true,
toggle: false,
multiple: false,
hover: false,
toggleKey: "ctrlKey", // ctrl key removes from selection
multipleKey: "shiftKey", // shift key adds to selection
box: false
}
);
map.addControl(select);
select.activate();
clusters.events.on({
'featureselected': function(feature) {
vectors.removeAllFeatures();
var cluster = feature.feature.cluster;
vectors.addFeatures(cluster);
},
'featureunselected': function(feature) {
vectors.removeAllFeatures();
}
});
map.events.register("zoomend",map,function(){
vectors.removeAllFeatures();
});
};
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>