123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /*
- * Extends L.Map to synchronize the interaction on one map to one or more other maps.
- */
- (function () {
- 'use strict';
- L.Map = L.Map.extend({
- sync: function (map, options) {
- this._initSync();
- options = options || {};
- // prevent double-syncing the map:
- var present = false;
- this._syncMaps.forEach(function (other) {
- if (map === other) {
- present = true;
- }
- });
- if (!present) {
- this._syncMaps.push(map);
- }
- if (!options.noInitialSync) {
- map.setView(this.getCenter(), this.getZoom(), {
- animate: false,
- reset: true
- });
- }
- return this;
- },
- // unsync maps from each other
- unsync: function (map) {
- var self = this;
- if (this._syncMaps) {
- this._syncMaps.forEach(function (synced, id) {
- if (map === synced) {
- self._syncMaps.splice(id, 1);
- }
- });
- }
- return this;
- },
- // overload methods on originalMap to replay on _syncMaps;
- _initSync: function () {
- if (this._syncMaps) {
- return;
- }
- var originalMap = this;
- this._syncMaps = [];
- L.extend(originalMap, {
- setView: function (center, zoom, options, sync) {
- if (!sync) {
- originalMap._syncMaps.forEach(function (toSync) {
- toSync.setView(center, zoom, options, true);
- });
- }
- return L.Map.prototype.setView.call(this, center, zoom, options);
- },
- panBy: function (offset, options, sync) {
- if (!sync) {
- originalMap._syncMaps.forEach(function (toSync) {
- toSync.panBy(offset, options, true);
- });
- }
- return L.Map.prototype.panBy.call(this, offset, options);
- },
- _onResize: function (event, sync) {
- if (!sync) {
- originalMap._syncMaps.forEach(function (toSync) {
- toSync._onResize(event, true);
- });
- }
- return L.Map.prototype._onResize.call(this, event);
- }
- });
- originalMap.on('zoomend', function () {
- originalMap._syncMaps.forEach(function (toSync) {
- toSync.setView(originalMap.getCenter(), originalMap.getZoom(), {
- animate: false,
- reset: false
- });
- });
- }, this);
- originalMap.dragging._draggable._updatePosition = function () {
- L.Draggable.prototype._updatePosition.call(this);
- var self = this;
- originalMap._syncMaps.forEach(function (toSync) {
- L.DomUtil.setPosition(toSync.dragging._draggable._element, self._newPos);
- toSync.fire('moveend');
- });
- };
- }
- });
- })();
|