Source: BKGWebMap/Layer.js

/*
 * Copyright (c) 2013 Bundesamt by Kartographie und Geodäsie.
 * See license.txt in the BKG WebMap distribution or repository for the
 * full text of the license.
 *
 * Author: Dirk Thalheim
 */

/**
 * @requires OpenLayers/Util.js
 * @requires OpenLayers/Layer/WMS.js
 * @requires OpenLayers/Layer/WMTS.js
 */

/**
 * @namespace BKGWebMap.Layer
 */
BKGWebMap.Layer = BKGWebMap.Layer || {};


/**
 * Allgemeines Copyright für BKG-Layer
 * @type {string}
 */
BKGWebMap.Layer.COPYRIGHT = "© GeoBasis-DE / BKG " + new Date().getFullYear();

/**
 * Registry für Factory-Funktionen zur Layergenerierung.
 *
 * Funktionen erwarten Konfigurationsobjekt und Angabe zur Projektion. Es können weitere Funktionen zur Layergenerierung
 * registriert werden.
 *
 * @type {object<string, Function>}
 */
BKGWebMap.Layer.FACTORIES = {

  /**
   * Factory-Funktion zur Generierung von WMS-Layern
   *
   * @param {object} config - Die WMS-Konfiguration
   * @param {object} defaults - Standardkonfigurationen für den Layer
   * @param {string} projection
   * @returns {OpenLayers.Layer.WMS}
   */
  'WMS': function(config, projection, defaults) {
    var wmsConfig = OpenLayers.Util.extend({ transitionEffect: 'resize' }, defaults);

    var params = OpenLayers.Util.extend(wmsConfig.params, config.params);
    delete config.params;
    delete wmsConfig.params;

    wmsConfig = OpenLayers.Util.extend(wmsConfig, config);

    var name = wmsConfig.name;
    delete config.name;
    var url = wmsConfig.url;
    delete config.url;

    return new OpenLayers.Layer.WMS(name, url, params, wmsConfig);
  },

  /**
   * Factory-Funktion zur Generierung von WMTS-Layern
   *
   * @param {object} config - Die WMTS-Konfiguration
   * @param {string} projection
   * @returns {OpenLayers.Layer.WMTS}
   */
  'WMTS': function(config, projection) {
    return new OpenLayers.Layer.WMTS(config);
  },

  /**
   * Factory-Funktion zur Generierung von WFS-Layern. Der erzeugte WFS-Layer verwendet standardmäßig die BBOX-Strategie,
   * um seine Daten zu aktualisieren.
   *
   * @param {object} config - Die Layer-Konfiguration
   * @param {object} config.wfs - Die WFS-Parameter
   * @param {string} projection
   * @returns {OpenLayers.Layer.Vector}
   */
  'WFS': function(config, projection) {
    var name = config.name;
    delete config.name;

    // standardmäßig die BBOX-Strategie verwenden
    config.strategies = config.strategies || [new OpenLayers.Strategy.BBOX()];

    // Protokoll konfigurieren       {
    var wfsParams = OpenLayers.Util.extend({ version: '1.1.0', srsName: projection}, config.wfs);
    delete config.wfs;
    config.protocol = new OpenLayers.Protocol.WFS(wfsParams);

    // Style definieren
    config.styleMap = config.styleMap || new OpenLayers.StyleMap(BKGWebMap.STYLES.ROT.Polygon);

    // WFS Layer erzeugen ...
    return new OpenLayers.Layer.Vector(name, config);
  },

  /**
   * Factory-Funktion zur Generierung einer leeren Hintergrundkarte
   *
   * @param {object} config - Die Layer-Konfiguration
   * @param {string} projection - wird nicht ausgewertet
   * @returns {OpenLayers.Layer}
   */
  'EMPTY': function(config, projection) {
    var config = OpenLayers.Util.extend({ name: 'Kein Hintergrund', isBaseLayer: true }, config);
    var name = config.name;
    delete config.name;

    return new OpenLayers.Layer(name, config);
  }

};

/**
 * Erstellt anhand eines Javascript Konfigurationsobjekt eine Layer-Instanz. Über das type-Attribut wird die
 * entsprechende Layer-Implementierung verwendet. Details dazu finden sich in der
 * <a href="../factories.html#layer">MapBuilder-Referenz</a>.
 * <p/>
 * Alternativ kann eine OpenLayers.Layer-Instanz direkt übergeben werden. Dies wird für den MapBuilder benötigt.
 *
 * @param {object|ObenLayers.Layer} config - config kann eine Instanz von OpenLayers.Layer sein
 *                                          (dann wird diese direkt zurückgegeben) oder ein object mit
 *                                          Layerkonfiguration. Letzteres wird zur Generierung eines Layer-Objekts der
 *                                          Factory-Funktion übergeben.
 * @param {string} config.type - Name der zu verwendenden Layerimplementierung. (s. keys in BKGWebMap.Layer.FACTORIES)<br/>
 *                               Folgende BKG-Dienste werden Unterstützt:
 *                               <ul>
 *                                   <li></li>
 *                               </ul>
 * @param {OpenLayers.Map} map - optionales Map-Objekt zur Ermittlung weiterer Parameter.
 * @return OpenLayers.Layer
 */
BKGWebMap.Layer.create = function(config, /* optional */ map) {
    var projection =  map ? map.projection : 'EPSG:25832';

    // Falls schon layer Objekt
    if (config instanceof OpenLayers.Layer) {
        return config;
    }

    // Kopie erstellen, damit Original erhalten bleibt
    var cfg = OpenLayers.Util.extend(null, config);
    // Komplexe Konfiguration
    var type = cfg.type;
    if(type in BKGWebMap.Layer.FACTORIES) {
        delete cfg.type;
        return BKGWebMap.Layer.FACTORIES[type](cfg, projection);
    } else {
        console.log('Error: Layerfactory ' + type + ' ist nicht bekannt!');
        return null;
    }
};