improve createLayer from WMTS Capabilities
This commit is contained in:
committed by
Stéphane Brunner
parent
da67953c61
commit
a662f82a1b
@@ -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
|
||||
@@ -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:
|
||||
@@ -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;
|
||||
@@ -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"
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user