improve createLayer from WMTS Capabilities

This commit is contained in:
Stéphane Brunner
2012-03-03 17:57:22 +01:00
committed by Stéphane Brunner
parent da67953c61
commit a662f82a1b
2 changed files with 106 additions and 42 deletions

View File

@@ -68,7 +68,12 @@ OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.Vers
* *
* Required config properties: * Required config properties:
* layer - {String} The layer identifier. * layer - {String} The layer identifier.
* matrixSet - {String} The matrix set identifier. *
* Optional config properties:
* matrixSet - {String} The matrix set identifier, required if there is
* more than one matrix set in the layer capabilities.
* style - {String} The name of the style
* param - {Object} The dimensions values eg: {"Year": "2012"}
* *
* Returns: * Returns:
* {<OpenLayers.Layer.WMTS>} A properly configured WMTS layer. Throws an * {<OpenLayers.Layer.WMTS>} A properly configured WMTS layer. Throws an
@@ -79,18 +84,11 @@ OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.Vers
var layer; var layer;
// confirm required properties are supplied in config // confirm required properties are supplied in config
var required = { if (!('layer' in config)) {
layer: true, throw new Error("Missing property 'layer' in configuration.");
matrixSet: true
};
for (var prop in required) {
if (!(prop in config)) {
throw new Error("Missing property '" + prop + "' in layer configuration.");
}
} }
var contents = capabilities.contents; var contents = capabilities.contents;
var matrixSet = contents.tileMatrixSets[config.matrixSet];
// find the layer definition with the given identifier // find the layer definition with the given identifier
var layers = contents.layers; var layers = contents.layers;
@@ -101,30 +99,95 @@ OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.Vers
break; break;
} }
} }
if (!layerDef) {
throw new Error("Layer not found");
}
if (layerDef && matrixSet) { // find the matrixSet definition
// get the default style for the layer var matrixSet;
var style; if (config.matrixSet) {
for (var i=0, ii=layerDef.styles.length; i<ii; ++i) { matrixSet = contents.tileMatrixSets[config.matrixSet];
style = layerDef.styles[i]; } else if (layerDef.tileMatrixSetLinks.length == 1) {
if (style.isDefault) { matrixSet = contents.tileMatrixSets[
break; layerDef.tileMatrixSetLinks[0].tileMatrixSet];
}
if (!matrixSet) {
throw new Error("matrixSet not found");
}
// get the default style for the layer
var style;
for (var i=0, ii=layerDef.styles.length; i<ii; ++i) {
style = layerDef.styles[i];
if (style.isDefault) {
break;
}
}
var requestEncoding = config.requestEncoding;
if (!requestEncoding) {
requestEncoding = "KVP";
if (capabilities.operationsMetadata.GetTile.dcp.http) {
var http = capabilities.operationsMetadata.GetTile.dcp.http;
// Get first get method
if (http.get[0].constraints) {
var constraints = http.get[0].constraints;
if (!constraints.GetEncoding.allowedValues.KVP &&
constraints.GetEncoding.allowedValues.REST) {
requestEncoding = "REST";
}
} }
} }
layer = new OpenLayers.Layer.WMTS(
OpenLayers.Util.applyDefaults(config, {
url: config.requestEncoding === "REST" && layerDef.resourceUrl ?
layerDef.resourceUrl.tile.template :
capabilities.operationsMetadata.GetTile.dcp.http.get[0].url,
name: layerDef.title,
style: style.identifier,
matrixIds: matrixSet.matrixIds,
tileFullExtent: matrixSet.bounds
})
);
} }
return layer;
var dimensions = [];
var params = config.params || {};
// to don't overwrite the changes in the applyDefaults
delete config.params;
for (var id = 0, ld = layerDef.dimensions.length ; id < ld ; id++) {
var dimension = layerDef.dimensions[id];
dimensions.push(dimension.identifier);
if (!params.hasOwnProperty(dimension.identifier)) {
params[dimension.identifier] = dimension['default'];
}
}
var projection = config.projection || matrixSet.supportedCRS.replace(
/urn:ogc:def:crs:(\w+):.+:(\w+)$/, "$1:$2");
var units = config.units ||
projection === "EPSG:4326" ? "degrees" : "m"
var resolutions = [];
if (config.isBaseLayer !== false) {
for (mid in matrixSet.matrixIds) {
if (matrixSet.matrixIds.hasOwnProperty(mid)) {
resolutions.push(
matrixSet.matrixIds[mid].scaleDenominator * 0.28E-3
/ OpenLayers.METERS_PER_INCH
/ OpenLayers.INCHES_PER_UNIT[units]);
}
}
}
return new OpenLayers.Layer.WMTS(
OpenLayers.Util.applyDefaults(config, {
url: requestEncoding === "REST" && layerDef.resourceUrl ?
layerDef.resourceUrl.tile.template :
capabilities.operationsMetadata.GetTile.dcp.http.get[0].url,
requestEncoding: requestEncoding,
name: layerDef.title,
style: style.identifier,
matrixIds: matrixSet.matrixIds,
matrixSet: matrixSet.identifier,
projection: projection,
units: units,
resolutions: config.isBaseLayer === false ? undefined :
resolutions,
tileFullExtent: matrixSet.bounds,
dimensions: dimensions,
params: params
})
);
}, },
CLASS_NAME: "OpenLayers.Format.WMTSCapabilities" CLASS_NAME: "OpenLayers.Format.WMTSCapabilities"

View File

@@ -106,6 +106,7 @@ OpenLayers.Layer.WMTS = OpenLayers.Class(OpenLayers.Layer.Grid, {
* *
* Matrix properties: * Matrix properties:
* identifier - {String} The matrix identifier (required). * identifier - {String} The matrix identifier (required).
* scaleDenominator - {Number} The matrix scale denominator.
* topLeftCorner - {<OpenLayers.LonLat>} The top left corner of the * topLeftCorner - {<OpenLayers.LonLat>} The top left corner of the
* matrix. Must be provided if different than the layer <tileOrigin>. * matrix. Must be provided if different than the layer <tileOrigin>.
* tileWidth - {Number} The tile width for the matrix. Must be provided * tileWidth - {Number} The tile width for the matrix. Must be provided