UNPKG

geoportal-extensions-leaflet

Version:
294 lines (254 loc) 9.24 kB
/** * desativation JSHINT * W106 - Identifier '_geoportal_id' is not in camel case */ import Gp from "geoportal-access-lib"; import L from "leaflet"; import Logger from "../../Common/Utils/LoggerByDefault"; import LayerEvent from "./LayerEvent"; // package.json (extract version) import Pkg from "../../../package.json"; var logger = Logger.getLogger("wmts"); /** * @namespace * @alias L.geoportalLayers.WMTS * @classdesc * * Leaflet Layer Class for Geoportal WMTS Layers. * * Use {@link module:Layers.WMTS L.geoportalLayer.WMTS()} factory to create instances of that class. * * **Extends** Leaflet <a href="http://leafletjs.com/reference.html#tilelayer" target="_blank">L.TileLayer</a> native class. * */ var WMTS = L.TileLayer.extend(/** @lends WMTS.prototype */ { includes : LayerEvent, defaultWmtsParams : { service : "WMTS", request : "GetTile", version : "1.0.0", layer : "", style : "", tilematrixset : "PM", format : "image/jpeg" }, /** * * @constructor * @param {String} url - url service * @param {Object} options - options for function call. * @param {Array} [options.originators] - originators * @param {Array} [options.legends] - legends * @param {Array} [options.metadata] - metadata * @param {String} [options.title] - title * @param {String} [options.description] - description * @param {String} [options.quicklookUrl] - quicklookUrl * @param {Object} options.paramsWmts - WMTS options * @param {String} options.paramsWmts.service - "WMTS", * @param {String} options.paramsWmts.request - "GetTile", * @param {String} options.paramsWmts.version - "1.0.0", * @param {String} options.paramsWmts.layer - "", * @param {String} options.paramsWmts.style - "", * @param {String} options.paramsWmts.tilematrixset - "PM", * @param {String} options.paramsWmts.format - "image/jpeg" * @param {Object} [options.paramsNative] - other options for L.TileLayer function (see {@link http://leafletjs.com/reference.html#tilelayer-options}) * @example * var wmts = new WMTS("https://data.geopf.fr/wmts", { * paramsNative : { * minZoom : 1, * maxZoom : 21 * }, * paramsWmts : { * layer : "ORTHOIMAGERY.ORTHOPHOTOS", * style : "normal", * format : "image/jpeg", * version : "1.0.0", * tilematrixset : "PM" * }, * originators : [], * legends : [], * metadata : [], * title : "", * description : "", * quicklookUrl : "" * }); * * @ignore */ initialize : function (url, options) { logger.log("initialize"); // parametres WMTS this._wmtsParams = {}; L.Util.extend(this._wmtsParams, this.defaultWmtsParams, options.paramsWmts); var urlParams = { "gp-leaflet-ext" : Pkg.leafletExtVersion || Pkg.version }; // ajout de l'apiKey en paramètre de la requête si couche à accès restreint if (options.apikey) { urlParams["apikey"] = options.apikey; } // appel du constructeur de la classe étendue L.TileLayer.prototype.initialize.call( this, // tracker extension leaflet // FIXME : gp-ext version en mode AMD Gp.Helper.normalyzeUrl(url, urlParams, false), options.paramsNative ); // sauvegarde des originators this._originators = options.originators; this._legends = options.legends; this._metadata = options.metadata; this._title = options.title; this._description = options.description; this._quicklookUrl = options.quicklookUrl; // id du Layer this._geoportal_id = 0; // FIXME L.stamp(this); }, /** * event 'onAdd' * (overwritten) * * @param {Object} map - map leaflet object * @private */ onAdd : function (map) { logger.trace("onAdd layer", this._geoportal_id); // recuperation de la map this._map = map; // enregistrement de l'id Geoportal this._geoportal_id = L.stamp(this); // appel de la methode de la classe étendue L.TileLayer.prototype.onAdd.call(this, map); this.setVisible(true); // y a t il des attributions/originators pour ce layer ? this.updateAttributions(map); /** * Evenement sur l'ajout du layer sur la carte avec gestion des deplacements (zoom) * Les deplacemnts sur la carte permettent de mettre à jour la liste des attributions. */ map.on({ /** * Permet de desactiver la visibilité des attributions sur le retrait * d'un layer de type overlay. * Les attributions ne doivent plus apparaitre si le layer est invisible ! * @private */ overlayremove : this._onRemoveLayer, /** * Permet d'activer la visibilité des attributions sur l'ajout * d'un layer de type overlay. * Les attributions doivent apparaitre si le layer est visible ! * @private */ overlayadd : this._onAddLayer, /** * Permet de desactiver la visibilité des attributions sur le retrait * d'un layer de type layer. * Les attributions ne doivent plus apparaitre si le layer est invisible ! * @private */ layerremove : this._onRemoveLayer, /** * Permet d'activer la visibilité des attributions sur l'ajout * d'un layer de type layer. * Les attributions doivent apparaitre si le layer est visible ! * @private */ layeradd : this._onAddLayer, /** * Permet d'ajouter des fonctionnalités lors de la creation du layer * sur les evenements de fin de mouvemenent (move ou zoom) * @private */ moveend : this._onMoveEndLayer }, this); // if (map.attributionControl) { // // ceci permet de mofifier le prefixe leaflet ! // // ce dernier etant obligatoire... // // Ex. map.attributionControl.setPrefix("Plugin © IGN with Leaflet - 2016"); // // map.attributionControl.setPrefix("Leaflet + Géoportail"); // map.attributionControl.setPrefix("Plugin © " + // "<a href=\"http://www.ign.fr\" " + // "title=\"Institut national de l'information géographique et forestière\">IGN</a>" + // " with " + // "<a href=\"http://leafletjs.com/\" " + // "title=\"an open-source JavaScript library for mobile-friendly interactive maps\">Leaflet</a>" + // " - 2016"); // } }, /** * event 'onRemove' * (overwritten) * * @param {Object} map - map leaflet object * @private */ onRemove : function (map) { logger.trace("onRemove layer", this._geoportal_id); // recuperation de la map this._map = map; // appel de la methode de la classe étendue L.TileLayer.prototype.onRemove.call(this, map); this.setVisible(false); // suppression des attributions this.removeAttributions(map); // supprimer les evenements map.off({ overlayremove : this._onRemoveLayer, overlayadd : this._onAddLayer, layerremove : this._onRemoveLayer, layeradd : this._onAddLayer, moveend : this._onMoveEndLayer }, this); }, /** * event 'getTileUrl' * (overwritten) * * @param {Object} tilePoint - Point leaflet object * * @returns {String} url * @private */ getTileUrl : function (tilePoint) { // (Point, Number) -> String // ex https://data.geopf.fr/wmts? // SERVICE=WMTS& // REQUEST=GetTile& // VERSION=1.0.0& // LAYER=ORTHOIMAGERY.ORTHOPHOTOS& // STYLE=normal& // TILEMATRIXSET=PM& // TILEMATRIX=2& // TILEROW=2& // TILECOL=1& // FORMAT=image%2Fjpeg var zoom = this._getZoomForUrl(); var url = L.Util.template(this._url, { s : this._getSubdomain(tilePoint) }); return url + L.Util.getParamString(this._wmtsParams, url) + "&tilematrix=" + zoom + "&tilerow=" + tilePoint.y + "&tilecol=" + tilePoint.x; }, /** * event 'setParams' * (overwritten) * * @param {Object} params - parameters * @param {Object} noRedraw - no redraw * * @returns {Object} this * @private */ setParams : function (params, noRedraw) { L.extend(this._wmtsParams, params); if (!noRedraw) { this.redraw(); } return this; } }); export default WMTS;