181 lines
5.7 KiB
JavaScript
181 lines
5.7 KiB
JavaScript
(function(previousMethods){
|
|
if (typeof previousMethods === 'undefined') {
|
|
// Defining previously that object allows you to use that plugin even if you have overridden L.map
|
|
previousMethods = {
|
|
getCenter: L.Map.prototype.getCenter,
|
|
setView: L.Map.prototype.setView,
|
|
setZoomAround: L.Map.prototype.setZoomAround,
|
|
getBoundsZoom: L.Map.prototype.getBoundsZoom,
|
|
scaleUpdate: L.Control.Scale.prototype._update
|
|
};
|
|
}
|
|
|
|
|
|
L.Map.include({
|
|
getBounds: function() {
|
|
if (this._viewport) {
|
|
return this.getViewportLatLngBounds()
|
|
} else {
|
|
var bounds = this.getPixelBounds(),
|
|
sw = this.unproject(bounds.getBottomLeft()),
|
|
ne = this.unproject(bounds.getTopRight());
|
|
|
|
return new L.LatLngBounds(sw, ne);
|
|
}
|
|
},
|
|
|
|
getViewport: function() {
|
|
return this._viewport;
|
|
},
|
|
|
|
getViewportBounds: function() {
|
|
var vp = this._viewport,
|
|
topleft = L.point(vp.offsetLeft, vp.offsetTop),
|
|
vpsize = L.point(vp.clientWidth, vp.clientHeight);
|
|
|
|
if (vpsize.x === 0 || vpsize.y === 0) {
|
|
//Our own viewport has no good size - so we fallback to the container size:
|
|
vp = this.getContainer();
|
|
if(vp){
|
|
topleft = L.point(0, 0);
|
|
vpsize = L.point(vp.clientWidth, vp.clientHeight);
|
|
}
|
|
|
|
}
|
|
|
|
return L.bounds(topleft, topleft.add(vpsize));
|
|
},
|
|
|
|
getViewportLatLngBounds: function() {
|
|
var bounds = this.getViewportBounds();
|
|
return L.latLngBounds(this.containerPointToLatLng(bounds.min), this.containerPointToLatLng(bounds.max));
|
|
},
|
|
|
|
getOffset: function() {
|
|
var mCenter = this.getSize().divideBy(2),
|
|
vCenter = this.getViewportBounds().getCenter();
|
|
|
|
return mCenter.subtract(vCenter);
|
|
},
|
|
|
|
getCenter: function () {
|
|
var center = previousMethods.getCenter.call(this);
|
|
|
|
if (this.getViewport()) {
|
|
var zoom = this.getZoom(),
|
|
point = this.project(center, zoom);
|
|
point = point.subtract(this.getOffset());
|
|
|
|
center = this.unproject(point, zoom);
|
|
}
|
|
|
|
return center;
|
|
},
|
|
|
|
setView: function (center, zoom, options) {
|
|
center = L.latLng(center);
|
|
zoom = zoom || this.getZoom();
|
|
|
|
if (this.getViewport()) {
|
|
var point = this.project(center, this._limitZoom(zoom));
|
|
point = point.add(this.getOffset());
|
|
center = this.unproject(point, this._limitZoom(zoom));
|
|
}
|
|
|
|
return previousMethods.setView.call(this, center, zoom, options);
|
|
},
|
|
|
|
setZoomAround: function (latlng, zoom, options) {
|
|
var vp = this.getViewport();
|
|
|
|
if (vp) {
|
|
var scale = this.getZoomScale(zoom),
|
|
viewHalf = this.getViewportBounds().getCenter(),
|
|
containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),
|
|
|
|
centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
|
|
newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
|
|
|
|
return this.setView(newCenter, zoom, {zoom: options});
|
|
} else {
|
|
return previousMethods.setZoomAround.call(this, latlng, zoom, options);
|
|
}
|
|
},
|
|
|
|
getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
|
|
bounds = L.latLngBounds(bounds);
|
|
|
|
var zoom = this.getMinZoom() - (inside ? 1 : 0),
|
|
maxZoom = this.getMaxZoom(),
|
|
vp = this.getViewport(),
|
|
size = (vp) ? L.point(vp.clientWidth, vp.clientHeight) : this.getSize(),
|
|
|
|
nw = bounds.getNorthWest(),
|
|
se = bounds.getSouthEast(),
|
|
|
|
zoomNotFound = true,
|
|
boundsSize;
|
|
|
|
padding = L.point(padding || [0, 0]);
|
|
|
|
do {
|
|
zoom++;
|
|
boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);
|
|
zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;
|
|
|
|
} while (zoomNotFound && zoom <= maxZoom);
|
|
|
|
if (zoomNotFound && inside) {
|
|
return null;
|
|
}
|
|
|
|
return inside ? zoom : zoom - 1;
|
|
}
|
|
});
|
|
|
|
L.Control.Scale.include({
|
|
_update: function () {
|
|
if (!this._map._viewport) {
|
|
previousMethods.scaleUpdate.call(this);
|
|
} else {
|
|
var bounds = this._map.getBounds(),
|
|
centerLat = bounds.getCenter().lat,
|
|
halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),
|
|
dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,
|
|
|
|
size = this._map.getSize(),
|
|
options = this.options,
|
|
maxMeters = 0;
|
|
|
|
var size = new L.Point(
|
|
this._map._viewport.clientWidth,
|
|
this._map._viewport.clientHeight);
|
|
|
|
if (size.x > 0) {
|
|
maxMeters = dist * (options.maxWidth / size.x);
|
|
}
|
|
|
|
this._updateScales(options, maxMeters);
|
|
}
|
|
}
|
|
});
|
|
|
|
L.Map.include({
|
|
setActiveArea: function (css) {
|
|
if( !this._viewport ){
|
|
//Make viewport if not already made
|
|
var container = this.getContainer();
|
|
this._viewport = L.DomUtil.create('div', '');
|
|
container.insertBefore(this._viewport, container.firstChild);
|
|
}
|
|
|
|
if (typeof css === 'string') {
|
|
this._viewport.className = css;
|
|
} else {
|
|
L.extend(this._viewport.style, css);
|
|
}
|
|
return this;
|
|
}
|
|
});
|
|
})(window.leafletActiveAreaPreviousMethods);
|