Openlayers2中聚类的动态实现
概述:
前面的文章中,讲述了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>
人在山中,才知道,白云也可以抓上一把,苍翠竟有清甜的味道。
人在山中,才知道,高度永远是一个变量,而快乐则是附于中跋涉过程的函数。
人在山中,才知道,庄严是望远时的一种心境,高处才能指点江山。