/*
* 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;
}
};