/* 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 * @requires OpenLayers/Format/GML.js */ /** * Though required in the full build, if the GML format is excluded, we set * the namespace here. */ if(!OpenLayers.Format.GML) { OpenLayers.Format.GML = {}; } /** * Class: OpenLayers.Format.GML.Base * Superclass for GML parsers. * * Inherits from: * - */ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, { /** * Property: namespaces * {Object} Mapping of namespace aliases to namespace URIs. */ namespaces: { gml: "http://www.opengis.net/gml", xlink: "http://www.w3.org/1999/xlink", xsi: "http://www.w3.org/2001/XMLSchema-instance", wfs: "http://www.opengis.net/wfs" // this is a convenience for reading wfs:FeatureCollection }, /** * Property: defaultPrefix */ defaultPrefix: "gml", /** * Property: schemaLocation * {String} Schema location for a particular minor version. */ schemaLocation: null, /** * APIProperty: featureType * {Array(String) or String} The local (without prefix) feature typeName(s). */ featureType: null, /** * APIProperty: featureNS * {String} The feature namespace. Must be set in the options at * construction. */ featureNS: null, /** * APIProperty: geometry * {String} Name of geometry element. Defaults to "geometry". If null, it * will be set on when the first geometry is parsed. */ geometryName: "geometry", /** * APIProperty: extractAttributes * {Boolean} Extract attributes from GML. Default is true. */ extractAttributes: true, /** * APIProperty: srsName * {String} URI for spatial reference system. This is optional for * single part geometries and mandatory for collections and multis. * If set, the srsName attribute will be written for all geometries. * Default is null. */ srsName: null, /** * APIProperty: xy * {Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) * Changing is not recommended, a new Format should be instantiated. */ xy: true, /** * Property: geometryTypes * {Object} Maps OpenLayers geometry class names to GML element names. * Use before accessing this property. */ geometryTypes: null, /** * Property: singleFeatureType * {Boolean} True if there is only 1 featureType, and not an array * of featuretypes. */ singleFeatureType: null, /** * Property: autoConfig * {Boolean} Indicates if the format was configured without a , * but auto-configured and during read. * Subclasses making use of auto-configuration should make * the first call to the method (usually in the read method) * with true as 3rd argument, so the auto-configured featureType can be * reset and the format can be reused for subsequent reads with data from * different featureTypes. Set to false after read if you want to keep the * auto-configured values. */ /** * Property: regExes * Compiled regular expressions for manipulating strings. */ regExes: { trimSpace: (/^\s*|\s*$/g), removeSpace: (/\s*/g), splitSpace: (/\s+/), trimComma: (/\s*,\s*/g), featureMember: (/^(.*:)?featureMembers?$/) }, /** * Constructor: OpenLayers.Format.GML.Base * Instances of this class are not created directly. Use the * or constructor * instead. * * Parameters: * options - {Object} An optional object whose properties will be set on * this instance. * * Valid options properties: * featureType - {Array(String) or String} Local (without prefix) feature * typeName(s) (required for write). * featureNS - {String} Feature namespace (required for write). * geometryName - {String} Geometry element name (required for write). */ initialize: function(options) { OpenLayers.Format.XML.prototype.initialize.apply(this, [options]); this.setGeometryTypes(); if(options && options.featureNS) { this.setNamespace("feature", options.featureNS); } this.singleFeatureType = !options || (typeof options.featureType === "string"); }, /** * Method: read * * Parameters: * data - {DOMElement} A gml:featureMember element, a gml:featureMembers * element, or an element containing either of the above at any level. * * Returns: * {Array()} An array of features. */ read: function(data) { if(typeof data == "string") { data = OpenLayers.Format.XML.prototype.read.apply(this, [data]); } if(data && data.nodeType == 9) { data = data.documentElement; } var features = []; this.readNode(data, {features: features}, true); if(features.length == 0) { // look for gml:featureMember elements var elements = this.getElementsByTagNameNS( data, this.namespaces.gml, "featureMember" ); if(elements.length) { for(var i=0, len=elements.length; i 0) { obj.bounds = container.components[0]; } }, "Point": function(node, container) { var obj = {points: []}; this.readChildNodes(node, obj); if(!container.components) { container.components = []; } container.components.push(obj.points[0]); }, "coordinates": function(node, obj) { var str = this.getChildValue(node).replace( this.regExes.trimSpace, "" ); str = str.replace(this.regExes.trimComma, ","); var pointList = str.split(this.regExes.splitSpace); var coords; var numPoints = pointList.length; var points = new Array(numPoints); for(var i=0; i) | OpenLayers.Feature.Vector} * An array of features or a single feature. * * Returns: * {String} Given an array of features, a doc with a gml:featureMembers * element will be returned. Given a single feature, a doc with a * gml:featureMember element will be returned. */ write: function(features) { var name; if(OpenLayers.Util.isArray(features)) { name = "featureMembers"; } else { name = "featureMember"; } var root = this.writeNode("gml:" + name, features); this.setAttributeNS( root, this.namespaces["xsi"], "xsi:schemaLocation", this.schemaLocation ); return OpenLayers.Format.XML.prototype.write.apply(this, [root]); }, /** * Property: writers * As a compliment to the readers property, this structure contains public * writing functions grouped by namespace alias and named like the * node names they produce. */ writers: { "gml": { "featureMember": function(feature) { var node = this.createElementNSPlus("gml:featureMember"); this.writeNode("feature:_typeName", feature, node); return node; }, "MultiPoint": function(geometry) { var node = this.createElementNSPlus("gml:MultiPoint"); var components = geometry.components || [geometry]; for(var i=0, ii=components.length; i mapping. */ setGeometryTypes: function() { this.geometryTypes = { "OpenLayers.Geometry.Point": "Point", "OpenLayers.Geometry.MultiPoint": "MultiPoint", "OpenLayers.Geometry.LineString": "LineString", "OpenLayers.Geometry.MultiLineString": "MultiLineString", "OpenLayers.Geometry.Polygon": "Polygon", "OpenLayers.Geometry.MultiPolygon": "MultiPolygon", "OpenLayers.Geometry.Collection": "GeometryCollection" }; }, CLASS_NAME: "OpenLayers.Format.GML.Base" });