diff --git a/lib/OpenLayers/Format/GML.js b/lib/OpenLayers/Format/GML.js index c339ad201b..926bfb7d5c 100644 --- a/lib/OpenLayers/Format/GML.js +++ b/lib/OpenLayers/Format/GML.js @@ -3,78 +3,86 @@ * for the full text of the license. */ /** - * @requires OpenLayers/Format.js + * @requires OpenLayers/Format/XML.js * @requires OpenLayers/Feature/Vector.js - * @requires OpenLayers/Ajax.js * @requires OpenLayers/Geometry.js * * Class: OpenLayers.Format.GML * Read/Wite GML. Create a new instance with the - * constructor. + * constructor. Supports the GML simple features profile. * * Inherits from: * - */ -OpenLayers.Format.GML = OpenLayers.Class(OpenLayers.Format, { +OpenLayers.Format.GML = OpenLayers.Class(OpenLayers.Format.XML, { /* * APIProperty: featureNS - * Namespace used for feature attributes. Default matches the NS - * used by MapServer output. + * {String} Namespace used for feature attributes. Default is + * "http://mapserver.gis.umn.edu/mapserver". */ featureNS: "http://mapserver.gis.umn.edu/mapserver", + /** + * APIProperty: featurePrefix + * {String} Namespace alias (or prefix) for feature nodes. Default is + * "feature". + */ + featurePrefix: "feature", + /* * APIProperty: featureName - * element name for features. Default is 'featureMember'. + * {String} Element name for features. Default is "featureMember". */ featureName: "featureMember", /* * APIProperty: layerName - * Name of data layer. Default is 'features'. + * {String} Name of data layer. Default is "features". */ - layerName: "features", /** * APIProperty: geometry - * Name of geometry element. + * {String} Name of geometry element. Defaults to "geometry". */ geometryName: "geometry", /** * APIProperty: collectionName - * Name of featureCollection element + * {String} Name of featureCollection element. */ collectionName: "FeatureCollection", /** * APIProperty: gmlns - * GML Namespace + * {String} GML Namespace. */ gmlns: "http://www.opengis.net/gml", - /** * APIProperty: extractAttributes - * {Boolean} Extract attributes from GML. Most of the time, this is a - * significant time usage, due to the need to recursively descend the XML - * to search for attributes. + * {Boolean} Extract attributes from GML. */ extractAttributes: true, - /** * Constructor: OpenLayers.Format.GML - * Create a new parser for GML + * Create a new parser for GML. * * Parameters: * options - {Object} An optional object whose properties will be set on - * this instance. + * this instance. */ initialize: function(options) { - OpenLayers.Format.prototype.initialize.apply(this, [options]); + // compile regular expressions once instead of every time they are used + this.regExes = { + trimSpace: (/^\s*|\s*$/g), + removeSpace: (/\s*/g), + splitSpace: (/\s+/), + trimComma: (/\s*,\s*/g) + }; + OpenLayers.Format.XML.prototype.initialize.apply(this, [options]); }, /** @@ -82,391 +90,617 @@ OpenLayers.Format.GML = OpenLayers.Class(OpenLayers.Format, { * Read data from a string, and return a list of features. * * Parameters: - * data - {String} or {XMLNode} data to read/parse. + * data - {String} or {DOMElement} data to read/parse. + * + * Returns: + * {Array()} An array of features. */ - read: function(data) { - if (typeof data == "string") { - data = OpenLayers.parseXMLString(data); - } - var featureNodes = OpenLayers.Ajax.getElementsByTagNameNS(data, this.gmlns, "gml", this.featureName); - if (featureNodes.length == 0) { return []; } - - // Determine dimension of the FeatureCollection. Ie, dim=2 means (x,y) coords - // dim=3 means (x,y,z) coords - // GML3 can have 2 or 3 dimensions. GML2 only 2. - var dim; - var coordNodes = OpenLayers.Ajax.getElementsByTagNameNS(featureNodes[0], this.gmlns, "gml", "posList"); - if (coordNodes.length == 0) { - coordNodes = OpenLayers.Ajax.getElementsByTagNameNS(featureNodes[0], this.gmlns, "gml", "pos"); + read: function(data) { + if(typeof data == "string") { + data = OpenLayers.Format.XML.prototype.read.apply(this, [data]); } - if (coordNodes.length > 0) { - dim = coordNodes[0].getAttribute("srsDimension"); - } - this.dim = (dim == "3" || dim == 3) ? 3 : 2; - + var featureNodes = this.getElementsByTagNameNS(data.documentElement, + this.gmlns, + this.featureName); var features = []; - - // Process all the featureMembers - for (var i = 0; i < featureNodes.length; i++) { + for(var i=0; i} - */ - parseFeature: function(xmlNode) { - var geom; - var p; // [points,bounds] - - var feature = new OpenLayers.Feature.Vector(); - - // match MultiPolygon - if (OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, this.gmlns, "gml", "MultiPolygon").length != 0) { - var multipolygon = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, this.gmlns, "gml", "MultiPolygon")[0]; - feature.fid = multipolygon.parentNode.parentNode.getAttribute('fid'); - - geom = new OpenLayers.Geometry.MultiPolygon(); - var polygons = OpenLayers.Ajax.getElementsByTagNameNS(multipolygon, - this.gmlns, "gml", "Polygon"); - for (var i = 0; i < polygons.length; i++) { - polygon = this.parsePolygonNode(polygons[i],geom); - geom.addComponents(polygon); + }, + + /** + * Method: parseFeature + * This function is the core of the GML parsing code in OpenLayers. + * It creates the geometries that are then attached to the returned + * feature, and calls parseAttributes() to get attribute data out. + * + * Parameters: + * node - {DOMElement} A GML feature node. + */ + parseFeature: function(node) { + // only accept on geometry per feature - look for highest "order" + var order = ["MultiPolygon", "Polygon", + "MultiLineString", "LineString", + "MultiPoint", "Point"]; + var type, nodeList, geometry, parser; + for(var i=0; i 0) { + // only deal with first geometry of this type + var parser = this.parseGeometry[type.toLowerCase()]; + if(parser) { + geometry = parser.apply(this, [nodeList[0]]); + } else { + OpenLayers.Console.error("Unsupported geometry type: " + + type); + } + // stop looking for different geometry types + break; } } - // match MultiLineString - else if (OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "MultiLineString").length != 0) { - var multilinestring = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "MultiLineString")[0]; - feature.fid = multilinestring.parentNode.parentNode.getAttribute('fid'); - - geom = new OpenLayers.Geometry.MultiLineString(); - var lineStrings = OpenLayers.Ajax.getElementsByTagNameNS(multilinestring, this.gmlns, "gml", "LineString"); - - for (var i = 0; i < lineStrings.length; i++) { - p = this.parseCoords(lineStrings[i]); - if(p.points){ - var lineString = new OpenLayers.Geometry.LineString(p.points); - geom.addComponents(lineString); - // TBD Bounds only set for one of multiple geometries + + // construct feature (optionally with attributes) + var attributes; + if(this.extractAttributes) { + attributes = this.parseAttributes(node); + } + var feature = new OpenLayers.Feature.Vector(geometry, attributes); + // assign fid - this can come from a "fid" or "id" attribute + var childNode = node.firstChild; + var fid; + while(childNode) { + if(childNode.nodeType == 1) { + fid = childNode.getAttribute("fid") || + childNode.getAttribute("id"); + if(fid) { + break; } } + childNode = childNode.nextSibling; } - // match MultiPoint - else if (OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "MultiPoint").length != 0) { - var multiPoint = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "MultiPoint")[0]; - feature.fid = multiPoint.parentNode.parentNode.getAttribute('fid'); - - geom = new OpenLayers.Geometry.MultiPoint(); - - var points = OpenLayers.Ajax.getElementsByTagNameNS(multiPoint, this.gmlns, "gml", "Point"); - - for (var i = 0; i < points.length; i++) { - p = this.parseCoords(points[i]); - geom.addComponents(p.points[0]); - // TBD Bounds only set for one of multiple geometries - } - } - // match Polygon - else if (OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "Polygon").length != 0) { - var polygon = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "Polygon")[0]; - feature.fid = polygon.parentNode.parentNode.getAttribute('fid'); - - geom = this.parsePolygonNode(polygon); - } - // match LineString - else if (OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "LineString").length != 0) { - var lineString = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "LineString")[0]; - feature.fid = lineString.parentNode.parentNode.getAttribute('fid'); - - p = this.parseCoords(lineString); - if (p.points) { - geom = new OpenLayers.Geometry.LineString(p.points); - // TBD Bounds only set for one of multiple geometries - } - } - // match Point - else if (OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "Point").length != 0) { - var point = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, - this.gmlns, "gml", "Point")[0]; - feature.fid = point.parentNode.parentNode.getAttribute('fid'); - - p = this.parseCoords(point); - if (p.points) { - geom = p.points[0]; - // TBD Bounds only set for one of multiple geometries - } - } - - feature.geometry = geom; - if (this.extractAttributes) { - feature.attributes = this.parseAttributes(xmlNode); - } - + feature.fid = fid; return feature; - }, + }, + + /** + * Property: parseGeometry + * Properties of this object are the functions that parse geometries based + * on their type. + */ + parseGeometry: { + + /** + * Method: parseGeometry.point + * Given a GML node representing a point geometry, create an OpenLayers + * point geometry. + * + * Parameters: + * node - {DOMElement} A GML node. + * + * Returns: + * {} A point geometry. + */ + point: function(node) { + /** + * Three coordinate variations to consider: + * 1) x y z + * 2) x, y, z + * 3) xy + */ + var nodeList; + var coords = []; + + // look for + var nodeList = this.getElementsByTagNameNS(node, this.gmlns, "pos"); + if(nodeList.length > 0) { + coordString = nodeList[0].firstChild.nodeValue; + coordString = coordString.replace(this.regExes.trimSpace, ""); + coords = coordString.split(this.regExes.splitSpace); + } + + // look for + if(coords.length == 0) { + nodeList = this.getElementsByTagNameNS(node, this.gmlns, + "coordinates"); + if(nodeList.length > 0) { + coordString = nodeList[0].firstChild.nodeValue; + coordString = coordString.replace(this.regExes.removeSpace, + ""); + coords = coordString.split(","); + } + } + + // look for + if(coords.length == 0) { + nodeList = this.getElementsByTagNameNS(node, this.gmlns, + "coord"); + if(nodeList.length > 0) { + var xList = this.getElementsByTagNameNS(nodeList[0], + this.gmlns, "X"); + var yList = this.getElementsByTagNameNS(nodeList[0], + this.gmlns, "Y"); + if(xList.length > 0 && yList.length > 0) { + coords = [xList[0].firstChild.nodeValue, + yList[0].firstChild.nodeValue]; + } + } + } + + // preserve third dimension + if(coords.length == 2) { + coords[2] = null; + } + return new OpenLayers.Geometry.Point(coords[0], coords[1], + coords[2]); + }, + + /** + * Method: parseGeometry.multipoint + * Given a GML node representing a multipoint geometry, create an + * OpenLayers multipoint geometry. + * + * Parameters: + * node - {DOMElement} A GML node. + * + * Returns: + * {} A multipoint geometry. + */ + multipoint: function(node) { + var nodeList = this.getElementsByTagNameNS(node, this.gmlns, + "Point"); + var components = []; + if(nodeList.length > 0) { + var point; + for(var i=0; i} A linestring geometry. + */ + linestring: function(node, ring) { + /** + * Two coordinate variations to consider: + * 1) x0 y0 z0 x1 y1 z1 + * 2) x0, y0, z0 x1, y1, z1 + */ + var nodeList, coordString; + var coords = []; + var points = []; + + // look for + nodeList = this.getElementsByTagNameNS(node, this.gmlns, "posList"); + if(nodeList.length > 0) { + coordString = nodeList[0].firstChild.nodeValue; + coordString = coordString.replace(this.regExes.trimSpace, ""); + coords = coordString.split(this.regExes.splitSpace); + var dim = parseInt(nodeList[0].getAttribute("dimension")); + var j, x, y, z; + for(var i=0; i + if(coords.length == 0) { + nodeList = this.getElementsByTagNameNS(node, this.gmlns, + "coordinates"); + if(nodeList.length > 0) { + coordString = nodeList[0].firstChild.nodeValue; + coordString = coordString.replace(this.regExes.trimSpace, + ""); + coordString = coordString.replace(this.regExes.trimComma, + ","); + var pointList = coordString.split(this.regExes.splitSpace); + for(var i=0; i} A multilinestring geometry. + */ + multilinestring: function(node) { + var nodeList = this.getElementsByTagNameNS(node, this.gmlns, + "LineString"); + var components = []; + if(nodeList.length > 0) { + var line; + for(var i=0; i} A polygon geometry. + */ + polygon: function(node) { + var nodeList = this.getElementsByTagNameNS(node, this.gmlns, + "LinearRing"); + var components = []; + if(nodeList.length > 0) { + // this assumes exterior ring first, inner rings after + var ring; + for(var i=0; i} A multipolygon geometry. + */ + multipolygon: function(node) { + var nodeList = this.getElementsByTagNameNS(node, this.gmlns, + "Polygon"); + var components = []; + if(nodeList.length > 0) { + var polygon; + for(var i=0; i} + * node - {} + * + * Returns: + * {Object} An attributes object. */ - parseAttributes: function(xmlNode) { - var nodes = xmlNode.childNodes; + parseAttributes: function(node) { var attributes = {}; - for(var i = 0; i < nodes.length; i++) { - var name = nodes[i].nodeName; - var value = OpenLayers.Util.getXmlNodeValue(nodes[i]); - // Ignore Geometry attributes - // match ".//gml:pos|.//gml:posList|.//gml:coordinates" - if((name.search(":pos")!=-1) - ||(name.search(":posList")!=-1) - ||(name.search(":coordinates")!=-1)){ - continue; + // assume attributes are children of the first type 1 child + var childNode = node.firstChild; + var children, i, child, grandchildren, grandchild, name, value; + while(childNode) { + if(childNode.nodeType == 1) { + // attributes are type 1 children with one type 3 child + children = childNode.childNodes; + for(i=0; i} polygon geometry - */ - parsePolygonNode: function(polygonNode) { - var linearRings = OpenLayers.Ajax.getElementsByTagNameNS(polygonNode, - this.gmlns, "gml", "LinearRing"); - - var rings = []; - var p; - var polyBounds; - for (var i = 0; i < linearRings.length; i++) { - p = this.parseCoords(linearRings[i]); - ring1 = new OpenLayers.Geometry.LinearRing(p.points); - rings.push(ring1); - } - - var poly = new OpenLayers.Geometry.Polygon(rings); - return poly; - }, - - /** - * Method: parseCoords - * Extract Geographic coordinates from an XML node. - * - * Parameters: - * xmlNode - {} - * - * Returns: - * An array of points. - */ - parseCoords: function(xmlNode) { - var x, y, left, bottom, right, top, bounds; - var p = []; // return value = [points,bounds] - - if (xmlNode) { - p.points = []; - - // match ".//gml:pos|.//gml:posList|.//gml:coordinates" - // Note: GML2 coordinates are of the form:x y,x y,x y - // GML2 can also be of the form 12 - // GML3 posList is of the form:x y x y. OR x y z x y z. - - // GML3 Line or Polygon - var coordNodes = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, this.gmlns, "gml", "posList"); - - // GML3 Point - if (coordNodes.length == 0) { - coordNodes = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, this.gmlns, "gml", "pos"); - } - - // GML2 - if (coordNodes.length == 0) { - coordNodes = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, this.gmlns, "gml", "coordinates"); - } - - // TBD: Need to handle an array of coordNodes not just coordNodes[0] - - var coordString = OpenLayers.Util.getXmlNodeValue(coordNodes[0]); - - // Extract an array of Numbers from CoordString - var nums = (coordString) ? coordString.split(/[, \n\t]+/) : []; - - // Remove elements caused by leading and trailing white space - while (nums[0] == "") - nums.shift(); - - while (nums[nums.length-1] == "") - nums.pop(); - - for(var i = 0; i < nums.length; i = i + this.dim) { - x = parseFloat(nums[i]); - y = parseFloat(nums[i+1]); - p.points.push(new OpenLayers.Geometry.Point(x, y)); - } - } - return p; - }, - /** * APIMethod: write - * Accept Feature Array, and return a string. + * Generate a GML document string given a list of features. * * Parameters: - * features - Array({}> List of features to - * serialize into a string. + * features - {Array()} List of features to + * serialize into a string. + * + * Returns: + * {String} A string representing the GML document. */ - write: function(features) { - var featureCollection = document.createElementNS("http://www.opengis.net/wfs", "wfs:" + this.collectionName); - for (var i=0; i < features.length; i++) { - featureCollection.appendChild(this.createFeatureXML(features[i])); + write: function(features) { + if(!(features instanceof Array)) { + features = [features]; } - return featureCollection; - }, - + var gml = this.createElementNS("http://www.opengis.net/wfs", + "wfs:" + this.collectionName); + for(var i=0; i} + * feature - {} The feature to be built as GML. * * Returns: - * {DOMElement} + * {DOMElement} A node reprensting the feature in GML. */ createFeatureXML: function(feature) { - var geometryNode = this.buildGeometryNode(feature.geometry); - var geomContainer = document.createElementNS(this.featureNS, "feature:"+this.geometryName); + var geometry = feature.geometry; + var geometryNode = this.buildGeometryNode(geometry); + var geomContainer = this.createElementNS(this.featureNS, + this.featurePrefix + ":" + + this.geometryName); geomContainer.appendChild(geometryNode); - var featureNode = document.createElementNS(this.gmlns, "gml:" + this.featureName); - var featureContainer = document.createElementNS(this.featureNS, "feature:"+this.layerName); + var featureNode = this.createElementNS(this.gmlns, + "gml:" + this.featureName); + var featureContainer = this.createElementNS(this.featureNS, + this.featurePrefix + ":" + + this.layerName); + var fid = feature.fid || feature.id; + featureContainer.setAttribute("fid", fid); featureContainer.appendChild(geomContainer); for(var attr in feature.attributes) { - var attrText = document.createTextNode(feature.attributes[attr]); - var nodename = attr; - if (attr.search(":") != -1) { - nodename = attr.split(":")[1]; - } - var attrContainer = document.createElementNS(this.featureNS, "feature:"+nodename); + var attrText = this.createTextNode(feature.attributes[attr]); + var nodename = attr.substring(attr.lastIndexOf(":") + 1); + var attrContainer = this.createElementNS(this.featureNS, + this.featurePrefix + ":" + + nodename); attrContainer.appendChild(attrText); featureContainer.appendChild(attrContainer); } featureNode.appendChild(featureContainer); return featureNode; - }, + }, /** - * Method: buildGeometryNode - * builds a GML file with a given geometry - * - * Parameters: - * geometry - {} + * APIMethod: buildGeometryNode */ buildGeometryNode: function(geometry) { - // TBD test if geoserver can be given a Multi-geometry for a simple-geometry data store - // ie if multipolygon can be sent for a polygon feature type - var gml = ""; - // match MultiPolygon or Polygon - if (geometry.CLASS_NAME == "OpenLayers.Geometry.MultiPolygon" - || geometry.CLASS_NAME == "OpenLayers.Geometry.Polygon") { - gml = document.createElementNS(this.gmlns, 'gml:MultiPolygon'); - - // TBD retrieve the srs from layer - // srsName is non-standard, so not including it until it's right. - //gml.setAttribute("srsName", "http://www.opengis.net/gml/srs/epsg.xml#4326"); - - var polygonMember = document.createElementNS(this.gmlns, 'gml:polygonMember'); - - var polygon = document.createElementNS(this.gmlns, 'gml:Polygon'); - var outerRing = document.createElementNS(this.gmlns, 'gml:outerBoundaryIs'); - var linearRing = document.createElementNS(this.gmlns, 'gml:LinearRing'); - - // TBD manage polygons with holes - linearRing.appendChild(this.buildCoordinatesNode(geometry.components[0])); - outerRing.appendChild(linearRing); - polygon.appendChild(outerRing); - polygonMember.appendChild(polygon); - - gml.appendChild(polygonMember); - } - // match MultiLineString or LineString - else if (geometry.CLASS_NAME == "OpenLayers.Geometry.MultiLineString" - || geometry.CLASS_NAME == "OpenLayers.Geometry.LineString") { - gml = document.createElementNS(this.gmlns, 'gml:MultiLineString'); - - // TBD retrieve the srs from layer - // srsName is non-standard, so not including it until it's right. - //gml.setAttribute("srsName", "http://www.opengis.net/gml/srs/epsg.xml#4326"); - - var lineStringMember = document.createElementNS(this.gmlns, 'gml:lineStringMember'); - - var lineString = document.createElementNS(this.gmlns, 'gml:LineString'); - - lineString.appendChild(this.buildCoordinatesNode(geometry)); - lineStringMember.appendChild(lineString); - - gml.appendChild(lineStringMember); - } - // match MultiPoint or Point - else if (geometry.CLASS_NAME == "OpenLayers.Geometry.Point" || - geometry.CLASS_NAME == "OpenLayers.Geometry.MultiPoint") { - // TBD retrieve the srs from layer - // srsName is non-standard, so not including it until it's right. - //gml.setAttribute("srsName", "http://www.opengis.net/gml/srs/epsg.xml#4326"); - - gml = document.createElementNS(this.gmlns, 'gml:MultiPoint'); - var parts = ""; - if (geometry.CLASS_NAME == "OpenLayers.Geometry.MultiPoint") { - parts = geometry.components; - } else { - parts = [geometry]; - } - - for (var i = 0; i < parts.length; i++) { - var pointMember = document.createElementNS(this.gmlns, 'gml:pointMember'); - var point = document.createElementNS(this.gmlns, 'gml:Point'); - point.appendChild(this.buildCoordinatesNode(parts[i])); - pointMember.appendChild(point); - gml.appendChild(pointMember); - } - } - return gml; + var className = geometry.CLASS_NAME; + var type = className.substring(className.lastIndexOf(".") + 1); + var builder = this.buildGeometry[type.toLowerCase()]; + return builder.apply(this, [geometry]); }, - + + /** + * Property: buildGeometry + * Object containing methods to do the actual geometry node building + * based on geometry type. + */ + buildGeometry: { + // TBD retrieve the srs from layer + // srsName is non-standard, so not including it until it's right. + // gml.setAttribute("srsName", + // "http://www.opengis.net/gml/srs/epsg.xml#4326"); + + /** + * Method: buildGeometry.point + * Given an OpenLayers point geometry, create a GML point. + * + * Parameters: + * geometry - {} A point geometry. + * + * Returns: + * {DOMElement} A GML point node. + */ + point: function(geometry) { + var gml = this.createElementNS(this.gmlns, "gml:Point"); + gml.appendChild(this.buildCoordinatesNode(geometry)); + return gml; + }, + + /** + * Method: buildGeometry.multipoint + * Given an OpenLayers multipoint geometry, create a GML multipoint. + * + * Parameters: + * geometry - {} A multipoint geometry. + * + * Returns: + * {DOMElement} A GML multipoint node. + */ + multipoint: function(geometry) { + var gml = this.createElementNS(this.gmlns, "gml:MultiPoint"); + var points = geometry.components; + var pointMember, pointGeom; + for(var i=0; i} A linestring geometry. + * + * Returns: + * {DOMElement} A GML linestring node. + */ + linestring: function(geometry) { + var gml = this.createElementNS(this.gmlns, "gml:LineString"); + gml.appendChild(this.buildCoordinatesNode(geometry)); + return gml; + }, + + /** + * Method: buildGeometry.multilinestring + * Given an OpenLayers multilinestring geometry, create a GML + * multilinestring. + * + * Parameters: + * geometry - {} A multilinestring + * geometry. + * + * Returns: + * {DOMElement} A GML multilinestring node. + */ + multilinestring: function(geometry) { + var gml = this.createElementNS(this.gmlns, "gml:MultiLineString"); + var lines = geometry.components; + var lineMember, lineGeom; + for(var i=0; i} A linearring geometry. + * + * Returns: + * {DOMElement} A GML linearring node. + */ + linearring: function(geometry) { + var gml = this.createElementNS(this.gmlns, "gml:LinearRing"); + gml.appendChild(this.buildCoordinatesNode(geometry)); + return gml; + }, + + /** + * Method: buildGeometry.polygon + * Given an OpenLayers polygon geometry, create a GML polygon. + * + * Parameters: + * geometry - {} A polygon geometry. + * + * Returns: + * {DOMElement} A GML polygon node. + */ + polygon: function(geometry) { + var gml = this.createElementNS(this.gmlns, "gml:Polygon"); + var rings = geometry.components; + var ringMember, ringGeom, type; + for(var i=0; i} A multipolygon + * geometry. + * + * Returns: + * {DOMElement} A GML multipolygon node. + */ + multipolygon: function(geometry) { + var gml = this.createElementNS(this.gmlns, "gml:MultiPolygon"); + var polys = geometry.components; + var polyMember, polyGeom; + for(var i=0; i