diff options
author | Chris Schlaeger <chris@linux.com> | 2014-08-12 21:56:44 +0200 |
---|---|---|
committer | Chris Schlaeger <chris@linux.com> | 2014-08-12 21:56:44 +0200 |
commit | ea346a785dc1b3f7c156f6fc33da634e1f1a627b (patch) | |
tree | af67530553d20b6e82ad60fd79593e9c4abf5565 /misc/openlayers/lib/OpenLayers/Format/WMSGetFeatureInfo.js | |
parent | 59741cd535c47f25971bf8c32b25da25ceadc6d5 (diff) | |
download | postrunner-ea346a785dc1b3f7c156f6fc33da634e1f1a627b.zip |
Adding jquery, flot and openlayers to be included with the GEM.v0.0.4
Diffstat (limited to 'misc/openlayers/lib/OpenLayers/Format/WMSGetFeatureInfo.js')
-rw-r--r-- | misc/openlayers/lib/OpenLayers/Format/WMSGetFeatureInfo.js | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/misc/openlayers/lib/OpenLayers/Format/WMSGetFeatureInfo.js b/misc/openlayers/lib/OpenLayers/Format/WMSGetFeatureInfo.js new file mode 100644 index 0000000..57eb219 --- /dev/null +++ b/misc/openlayers/lib/OpenLayers/Format/WMSGetFeatureInfo.js @@ -0,0 +1,296 @@ +/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for + * full list of contributors). Published under the 2-clause BSD license. + * See license.txt in the OpenLayers distribution or repository for the + * full text of the license. */ + +/** + * @requires OpenLayers/Format/XML.js + */ + +/** + * Class: OpenLayers.Format.WMSGetFeatureInfo + * Class to read GetFeatureInfo responses from Web Mapping Services + * + * Inherits from: + * - <OpenLayers.Format.XML> + */ +OpenLayers.Format.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Format.XML, { + + /** + * APIProperty: layerIdentifier + * {String} All xml nodes containing this search criteria will populate an + * internal array of layer nodes. + */ + layerIdentifier: '_layer', + + /** + * APIProperty: featureIdentifier + * {String} All xml nodes containing this search criteria will populate an + * internal array of feature nodes for each layer node found. + */ + featureIdentifier: '_feature', + + /** + * Property: regExes + * Compiled regular expressions for manipulating strings. + */ + regExes: { + trimSpace: (/^\s*|\s*$/g), + removeSpace: (/\s*/g), + splitSpace: (/\s+/), + trimComma: (/\s*,\s*/g) + }, + + /** + * Property: gmlFormat + * {<OpenLayers.Format.GML>} internal GML format for parsing geometries + * in msGMLOutput + */ + gmlFormat: null, + + /** + * Constructor: OpenLayers.Format.WMSGetFeatureInfo + * Create a new parser for WMS GetFeatureInfo responses + * + * Parameters: + * options - {Object} An optional object whose properties will be set on + * this instance. + */ + + /** + * APIMethod: read + * Read WMS GetFeatureInfo data from a string, and return an array of features + * + * Parameters: + * data - {String} or {DOMElement} data to read/parse. + * + * Returns: + * {Array(<OpenLayers.Feature.Vector>)} An array of features. + */ + read: function(data) { + var result; + if(typeof data == "string") { + data = OpenLayers.Format.XML.prototype.read.apply(this, [data]); + } + var root = data.documentElement; + if(root) { + var scope = this; + var read = this["read_" + root.nodeName]; + if(read) { + result = read.call(this, root); + } else { + // fall-back to GML since this is a common output format for WMS + // GetFeatureInfo responses + result = new OpenLayers.Format.GML((this.options ? this.options : {})).read(data); + } + } else { + result = data; + } + return result; + }, + + + /** + * Method: read_msGMLOutput + * Parse msGMLOutput nodes. + * + * Parameters: + * data - {DOMElement} + * + * Returns: + * {Array} + */ + read_msGMLOutput: function(data) { + var response = []; + var layerNodes = this.getSiblingNodesByTagCriteria(data, + this.layerIdentifier); + if (layerNodes) { + for (var i=0, len=layerNodes.length; i<len; ++i) { + var node = layerNodes[i]; + var layerName = node.nodeName; + if (node.prefix) { + layerName = layerName.split(':')[1]; + } + var layerName = layerName.replace(this.layerIdentifier, ''); + var featureNodes = this.getSiblingNodesByTagCriteria(node, + this.featureIdentifier); + if (featureNodes) { + for (var j = 0; j < featureNodes.length; j++) { + var featureNode = featureNodes[j]; + var geomInfo = this.parseGeometry(featureNode); + var attributes = this.parseAttributes(featureNode); + var feature = new OpenLayers.Feature.Vector(geomInfo.geometry, + attributes, null); + feature.bounds = geomInfo.bounds; + feature.type = layerName; + response.push(feature); + } + } + } + } + return response; + }, + + /** + * Method: read_FeatureInfoResponse + * Parse FeatureInfoResponse nodes. + * + * Parameters: + * data - {DOMElement} + * + * Returns: + * {Array} + */ + read_FeatureInfoResponse: function(data) { + var response = []; + var featureNodes = this.getElementsByTagNameNS(data, '*', + 'FIELDS'); + + for(var i=0, len=featureNodes.length;i<len;i++) { + var featureNode = featureNodes[i]; + var geom = null; + + // attributes can be actual attributes on the FIELDS tag, + // or FIELD children + var attributes = {}; + var j; + var jlen = featureNode.attributes.length; + if (jlen > 0) { + for(j=0; j<jlen; j++) { + var attribute = featureNode.attributes[j]; + attributes[attribute.nodeName] = attribute.nodeValue; + } + } else { + var nodes = featureNode.childNodes; + for (j=0, jlen=nodes.length; j<jlen; ++j) { + var node = nodes[j]; + if (node.nodeType != 3) { + attributes[node.getAttribute("name")] = + node.getAttribute("value"); + } + } + } + + response.push( + new OpenLayers.Feature.Vector(geom, attributes, null) + ); + } + return response; + }, + + /** + * Method: getSiblingNodesByTagCriteria + * Recursively searches passed xml node and all it's descendant levels for + * nodes whose tagName contains the passed search string. This returns an + * array of all sibling nodes which match the criteria from the highest + * hierarchial level from which a match is found. + * + * Parameters: + * node - {DOMElement} An xml node + * criteria - {String} Search string which will match some part of a tagName + * + * Returns: + * Array({DOMElement}) An array of sibling xml nodes + */ + getSiblingNodesByTagCriteria: function(node, criteria){ + var nodes = []; + var children, tagName, n, matchNodes, child; + if (node && node.hasChildNodes()) { + children = node.childNodes; + n = children.length; + + for(var k=0; k<n; k++){ + child = children[k]; + while (child && child.nodeType != 1) { + child = child.nextSibling; + k++; + } + tagName = (child ? child.nodeName : ''); + if (tagName.length > 0 && tagName.indexOf(criteria) > -1) { + nodes.push(child); + } else { + matchNodes = this.getSiblingNodesByTagCriteria( + child, criteria); + + if(matchNodes.length > 0){ + (nodes.length == 0) ? + nodes = matchNodes : nodes.push(matchNodes); + } + } + } + + } + return nodes; + }, + + /** + * Method: parseAttributes + * + * Parameters: + * node - {<DOMElement>} + * + * Returns: + * {Object} An attributes object. + * + * Notes: + * Assumes that attributes are direct child xml nodes of the passed node + * and contain only a single text node. + */ + parseAttributes: function(node){ + var attributes = {}; + if (node.nodeType == 1) { + var children = node.childNodes; + var n = children.length; + for (var i = 0; i < n; ++i) { + var child = children[i]; + if (child.nodeType == 1) { + var grandchildren = child.childNodes; + var name = (child.prefix) ? + child.nodeName.split(":")[1] : child.nodeName; + if (grandchildren.length == 0) { + attributes[name] = null; + } else if (grandchildren.length == 1) { + var grandchild = grandchildren[0]; + if (grandchild.nodeType == 3 || + grandchild.nodeType == 4) { + var value = grandchild.nodeValue.replace( + this.regExes.trimSpace, ""); + attributes[name] = value; + } + } + } + } + } + return attributes; + }, + + /** + * Method: parseGeometry + * Parse the geometry and the feature bounds out of the node using + * Format.GML + * + * Parameters: + * node - {<DOMElement>} + * + * Returns: + * {Object} An object containing the geometry and the feature bounds + */ + parseGeometry: function(node) { + // we need to use the old Format.GML parser since we do not know the + // geometry name + if (!this.gmlFormat) { + this.gmlFormat = new OpenLayers.Format.GML(); + } + var feature = this.gmlFormat.parseFeature(node); + var geometry, bounds = null; + if (feature) { + geometry = feature.geometry && feature.geometry.clone(); + bounds = feature.bounds && feature.bounds.clone(); + feature.destroy(); + } + return {geometry: geometry, bounds: bounds}; + }, + + CLASS_NAME: "OpenLayers.Format.WMSGetFeatureInfo" + +}); |