Efficient spatial index for Leaflet layers. It works recursively
for L.FeatureGroup
objects.
Requires the Magnificient RTree.js
Check out the live demo
L.Map.include(L.LayerIndexMixin);
var map = L.map(...);
...
var layer = L.GeoJSON(data).addTo(map);
map.indexLayer(layer);
// Search visible features for example
map.on('moveend', function () {
var shown = map.search(map.getBounds());
console.log(shown.length + ' objects shown.');
});
// remove the spatial index when the layer is unused
map.unindexLayer(layer);
map.unindexLayer()
function accepts an options
object as an optional second parameter to define the bounds to be removed from the index. It should have one of the following attributes:
options.bounds
- a leaflet latLngBounds objectoptions.latlng
- a leaflet latLng objectoptions.latlngs
- an array of leaflet latLng objects
If no option is provided, the function will use the bounds of the layer's geometry.
L.IndexedGeoJSON = L.GeoJSON.extend({
includes: L.LayerIndexMixin,
initialize: function (geojson, options) {
// Decorate onEachFeature to index layers
var onEachFeature = function (geojson, layer) {
this.indexLayer(layer);
if (this._onEachFeature) this._onEachFeature(geojson, layer);
};
this._onEachFeature = options.onEachFeature;
options.onEachFeature = L.Util.bind(onFeatureParse, this);
// Parent initialization
L.GeoJSON.prototype.initialize.call(this, geojson, options);
},
removeLayer: function (layer) {
if (this.hasLayer(layer)) {
this.unindexLayer(layer)
}
return window.L.GeoJSON.prototype.removeLayer.call(this, layer)
}
});
var layer = L.IndexedGeoJSON(data).addTo(map);
var aroundToulouse = layer.searchBuffer(L.latLng([43.60, 1.44]), 0.1);
- Add bower.json
- Initial version