L.Cluster = L.Marker.extend({ initialize: function(marker, proprietes, options) { L.Marker.prototype.initialize.call(this, marker, options); this._proprietes = [proprietes]; }, ajouterPoint: function(proprietes) { this._proprietes.push(proprietes); this.setIcon(new L.Icon({ iconUrl : clusterImageUrl, iconSize : [20, 20] })); }, recupererPoints: function() { return this._proprietes; }, obtenirNombrePoints: function() { return this._proprietes.length; }, supprimerSource: function(sourceSupression) { var index = 0; while (index < this._markers.length) { if (this._proprietes[index].source == sourceSupression) { this._proprietes.splice(index, 1); } else { index ++; } } if (this._markers.length == 0) { if (this._map != null) { this._map.removeLayer(this); } delete this; } }, supprimer: function() { while (this._proprietes.length > 0) { this._proprietes.splice(0, 1); } if (this._map != null) { this._map.removeLayer(this); } delete this; } }); L.ClusterGroup = L.FeatureGroup.extend({ initialize: function(layers) { L.FeatureGroup.prototype.initialize.call(this, layers); this._distance = 10; this._resolution = 0; this._nombreClusters = 0; }, ajouterPoint: function(point, proprietes) { if (this._resolution == 0) { this._resolution = (2 * Math.PI * 6378137) / (256 * Math.pow(2, this._map.getZoom())); } var seuilCluster = this._distance * this._resolution; var indexClusterPlusProche = this._chercherVoisinPlusProche(point); var ajoute = false; if (indexClusterPlusProche != null) { var distance = this._layers[indexClusterPlusProche].getLatLng().distanceTo(point); if (distance < seuilCluster) { this._layers[indexClusterPlusProche].ajouterPoint(point, proprietes); ajoute = true; } } if (!ajoute) { var cluster = creerMarqueur(point, proprietes); this._layers[this._nombreClusters] = cluster; this._nombreClusters ++; } }, _chercherVoisinPlusProche: function(point) { var distance = -1; var plusProche = null; for (var numeroLayer in this._layers) { if (typeof(this._layers[numeroLayer]) != 'undefined') { var pointCluster = this._layers[numeroLayer].getLatLng(); if (distance == -1 || pointCluster.distanceTo(point) < distance) { plusProche = numeroLayer; distance = pointCluster.distanceTo(point); } } } return plusProche; }, afficherClusters: function() { for (var numeroLayer in this._layers) { if (typeof(this._layers[numeroLayer]) != 'undefined') { var layer = this._layers[numeroLayer]; if (layer.obtenirNombrePoints() > 1) { layer.setIcon(new L.Icon({ iconUrl : clusterImageUrl, iconSize : [20, 20] })) } layer.addTo(map); } } }, supprimerPoint: function(layer) { this.removeLayer(layer); } });