PageSourceSearch

https://wafuelfinder.com/js/leaflet-mapbox-gl.js

js wafuelfinder.com collected 2026-10-02 06:40:08 UTC 8,652 bytes, 241 lines download raw bytes

1(function (root, factory) {
2    if (typeof define === 'function' && define.amd) {
3        // AMD
4        define(['leaflet', 'mapbox-gl'], factory);
5    } else if (typeof exports === 'object') {
6        // Node, CommonJS-like
7        module.exports = factory(require('leaflet'), require('mapbox-gl'));
8    } else {
9        // Browser globals (root is window)
10        root.returnExports = factory(window.L, window.mapboxgl);
11    }
12}(this, function (L, mapboxgl) {
13    L.MapboxGL = L.Layer.extend({
14        options: {
15        updateInterval: 32
16        },
17
18        initialize: function (options) {
19            L.setOptions(this, options);
20
21            if (options.accessToken) {
22                mapboxgl.accessToken = options.accessToken;
23            } else {
24                throw new Error('You should provide a Mapbox GL access token as a token option.');
25            }
26
27            /**
28             * Create a version of `fn` that only fires once every `time` millseconds.
29             *
30             * @param {Function} fn the function to be throttled
31             * @param {number} time millseconds required between function calls
32             * @param {*} context the value of `this` with which the function is called
33             * @returns {Function} debounced function
34             * @private
35             */
36            var throttle = function (fn, time, context) {
37                var lock, args, wrapperFn, later;
38
39                later = function () {
40                    // reset lock and call if queued
41                    lock = false;
42                    if (args) {
43                        wrapperFn.apply(context, args);
44                        args = false;
45                    }
46                };
47
48                wrapperFn = function () {
49                    if (lock) {
50                        // called too soon, queue to call later
51                        args = arguments;
52
53                    } else {
54                        // call and lock until later
55                        fn.apply(context, arguments);
56                        setTimeout(later, time);
57                        lock = true;
58                    }
59                };
60
61                return wrapperFn;
62            };
63
64            // setup throttling the update event when panning
65            this._throttledUpdate = throttle(L.Util.bind(this._update, this), this.options.updateInterval);
66        },
67
68        onAdd: function (map) {
69            if (!this._glContainer) {
70                this._initContainer();
71            }
72
73            this.getPane().appendChild(this._glContainer);
74
75            this._initGL();
76
77            this._offset = this._map.containerPointToLayerPoint([0, 0]);
78
79            // work around https://github.com/mapbox/mapbox-gl-leaflet/issues/47
80            if (map.options.zoomAnimation) {
81                L.DomEvent.on(map._proxy, L.DomUtil.TRANSITION_END, this._transitionEnd, this);
82            }
83        },
84
85        onRemove: function (map) {
86            if (this._map.options.zoomAnimation) {
87                L.DomEvent.off(this._map._proxy, L.DomUtil.TRANSITION_END, this._transitionEnd, this);
88            }
89
90            this.getPane().removeChild(this._glContainer);
91            this._glMap.remove();
92            this._glMap = null;
93        },
94
95        getEvents: function () {
96            return {
97                move: this._throttledUpdate, // sensibly throttle updating while panning
98                zoomanim: this._animateZoom, // applys the zoom animation to the <canvas>
99                zoom: this._pinchZoom, // animate every zoom event for smoother pinch-zooming
100                zoomstart: this._zoomStart, // flag starting a zoom to disable panning
101                zoomend: this._zoomEnd
102            };
103        },
104
105        _initContainer: function () {
106            var container = this._glContainer = L.DomUtil.create('div', 'leaflet-gl-layer');
107
108            var size = this._map.getSize();
109            container.style.width  = size.x + 'px';
110            container.style.height = size.y + 'px';
111        },
112
113        _initGL: function () {
114            var center = this._map.getCenter();
115
116            var options = L.extend({}, this.options, {
117                container: this._glContainer,
118                interactive: false,
119                center: [center.lng, center.lat],
120                zoom: this._map.getZoom() - 1,
121                attributionControl: false
122            });
123
124            this._glMap = new mapboxgl.Map(options);
125
126            // allow GL base map to pan beyond min/max latitudes
127            this._glMap.transform.latRange = null;
128
129            if (this._glMap._canvas.canvas) {
130                // older versions of mapbox-gl surfaced the canvas differently
131                this._glMap._actualCanvas = this._glMap._canvas.canvas;
132            } else {
133                this._glMap._actualCanvas = this._glMap._canvas;
134            }
135
136            // treat child <canvas> element like L.ImageOverlay
137            L.DomUtil.addClass(this._glMap._actualCanvas, 'leaflet-image-layer');
138            L.DomUtil.addClass(this._glMap._actualCanvas, 'leaflet-zoom-animated');
139
140        },
141
142        _update: function (e) {
143            // update the offset so we can correct for it later when we zoom
144            this._offset = this._map.containerPointToLayerPoint([0, 0]);
145
146            if (this._zooming) {
147            return;
148            }
149
150            var size = this._map.getSize(),
151                container = this._glContainer,
152                gl = this._glMap,
153                topLeft = this._map.containerPointToLayerPoint([0, 0]);
154
155            L.DomUtil.setPosition(container, topLeft);
156
157            var center = this._map.getCenter();
158
159            // gl.setView([center.lat, center.lng], this._map.getZoom() - 1, 0);
160            // calling setView directly causes sync issues because it uses requestAnimFrame
161
162            var tr = gl.transform;
163            tr.center = mapboxgl.LngLat.convert([center.lng, center.lat]);
164            tr.zoom = this._map.getZoom() - 1;
165
166            if (gl.transform.width !== size.x || gl.transform.height !== size.y) {
167                container.style.width  = size.x + 'px';
168                container.style.height = size.y + 'px';
169                if (gl._resize !== null && gl._resize !== undefined){
170                    gl._resize();
171                } else {
172                    gl.resize();
173                }
174            } else {
175                // older versions of mapbox-gl surfaced update publicly
176                if (gl._update !== null && gl._update !== undefined){
177                    gl._update();
178                } else {
179                    gl.update();
180                }
181            }
182        },
183
184        // update the map constantly during a pinch zoom
185        _pinchZoom: function (e) {
186        this._glMap.jumpTo({
187            zoom: this._map.getZoom() - 1,
188            center: this._map.getCenter()
189        });
190        },
191
192        // borrowed from L.ImageOverlay https://github.com/Leaflet/Leaflet/blob/master/src/layer/ImageOverlay.js#L139-L144
193        _animateZoom: function (e) {
194        var scale = this._map.getZoomScale(e.zoom),
195            offset = this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(), e.zoom, e.center);
196
197        L.DomUtil.setTransform(this._glMap._actualCanvas, offset.subtract(this._offset), scale);
198        },
199
200        _zoomStart: function (e) {
201        this._zooming = true;
202        },
203
204        _zoomEnd: function () {
205        var scale = this._map.getZoomScale(this._map.getZoom()),
206            offset = this._map._latLngToNewLayerPoint(this._map.getBounds().getNorthWest(), this._map.getZoom(), this._map.getCenter());
207
208        L.DomUtil.setTransform(this._glMap._actualCanvas, offset.subtract(this._offset), scale);
209
210        this._zooming = false;
211        },
212
213        _transitionEnd: function (e) {
214        L.Util.requestAnimFrame(function () {
215            var zoom = this._map.getZoom(),
216            center = this._map.getCenter(),
217            offset = this._map.latLngToContainerPoint(this._map.getBounds().getNorthWest());
218
219            // reset the scale and offset
220            L.DomUtil.setTransform(this._glMap._actualCanvas, offset, 1);
221
222            // enable panning once the gl map is ready again
223            this._glMap.once('moveend', L.Util.bind(function () {
224                this._zoomEnd();
225            }, this));
226
227            // update the map position
228            this._glMap.jumpTo({
229                center: center,
230                zoom: zoom - 1
231            });
232        }, this);
233        }
234    });
235
236    L.mapboxGL = function (options) {
237        return new L.MapboxGL(options);
238    };
239
240}));
241

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.