Skip to content

Commit

Permalink
improve createLayer from WMTS Capabilities
Browse files Browse the repository at this point in the history
  • Loading branch information
Stéphane Brunner authored and sbrunner committed Jun 11, 2012
1 parent da67953 commit a662f82
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 42 deletions.
147 changes: 105 additions & 42 deletions lib/OpenLayers/Format/WMTSCapabilities.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,27 @@
/**
* @requires OpenLayers/Format/XML/VersionedOGC.js
*/

/**
* Class: OpenLayers.Format.WMTSCapabilities
* Read WMTS Capabilities.
*
*
* Inherits from:
* - <OpenLayers.Format.XML.VersionedOGC>
*/
OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC, {

/**
* APIProperty: defaultVersion
* {String} Version number to assume if none found. Default is "1.0.0".
*/
defaultVersion: "1.0.0",

/**
* APIProperty: yx
* {Object} Members in the yx object are used to determine if a CRS URN
* corresponds to a CRS with y,x axis order. Member names are CRS URNs
* and values are boolean. By default, the following CRS URN are
* and values are boolean. By default, the following CRS URN are
* assumed to correspond to a CRS with y,x axis order:
*
* * urn:ogc:def:crs:EPSG::4326
Expand All @@ -48,8 +48,8 @@ OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.Vers
* APIMethod: read
* Read capabilities data from a string, and return information about
* the service (offering and observedProperty mostly).
*
* Parameters:
*
* Parameters:
* data - {String} or {DOMElement} data to read/parse.
*
* Returns:
Expand All @@ -61,36 +61,34 @@ OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.Vers
* Create a WMTS layer given a capabilities object.
*
* Parameters:
* capabilities - {Object} The object returned from a <read> call to this
* capabilities - {Object} The object returned from a <read> call to this
* format.
* config - {Object} Configuration properties for the layer. Defaults for
* the layer will apply if not provided.
*
* Required config properties:
* 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:
* {<OpenLayers.Layer.WMTS>} A properly configured WMTS layer. Throws an
* error if an incomplete config is provided. Returns undefined if no
* layer could be created with the provided config.
*/
*/
createLayer: function(capabilities, config) {
var layer;

// confirm required properties are supplied in config
var required = {
layer: true,
matrixSet: true
};
for (var prop in required) {
if (!(prop in config)) {
throw new Error("Missing property '" + prop + "' in layer configuration.");
}
if (!('layer' in config)) {
throw new Error("Missing property 'layer' in configuration.");
}

var contents = capabilities.contents;
var matrixSet = contents.tileMatrixSets[config.matrixSet];

// find the layer definition with the given identifier
var layers = contents.layers;
Expand All @@ -101,32 +99,97 @@ OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML.Vers
break;
}
}

if (layerDef && matrixSet) {
// 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;
if (!layerDef) {
throw new Error("Layer not found");
}

// find the matrixSet definition
var matrixSet;
if (config.matrixSet) {
matrixSet = contents.tileMatrixSets[config.matrixSet];
} else if (layerDef.tileMatrixSetLinks.length == 1) {
matrixSet = contents.tileMatrixSets[
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"

});
1 change: 1 addition & 0 deletions lib/OpenLayers/Layer/WMTS.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ OpenLayers.Layer.WMTS = OpenLayers.Class(OpenLayers.Layer.Grid, {
*
* Matrix properties:
* identifier - {String} The matrix identifier (required).
* scaleDenominator - {Number} The matrix scale denominator.
* topLeftCorner - {<OpenLayers.LonLat>} The top left corner of the
* matrix. Must be provided if different than the layer <tileOrigin>.
* tileWidth - {Number} The tile width for the matrix. Must be provided
Expand Down

0 comments on commit a662f82

Please sign in to comment.