Merge pull request #180 from bartvde/wmscapsclean

add WMS GetCapabilities parser for WMS 1.1.0, 1.1.1, 1.1.1 WMS-C profile
This commit is contained in:
Bart van den Eijnden
2013-02-14 05:02:39 -08:00
29 changed files with 7527 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
goog.provide('ol.parser.ogc.ExceptionReport');
goog.require('goog.dom.xml');
goog.require('ol.parser.XML');
/**
* @constructor
* @extends {ol.parser.XML}
*/
ol.parser.ogc.ExceptionReport = function() {
var exceptionReader = function(node, exceptionReport) {
var exception = {
code: node.getAttribute('exceptionCode'),
locator: node.getAttribute('locator'),
texts: []
};
exceptionReport.exceptions.push(exception);
this.readChildNodes(node, exception);
};
var exceptionTextReader = function(node, exception) {
var text = this.getChildValue(node);
exception.texts.push(text);
};
this.readers = {
'http://www.opengis.net/ogc': {
'ServiceExceptionReport': function(node, obj) {
obj['exceptionReport'] = {};
obj['exceptionReport']['exceptions'] = [];
this.readChildNodes(node, obj['exceptionReport']);
},
'ServiceException': function(node, exceptionReport) {
var exception = {};
exception['code'] = node.getAttribute('code');
exception['locator'] = node.getAttribute('locator');
exception['text'] = this.getChildValue(node);
exceptionReport['exceptions'].push(exception);
}
},
'http://www.opengis.net/ows': {
'ExceptionReport': function(node, obj) {
obj.success = false;
obj.exceptionReport = {
version: node.getAttribute('version'),
language: node.getAttribute('language'),
exceptions: []
};
this.readChildNodes(node, obj.exceptionReport);
},
'Exception': function(node, exceptionReport) {
exceptionReader.apply(this, arguments);
},
'ExceptionText': function(node, exception) {
exceptionTextReader.apply(this, arguments);
}
},
'http://www.opengis.net/ows/1.1': {
'ExceptionReport': function(node, obj) {
obj.exceptionReport = {
version: node.getAttribute('version'),
language: node.getAttribute('xml:lang'),
exceptions: []
};
this.readChildNodes(node, obj.exceptionReport);
},
'Exception': function(node, exceptionReport) {
exceptionReader.apply(this, arguments);
},
'ExceptionText': function(node, exception) {
exceptionTextReader.apply(this, arguments);
}
}
};
goog.base(this);
};
goog.inherits(ol.parser.ogc.ExceptionReport, ol.parser.XML);
/**
* Read OGC exception report data from a string, and return an object with
* information about the exceptions.
*
* @param {string|Document} data to read/parse.
* @return {Object} Information about the exceptions that occurred.
*/
ol.parser.ogc.ExceptionReport.prototype.read = function(data) {
if (typeof data == 'string') {
data = goog.dom.xml.loadXml(data);
}
var exceptionInfo = {};
exceptionInfo['exceptionReport'] = null;
if (data) {
this.readChildNodes(data, exceptionInfo);
}
return exceptionInfo;
};

View File

@@ -0,0 +1,121 @@
goog.provide('ol.parser.ogc.Versioned');
goog.require('goog.dom.xml');
goog.require('ol.parser.ogc.ExceptionReport');
/**
* @constructor
* @param {Object} formatOptions Options which will be set on this object.
*/
ol.parser.ogc.Versioned = function(formatOptions) {
formatOptions = formatOptions || {};
this.options = formatOptions;
this.defaultVersion = formatOptions.defaultVersion || null;
this.version = formatOptions.version;
this.profile = formatOptions.profile;
if (formatOptions.allowFallback !== undefined) {
this.allowFallback = formatOptions.allowFallback;
} else {
this.allowFallback = false;
}
if (formatOptions.stringifyOutput !== undefined) {
this.stringifyOutput = formatOptions.stringifyOutput;
} else {
this.stringifyOutput = false;
}
};
/**
* @param {Element} root root element.
* @param {Object=} opt_options optional configuration object.
* @return {string} the version to use.
*/
ol.parser.ogc.Versioned.prototype.getVersion = function(root, opt_options) {
var version;
// read
if (root) {
version = this.version;
if (!version) {
version = root.getAttribute('version');
if (!version) {
version = this.defaultVersion;
}
}
} else {
// write
version = (opt_options && opt_options.version) ||
this.version || this.defaultVersion;
}
return version;
};
/**
* @param {string} version the version to use.
* @return {Object} the parser to use.
*/
ol.parser.ogc.Versioned.prototype.getParser = function(version) {
version = version || this.defaultVersion;
var profile = this.profile ? '_' + this.profile : '';
if (!this.parser || this.parser.VERSION != version) {
var format = this.parsers['v' + version.replace(/\./g, '_') + profile];
if (!format) {
if (profile !== '' && this.allowFallback) {
// fallback to the non-profiled version of the parser
profile = '';
format = this.parsers['v' + version.replace(/\./g, '_') + profile];
}
if (!format) {
throw 'Can\'t find a parser for version ' +
version + profile;
}
}
this.parser = new format(this.options);
}
return this.parser;
};
/**
* Write a document.
*
* @param {Object} obj An object representing the document.
* @param {Object=} opt_options Optional configuration object.
* @return {Element|string} the XML created.
*/
ol.parser.ogc.Versioned.prototype.write = function(obj, opt_options) {
var version = this.getVersion(null, opt_options);
this.parser = this.getParser(version);
var root = this.parser.write(obj, opt_options);
if (this.stringifyOutput === false) {
return root;
} else {
return goog.dom.xml.serialize(root);
}
};
/**
* @param {string|Document} data Data to read.
* @param {Object=} opt_options Options for the reader.
* @return {Object} An object representing the document.
*/
ol.parser.ogc.Versioned.prototype.read = function(data, opt_options) {
if (typeof data == 'string') {
data = goog.dom.xml.loadXml(data);
}
var root = data.documentElement;
var version = this.getVersion(root);
this.parser = this.getParser(version);
var obj = this.parser.read(data, opt_options);
var errorProperty = this.parser.errorProperty || null;
if (errorProperty !== null && obj[errorProperty] === undefined) {
// an error must have happened, so parse it and report back
var format = new ol.parser.ogc.ExceptionReport();
obj.error = format.read(data);
}
obj.version = version;
return obj;
};

View File

@@ -0,0 +1,2 @@
@exportSymbol ol.parser.ogc.WMSCapabilities
@exportProperty ol.parser.ogc.WMSCapabilities.prototype.read

View File

@@ -0,0 +1,58 @@
goog.provide('ol.parser.ogc.WMSCapabilities');
goog.require('ol.parser.ogc.Versioned');
goog.require('ol.parser.ogc.WMSCapabilities_v1_1_0');
goog.require('ol.parser.ogc.WMSCapabilities_v1_1_1');
goog.require('ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC');
goog.require('ol.parser.ogc.WMSCapabilities_v1_3_0');
/**
* @define {boolean} Whether to enable WMS Capabilities version 1.1.0.
*/
ol.ENABLE_WMSCAPS_1_1_0 = true;
/**
* @define {boolean} Whether to enable WMS Capabilities version 1.1.1.
*/
ol.ENABLE_WMSCAPS_1_1_1 = true;
/**
* @define {boolean} Whether to enable WMS Capabilities version 1.3.0.
*/
ol.ENABLE_WMSCAPS_1_3_0 = true;
/**
* @define {boolean} Whether to enable WMS Capabilities version 1.1.1.
* WMSC profile.
*/
ol.ENABLE_WMSCAPS_1_1_1_WMSC = true;
/**
* @constructor
* @param {Object=} opt_options Options which will be set on this object.
* @extends {ol.parser.ogc.Versioned}
*/
ol.parser.ogc.WMSCapabilities = function(opt_options) {
opt_options = opt_options || {};
opt_options['defaultVersion'] = '1.1.1';
this.parsers = {};
if (ol.ENABLE_WMSCAPS_1_1_0) {
this.parsers['v1_1_0'] = ol.parser.ogc.WMSCapabilities_v1_1_0;
}
if (ol.ENABLE_WMSCAPS_1_1_1) {
this.parsers['v1_1_1'] = ol.parser.ogc.WMSCapabilities_v1_1_1;
}
if (ol.ENABLE_WMSCAPS_1_1_1_WMSC) {
this.parsers['v1_1_1_WMSC'] = ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC;
}
if (ol.ENABLE_WMSCAPS_1_3_0) {
this.parsers['v1_3_0'] = ol.parser.ogc.WMSCapabilities_v1_3_0;
}
goog.base(this, opt_options);
};
goog.inherits(ol.parser.ogc.WMSCapabilities, ol.parser.ogc.Versioned);

View File

@@ -0,0 +1,320 @@
goog.provide('ol.parser.ogc.WMSCapabilities_v1');
goog.require('goog.dom.xml');
goog.require('goog.object');
goog.require('ol.parser.XML');
/**
* @constructor
* @extends {ol.parser.XML}
*/
ol.parser.ogc.WMSCapabilities_v1 = function() {
this.defaultNamespaceURI = 'http://www.opengis.net/wms';
this.errorProperty = 'service';
this.readers = {
'http://www.opengis.net/wms': {
'Service': function(node, obj) {
obj['service'] = {};
this.readChildNodes(node, obj['service']);
},
'Name': function(node, obj) {
obj.name = this.getChildValue(node);
},
'Title': function(node, obj) {
obj.title = this.getChildValue(node);
},
'Abstract': function(node, obj) {
obj['abstract'] = this.getChildValue(node);
},
'BoundingBox': function(node, obj) {
var bbox = {};
bbox.bbox = [
parseFloat(node.getAttribute('minx')),
parseFloat(node.getAttribute('miny')),
parseFloat(node.getAttribute('maxx')),
parseFloat(node.getAttribute('maxy'))
];
var res = {
x: parseFloat(node.getAttribute('resx')),
y: parseFloat(node.getAttribute('resy'))
};
if (! (isNaN(res.x) && isNaN(res.y))) {
bbox.res = res;
}
// return the bbox so that descendant classes can set the
// CRS and SRS and add it to the obj
return bbox;
},
'OnlineResource': function(node, obj) {
obj.href = this.getAttributeNS(node, 'http://www.w3.org/1999/xlink',
'href');
},
'ContactInformation': function(node, obj) {
obj.contactInformation = {};
this.readChildNodes(node, obj.contactInformation);
},
'ContactPersonPrimary': function(node, obj) {
obj.personPrimary = {};
this.readChildNodes(node, obj.personPrimary);
},
'ContactPerson': function(node, obj) {
obj.person = this.getChildValue(node);
},
'ContactOrganization': function(node, obj) {
obj.organization = this.getChildValue(node);
},
'ContactPosition': function(node, obj) {
obj.position = this.getChildValue(node);
},
'ContactAddress': function(node, obj) {
obj.contactAddress = {};
this.readChildNodes(node, obj.contactAddress);
},
'AddressType': function(node, obj) {
obj.type = this.getChildValue(node);
},
'Address': function(node, obj) {
obj.address = this.getChildValue(node);
},
'City': function(node, obj) {
obj.city = this.getChildValue(node);
},
'StateOrProvince': function(node, obj) {
obj.stateOrProvince = this.getChildValue(node);
},
'PostCode': function(node, obj) {
obj.postcode = this.getChildValue(node);
},
'Country': function(node, obj) {
obj.country = this.getChildValue(node);
},
'ContactVoiceTelephone': function(node, obj) {
obj.phone = this.getChildValue(node);
},
'ContactFacsimileTelephone': function(node, obj) {
obj.fax = this.getChildValue(node);
},
'ContactElectronicMailAddress': function(node, obj) {
obj.email = this.getChildValue(node);
},
'Fees': function(node, obj) {
var fees = this.getChildValue(node);
if (fees && fees.toLowerCase() != 'none') {
obj.fees = fees;
}
},
'AccessConstraints': function(node, obj) {
var constraints = this.getChildValue(node);
if (constraints && constraints.toLowerCase() != 'none') {
obj.accessConstraints = constraints;
}
},
'Capability': function(node, obj) {
obj.capability = {
nestedLayers: [],
layers: []
};
this.readChildNodes(node, obj.capability);
},
'Request': function(node, obj) {
obj.request = {};
this.readChildNodes(node, obj.request);
},
'GetCapabilities': function(node, obj) {
obj.getcapabilities = {formats: []};
this.readChildNodes(node, obj.getcapabilities);
},
'Format': function(node, obj) {
if (goog.isArray(obj.formats)) {
obj.formats.push(this.getChildValue(node));
} else {
obj.format = this.getChildValue(node);
}
},
'DCPType': function(node, obj) {
this.readChildNodes(node, obj);
},
'HTTP': function(node, obj) {
this.readChildNodes(node, obj);
},
'Get': function(node, obj) {
obj.get = {};
this.readChildNodes(node, obj.get);
// backwards compatibility
if (!obj.href) {
obj.href = obj.get.href;
}
},
'Post': function(node, obj) {
obj.post = {};
this.readChildNodes(node, obj.post);
// backwards compatibility
if (!obj.href) {
obj.href = obj.get.href;
}
},
'GetMap': function(node, obj) {
obj.getmap = {formats: []};
this.readChildNodes(node, obj.getmap);
},
'GetFeatureInfo': function(node, obj) {
obj.getfeatureinfo = {formats: []};
this.readChildNodes(node, obj.getfeatureinfo);
},
'Exception': function(node, obj) {
obj.exception = {formats: []};
this.readChildNodes(node, obj.exception);
},
'Layer': function(node, obj) {
var parentLayer, capability;
if (obj.capability) {
capability = obj.capability;
parentLayer = obj;
} else {
capability = obj;
}
var attrNode = node.getAttributeNode('queryable');
var queryable = (attrNode && attrNode.specified) ?
node.getAttribute('queryable') : null;
attrNode = node.getAttributeNode('cascaded');
var cascaded = (attrNode && attrNode.specified) ?
node.getAttribute('cascaded') : null;
attrNode = node.getAttributeNode('opaque');
var opaque = (attrNode && attrNode.specified) ?
node.getAttribute('opaque') : null;
var noSubsets = node.getAttribute('noSubsets');
var fixedWidth = node.getAttribute('fixedWidth');
var fixedHeight = node.getAttribute('fixedHeight');
var parent = parentLayer || {};
var layer = {
nestedLayers: [],
styles: parentLayer ? [].concat(parentLayer.styles) : [],
srs: {},
metadataURLs: [],
bbox: {},
llbbox: parent.llbbox,
dimensions: {},
authorityURLs: {},
identifiers: {},
keywords: [],
queryable: (queryable && queryable !== '') ?
(queryable === '1' || queryable === 'true') :
(parent.queryable || false),
cascaded: (cascaded !== null) ? parseInt(cascaded, 10) :
(parent.cascaded || 0),
opaque: opaque ?
(opaque === '1' || opaque === 'true') :
(parent.opaque || false),
noSubsets: (noSubsets !== null) ?
(noSubsets === '1' || noSubsets === 'true') :
(parent.noSubsets || false),
fixedWidth: (fixedWidth !== null) ?
parseInt(fixedWidth, 10) : (parent.fixedWidth || 0),
fixedHeight: (fixedHeight !== null) ?
parseInt(fixedHeight, 10) : (parent.fixedHeight || 0),
minScale: parent.minScale,
maxScale: parent.maxScale,
attribution: parent.attribution
};
if (parentLayer) {
goog.object.extend(layer.srs, parent.srs);
goog.object.extend(layer.bbox, parent.bbox);
goog.object.extend(layer.dimensions, parent.dimensions);
goog.object.extend(layer.authorityURLs, parent.authorityURLs);
}
obj.nestedLayers.push(layer);
layer.capability = capability;
this.readChildNodes(node, layer);
delete layer.capability;
if (layer.name) {
var parts = layer.name.split(':'),
request = capability.request,
gfi = request.getfeatureinfo;
if (parts.length > 0) {
layer.prefix = parts[0];
}
capability.layers.push(layer);
if (layer.formats === undefined) {
layer.formats = request.getmap.formats;
}
if (layer.infoFormats === undefined && gfi) {
layer.infoFormats = gfi.formats;
}
}
},
'Attribution': function(node, obj) {
obj.attribution = {};
this.readChildNodes(node, obj.attribution);
},
'LogoURL': function(node, obj) {
obj.logo = {
width: node.getAttribute('width'),
height: node.getAttribute('height')
};
this.readChildNodes(node, obj.logo);
},
'Style': function(node, obj) {
var style = {};
obj.styles.push(style);
this.readChildNodes(node, style);
},
'LegendURL': function(node, obj) {
var legend = {
width: node.getAttribute('width'),
height: node.getAttribute('height')
};
obj.legend = legend;
this.readChildNodes(node, legend);
},
'MetadataURL': function(node, obj) {
var metadataURL = {type: node.getAttribute('type')};
obj.metadataURLs.push(metadataURL);
this.readChildNodes(node, metadataURL);
},
'DataURL': function(node, obj) {
obj.dataURL = {};
this.readChildNodes(node, obj.dataURL);
},
'FeatureListURL': function(node, obj) {
obj.featureListURL = {};
this.readChildNodes(node, obj.featureListURL);
},
'AuthorityURL': function(node, obj) {
var name = node.getAttribute('name');
var authority = {};
this.readChildNodes(node, authority);
obj.authorityURLs[name] = authority.href;
},
'Identifier': function(node, obj) {
var authority = node.getAttribute('authority');
obj.identifiers[authority] = this.getChildValue(node);
},
'KeywordList': function(node, obj) {
this.readChildNodes(node, obj);
},
'SRS': function(node, obj) {
obj.srs[this.getChildValue(node)] = true;
}
}
};
goog.base(this);
};
goog.inherits(ol.parser.ogc.WMSCapabilities_v1, ol.parser.XML);
/**
* @param {string|Document|Element} data Data to read.
* @return {Object} An object representing the document.
*/
ol.parser.ogc.WMSCapabilities_v1.prototype.read = function(data) {
if (typeof data == 'string') {
data = goog.dom.xml.loadXml(data);
}
if (data && data.nodeType == 9) {
data = data.documentElement;
}
var obj = {};
this.readNode(data, obj);
return obj;
};

View File

@@ -0,0 +1,99 @@
goog.provide('ol.parser.ogc.WMSCapabilities_v1_1');
goog.require('ol.parser.ogc.WMSCapabilities_v1');
/**
* @constructor
* @extends {ol.parser.ogc.WMSCapabilities_v1}
*/
ol.parser.ogc.WMSCapabilities_v1_1 = function() {
goog.base(this);
var bboxreader = this.readers['http://www.opengis.net/wms']['BoundingBox'];
goog.object.extend(this.readers['http://www.opengis.net/wms'], {
'WMT_MS_Capabilities': function(node, obj) {
this.readChildNodes(node, obj);
},
'Keyword': function(node, obj) {
if (obj.keywords) {
obj.keywords.push({value: this.getChildValue(node)});
}
},
'DescribeLayer': function(node, obj) {
obj.describelayer = {formats: []};
this.readChildNodes(node, obj.describelayer);
},
'GetLegendGraphic': function(node, obj) {
obj.getlegendgraphic = {formats: []};
this.readChildNodes(node, obj.getlegendgraphic);
},
'GetStyles': function(node, obj) {
obj.getstyles = {formats: []};
this.readChildNodes(node, obj.getstyles);
},
'PutStyles': function(node, obj) {
obj.putstyles = {formats: []};
this.readChildNodes(node, obj.putstyles);
},
'UserDefinedSymbolization': function(node, obj) {
var userSymbols = {
supportSLD: parseInt(node.getAttribute('SupportSLD'), 10) == 1,
userLayer: parseInt(node.getAttribute('UserLayer'), 10) == 1,
userStyle: parseInt(node.getAttribute('UserStyle'), 10) == 1,
remoteWFS: parseInt(node.getAttribute('RemoteWFS'), 10) == 1
};
obj.userSymbols = userSymbols;
},
'LatLonBoundingBox': function(node, obj) {
obj.llbbox = [
parseFloat(node.getAttribute('minx')),
parseFloat(node.getAttribute('miny')),
parseFloat(node.getAttribute('maxx')),
parseFloat(node.getAttribute('maxy'))
];
},
'BoundingBox': function(node, obj) {
var bbox = bboxreader.apply(this, arguments);
bbox.srs = node.getAttribute('SRS');
obj.bbox[bbox.srs] = bbox;
},
'ScaleHint': function(node, obj) {
var min = parseFloat(node.getAttribute('min'));
var max = parseFloat(node.getAttribute('max'));
var rad2 = Math.pow(2, 0.5);
var dpi = (25.4 / 0.28);
var ipm = 39.37;
if (min !== 0) {
obj.maxScale = parseFloat((min / rad2) * ipm * dpi);
}
if (max != Number.POSITIVE_INFINITY) {
obj.minScale = parseFloat((max / rad2) * ipm * dpi);
}
},
'Dimension': function(node, obj) {
var name = node.getAttribute('name').toLowerCase();
var dim = {
name: name,
units: node.getAttribute('units'),
unitsymbol: node.getAttribute('unitSymbol')
};
obj.dimensions[dim.name] = dim;
},
'Extent': function(node, obj) {
var name = node.getAttribute('name').toLowerCase();
if (name in obj['dimensions']) {
var extent = obj.dimensions[name];
extent.nearestVal =
node.getAttribute('nearestValue') === '1';
extent.multipleVal =
node.getAttribute('multipleValues') === '1';
extent.current = node.getAttribute('current') === '1';
extent['default'] = node.getAttribute('default') || '';
var values = this.getChildValue(node);
extent.values = values.split(',');
}
}
});
};
goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1,
ol.parser.ogc.WMSCapabilities_v1);

View File

@@ -0,0 +1,25 @@
goog.provide('ol.parser.ogc.WMSCapabilities_v1_1_0');
goog.require('ol.parser.ogc.WMSCapabilities_v1_1');
/**
* @constructor
* @extends {ol.parser.ogc.WMSCapabilities_v1_1}
*/
ol.parser.ogc.WMSCapabilities_v1_1_0 = function() {
goog.base(this);
this.version = '1.1.0';
goog.object.extend(this.readers['http://www.opengis.net/wms'], {
'SRS': function(node, obj) {
var srs = this.getChildValue(node);
var values = srs.split(/ +/);
for (var i = 0, len = values.length; i < len; i++) {
obj.srs[values[i]] = true;
}
}
});
};
goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_0,
ol.parser.ogc.WMSCapabilities_v1_1);

View File

@@ -0,0 +1,21 @@
goog.provide('ol.parser.ogc.WMSCapabilities_v1_1_1');
goog.require('ol.parser.ogc.WMSCapabilities_v1_1');
/**
* @constructor
* @extends {ol.parser.ogc.WMSCapabilities_v1_1}
*/
ol.parser.ogc.WMSCapabilities_v1_1_1 = function() {
goog.base(this);
this.version = '1.1.1';
goog.object.extend(this.readers['http://www.opengis.net/wms'], {
'SRS': function(node, obj) {
obj.srs[this.getChildValue(node)] = true;
}
});
};
goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_1,
ol.parser.ogc.WMSCapabilities_v1_1);

View File

@@ -0,0 +1,46 @@
goog.provide('ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC');
goog.require('ol.parser.ogc.WMSCapabilities_v1_1_1');
/**
* @constructor
* @extends {ol.parser.ogc.WMSCapabilities_v1_1_1}
*/
ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC = function() {
goog.base(this);
this.profile = 'WMSC';
goog.object.extend(this.readers['http://www.opengis.net/wms'], {
'VendorSpecificCapabilities': function(node, obj) {
obj.vendorSpecific = {tileSets: []};
this.readChildNodes(node, obj.vendorSpecific);
},
'TileSet': function(node, vendorSpecific) {
var tileset = {srs: {}, bbox: {}, resolutions: []};
this.readChildNodes(node, tileset);
vendorSpecific.tileSets.push(tileset);
},
'Resolutions': function(node, tileset) {
var res = this.getChildValue(node).split(' ');
for (var i = 0, len = res.length; i < len; i++) {
if (res[i] !== '') {
tileset.resolutions.push(parseFloat(res[i]));
}
}
},
'Width': function(node, tileset) {
tileset.width = parseInt(this.getChildValue(node), 10);
},
'Height': function(node, tileset) {
tileset.height = parseInt(this.getChildValue(node), 10);
},
'Layers': function(node, tileset) {
tileset.layers = this.getChildValue(node);
},
'Styles': function(node, tileset) {
tileset.styles = this.getChildValue(node);
}
});
};
goog.inherits(ol.parser.ogc.WMSCapabilities_v1_1_1_WMSC,
ol.parser.ogc.WMSCapabilities_v1_1_1);

View File

@@ -0,0 +1,109 @@
goog.provide('ol.parser.ogc.WMSCapabilities_v1_3_0');
goog.require('ol.parser.ogc.WMSCapabilities_v1');
/**
* @constructor
* @extends {ol.parser.ogc.WMSCapabilities_v1}
*/
ol.parser.ogc.WMSCapabilities_v1_3_0 = function() {
goog.base(this);
var bboxreader = this.readers['http://www.opengis.net/wms']['BoundingBox'];
goog.object.extend(this.readers['http://www.opengis.net/wms'], {
'WMS_Capabilities': function(node, obj) {
this.readChildNodes(node, obj);
},
'LayerLimit': function(node, obj) {
obj.layerLimit = parseInt(this.getChildValue(node), 10);
},
'MaxWidth': function(node, obj) {
obj.maxWidth = parseInt(this.getChildValue(node), 10);
},
'MaxHeight': function(node, obj) {
obj.maxHeight = parseInt(this.getChildValue(node), 10);
},
'BoundingBox': function(node, obj) {
var bbox = bboxreader.apply(this, arguments);
bbox.srs = node.getAttribute('CRS');
obj.bbox[bbox.srs] = bbox;
},
'CRS': function(node, obj) {
// CRS is the synonym of SRS
this.readers['http://www.opengis.net/wms']['SRS'].apply(this, arguments);
},
'EX_GeographicBoundingBox': function(node, obj) {
// replacement of LatLonBoundingBox
obj.llbbox = [];
this.readChildNodes(node, obj.llbbox);
},
'westBoundLongitude': function(node, obj) {
obj[0] = this.getChildValue(node);
},
'eastBoundLongitude': function(node, obj) {
obj[2] = this.getChildValue(node);
},
'southBoundLatitude': function(node, obj) {
obj[1] = this.getChildValue(node);
},
'northBoundLatitude': function(node, obj) {
obj[3] = this.getChildValue(node);
},
'MinScaleDenominator': function(node, obj) {
obj.maxScale = parseFloat(this.getChildValue(node)).toPrecision(16);
},
'MaxScaleDenominator': function(node, obj) {
obj.minScale = parseFloat(this.getChildValue(node)).toPrecision(16);
},
'Dimension': function(node, obj) {
// dimension has extra attributes: default, multipleValues,
// nearestValue, current which used to be part of Extent. It now
// also contains the values.
var name = node.getAttribute('name').toLowerCase();
var dim = {
name: name,
units: node.getAttribute('units'),
unitsymbol: node.getAttribute('unitSymbol'),
nearestVal: node.getAttribute('nearestValue') === '1',
multipleVal: node.getAttribute('multipleValues') === '1',
'default': node.getAttribute('default') || '',
current: node.getAttribute('current') === '1',
values: this.getChildValue(node).split(',')
};
// Theoretically there can be more dimensions with the same
// name, but with a different unit. Until we meet such a case,
// let's just keep the same structure as the WMS 1.1
// GetCapabilities parser uses. We will store the last
// one encountered.
obj.dimensions[dim.name] = dim;
},
'Keyword': function(node, obj) {
var keyword = {value: this.getChildValue(node),
vocabulary: node.getAttribute('vocabulary')};
if (obj.keywords) {
obj.keywords.push(keyword);
}
}
});
this.readers['sld'] = {
'UserDefinedSymbolization': function(node, obj) {
var readers = this.readers['http://www.opengis.net/wms'];
readers.UserDefinedSymbolization.apply(this, arguments);
// add the two extra attributes
var value = node.getAttribute('InlineFeature');
obj['userSymbols'].inlineFeature = parseInt(value, 10) == 1;
value = node.getAttribute('RemoteWCS');
obj['userSymbols'].remoteWCS = parseInt(value, 10) == 1;
},
'DescribeLayer': function(node, obj) {
var readers = this.readers['http://www.opengis.net/wms'];
readers.DescribeLayer.apply(this, arguments);
},
'GetLegendGraphic': function(node, obj) {
var readers = this.readers['http://www.opengis.net/wms'];
readers.GetLegendGraphic.apply(this, arguments);
}
};
};
goog.inherits(ol.parser.ogc.WMSCapabilities_v1_3_0,
ol.parser.ogc.WMSCapabilities_v1);

141
src/ol/parser/xml.js Normal file
View File

@@ -0,0 +1,141 @@
goog.provide('ol.parser.XML');
/**
* @constructor
*/
ol.parser.XML = function() {
};
/**
* Shorthand for applying one of the named readers given the node
* namespace and local name. Readers take two args (node, obj) and
* generally extend or modify the second.
*
* @param {Element|Document} node The node to be read (required).
* @param {Object} obj The object to be modified (optional).
* @return {Object} The input object, modified (or a new one if none was
* provided).
*/
ol.parser.XML.prototype.readNode = function(node, obj) {
if (!obj) {
obj = {};
}
var group = this.readers[node.namespaceURI] ||
this.readers[this.defaultNamespaceURI];
if (group) {
var local = node.localName || node.nodeName.split(':').pop();
var reader = group[local] || group['*'];
if (reader) {
reader.apply(this, [node, obj]);
}
}
return obj;
};
/**
* Shorthand for applying the named readers to all children of a node.
* For each child of type 1 (element), <readSelf> is called.
*
* @param {Element|Document} node The node to be read (required).
* @param {Object} obj The object to be modified (optional).
* @return {Object} The input object, modified.
*/
ol.parser.XML.prototype.readChildNodes = function(node, obj) {
if (!obj) {
obj = {};
}
var children = node.childNodes;
var child;
for (var i = 0, len = children.length; i < len; ++i) {
child = children[i];
if (child.nodeType == 1) {
this.readNode(child, obj);
}
}
return obj;
};
/**
* Get the textual value of the node if it exists, or return an
* optional default string. Returns an empty string if no first child
* exists and no default value is supplied.
*
* @param {Element} node The element used to look for a first child value.
* @param {string} def Optional string to return in the event that no
* first child value exists.
* @return {string} The value of the first child of the given node.
*/
ol.parser.XML.prototype.getChildValue = function(node, def) {
var value = def || '';
if (node) {
for (var child = node.firstChild; child; child = child.nextSibling) {
switch (child.nodeType) {
case 3: // text node
case 4: // cdata section
value += child.nodeValue;
break;
default:
break;
}
}
}
return value;
};
/**
* Get an attribute node given the namespace URI and local name.
*
* @param {Element} node Node on which to search for attribute nodes.
* @param {string} uri Namespace URI.
* @param {string} name Local name of the attribute (without the prefix).
* @return {?Element} An attribute node or null if none found.
*/
ol.parser.XML.prototype.getAttributeNodeNS = function(node, uri, name) {
var attributeNode = null;
if (node.getAttributeNodeNS) {
attributeNode = node.getAttributeNodeNS(uri, name);
} else {
var attributes = node.attributes;
var potentialNode, fullName;
for (var i = 0, len = attributes.length; i < len; ++i) {
potentialNode = attributes[i];
if (potentialNode.namespaceURI == uri) {
fullName = (potentialNode.prefix) ?
(potentialNode.prefix + ':' + name) : name;
if (fullName == potentialNode.nodeName) {
attributeNode = potentialNode;
break;
}
}
}
}
return attributeNode;
};
/**
* Get an attribute value given the namespace URI and local name.
*
* @param {Element} node Node on which to search for an attribute.
* @param {string} uri Namespace URI.
* @param {string} name Local name of the attribute (without the prefix).
* @return {string} An attribute value or and empty string if none found.
*/
ol.parser.XML.prototype.getAttributeNS = function(node, uri, name) {
var attributeValue = '';
if (node.getAttributeNS) {
attributeValue = node.getAttributeNS(uri, name) || '';
} else {
var attributeNode = this.getAttributeNodeNS(node, uri, name);
if (attributeNode) {
attributeValue = attributeNode.nodeValue;
}
}
return attributeValue;
};