UNPKG

leaflet

Version:

JavaScript library for mobile-friendly interactive maps

204 lines (163 loc) 4.93 kB
/* * @class ImageOverlay * @aka L.ImageOverlay * @inherits Interactive layer * * Used to load and display a single image over specific bounds of the map. Extends `Layer`. * * @example * * ```js * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg', * imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]]; * L.imageOverlay(imageUrl, imageBounds).addTo(map); * ``` */ L.ImageOverlay = L.Layer.extend({ // @section // @aka ImageOverlay options options: { // @option opacity: Number = 1.0 // The opacity of the image overlay. opacity: 1, // @option alt: String = '' // Text for the `alt` attribute of the image (useful for accessibility). alt: '', // @option interactive: Boolean = false // If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered. interactive: false, // @option attribution: String = null // An optional string containing HTML to be shown on the `Attribution control` attribution: null, // @option crossOrigin: Boolean = false // If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data. crossOrigin: false }, initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) this._url = url; this._bounds = L.latLngBounds(bounds); L.setOptions(this, options); }, onAdd: function () { if (!this._image) { this._initImage(); if (this.options.opacity < 1) { this._updateOpacity(); } } if (this.options.interactive) { L.DomUtil.addClass(this._image, 'leaflet-interactive'); this.addInteractiveTarget(this._image); } this.getPane().appendChild(this._image); this._reset(); }, onRemove: function () { L.DomUtil.remove(this._image); if (this.options.interactive) { this.removeInteractiveTarget(this._image); } }, // @method setOpacity(opacity: Number): this // Sets the opacity of the overlay. setOpacity: function (opacity) { this.options.opacity = opacity; if (this._image) { this._updateOpacity(); } return this; }, setStyle: function (styleOpts) { if (styleOpts.opacity) { this.setOpacity(styleOpts.opacity); } return this; }, // @method bringToFront(): this // Brings the layer to the top of all overlays. bringToFront: function () { if (this._map) { L.DomUtil.toFront(this._image); } return this; }, // @method bringToBack(): this // Brings the layer to the bottom of all overlays. bringToBack: function () { if (this._map) { L.DomUtil.toBack(this._image); } return this; }, // @method setUrl(url: String): this // Changes the URL of the image. setUrl: function (url) { this._url = url; if (this._image) { this._image.src = url; } return this; }, setBounds: function (bounds) { this._bounds = bounds; if (this._map) { this._reset(); } return this; }, getAttribution: function () { return this.options.attribution; }, getEvents: function () { var events = { zoom: this._reset, viewreset: this._reset }; if (this._zoomAnimated) { events.zoomanim = this._animateZoom; } return events; }, getBounds: function () { return this._bounds; }, getElement: function () { return this._image; }, _initImage: function () { var img = this._image = L.DomUtil.create('img', 'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : '')); img.onselectstart = L.Util.falseFn; img.onmousemove = L.Util.falseFn; img.onload = L.bind(this.fire, this, 'load'); if (this.options.crossOrigin) { img.crossOrigin = ''; } img.src = this._url; img.alt = this.options.alt; }, _animateZoom: function (e) { var scale = this._map.getZoomScale(e.zoom), offset = this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center); L.DomUtil.setTransform(this._image, offset, scale); }, _reset: function () { var image = this._image, bounds = new L.Bounds( this._map.latLngToLayerPoint(this._bounds.getNorthWest()), this._map.latLngToLayerPoint(this._bounds.getSouthEast())), size = bounds.getSize(); L.DomUtil.setPosition(image, bounds.min); image.style.width = size.x + 'px'; image.style.height = size.y + 'px'; }, _updateOpacity: function () { L.DomUtil.setOpacity(this._image, this.options.opacity); } }); // @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options) // Instantiates an image overlay object given the URL of the image and the // geographical bounds it is tied to. L.imageOverlay = function (url, bounds, options) { return new L.ImageOverlay(url, bounds, options); };