318 lines
11 KiB
JavaScript
318 lines
11 KiB
JavaScript
goog.provide('ol.parser.ogc.WMSCapabilities_v1');
|
|
goog.require('goog.dom.xml');
|
|
goog.require('goog.object');
|
|
goog.require('ol.parser.XML');
|
|
|
|
|
|
|
|
/**
|
|
* Read [WMS](http://www.opengeospatial.org/standards/wms) capabilities
|
|
*
|
|
* @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'] = {};
|
|
obj['capability']['nestedLayers'] = [];
|
|
obj['capability']['layers'] = [];
|
|
this.readChildNodes(node, obj['capability']);
|
|
},
|
|
'Request': function(node, obj) {
|
|
obj['request'] = {};
|
|
this.readChildNodes(node, obj['request']);
|
|
},
|
|
'GetCapabilities': function(node, obj) {
|
|
obj['getcapabilities'] = {};
|
|
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']);
|
|
},
|
|
'Post': function(node, obj) {
|
|
obj['post'] = {};
|
|
this.readChildNodes(node, obj['post']);
|
|
},
|
|
'GetMap': function(node, obj) {
|
|
obj['getmap'] = {};
|
|
obj['getmap']['formats'] = [];
|
|
this.readChildNodes(node, obj['getmap']);
|
|
},
|
|
'GetFeatureInfo': function(node, obj) {
|
|
obj['getfeatureinfo'] = {};
|
|
obj['getfeatureinfo']['formats'] = [];
|
|
this.readChildNodes(node, obj['getfeatureinfo']);
|
|
},
|
|
'Exception': function(node, obj) {
|
|
obj['exception'] = {};
|
|
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 (!goog.isDef(layer['formats'])) {
|
|
layer['formats'] = request['getmap']['formats'];
|
|
}
|
|
if (!goog.isDef(layer['infoFormats']) && 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 (goog.isString(data)) {
|
|
data = goog.dom.xml.loadXml(data);
|
|
}
|
|
if (data && data.nodeType == 9) {
|
|
data = data.documentElement;
|
|
}
|
|
var obj = {};
|
|
this.readNode(data, obj);
|
|
return obj;
|
|
};
|