📄 gml.js
字号:
}, /** * Method: parseGeometry.polygon * Given a GML node representing a polygon geometry, create an * OpenLayers polygon geometry. * * Parameters: * node - {DOMElement} A GML node. * * Returns: * {<OpenLayers.Geometry.Polygon>} 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<nodeList.length; ++i) { ring = this.parseGeometry.linestring.apply(this, [nodeList[i], true]); if(ring) { components.push(ring); } } } return new OpenLayers.Geometry.Polygon(components); }, /** * Method: parseGeometry.multipolygon * Given a GML node representing a multipolygon geometry, create an * OpenLayers multipolygon geometry. * * Parameters: * node - {DOMElement} A GML node. * * Returns: * {<OpenLayers.Geometry.MultiPolygon>} 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<nodeList.length; ++i) { polygon = this.parseGeometry.polygon.apply(this, [nodeList[i]]); if(polygon) { components.push(polygon); } } } return new OpenLayers.Geometry.MultiPolygon(components); } }, /** * Method: parseAttributes * * Parameters: * node - {<DOMElement>} * * Returns: * {Object} An attributes object. */ parseAttributes: function(node) { var attributes = {}; // 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<children.length; ++i) { child = children[i]; if(child.nodeType == 1) { grandchildren = child.childNodes; if(grandchildren.length == 1) { grandchild = grandchildren[0]; if(grandchild.nodeType == 3 || grandchild.nodeType == 4) { name = (child.prefix) ? child.nodeName.split(":")[1] : child.nodeName; value = grandchild.nodeValue.replace( this.regExes.trimSpace, ""); attributes[name] = value; } } } } break; } childNode = childNode.nextSibling; } return attributes; }, /** * APIMethod: write * Generate a GML document string given a list of features. * * Parameters: * features - {Array(<OpenLayers.Feature.Vector>)} List of features to * serialize into a string. * * Returns: * {String} A string representing the GML document. */ write: function(features) { if(!(features instanceof Array)) { features = [features]; } var gml = this.createElementNS("http://www.opengis.net/wfs", "wfs:" + this.collectionName); for(var i=0; i<features.length; i++) { gml.appendChild(this.createFeatureXML(features[i])); } return OpenLayers.Format.XML.prototype.write.apply(this, [gml]); }, /** * Method: createFeatureXML * Accept an OpenLayers.Feature.Vector, and build a GML node for it. * * Parameters: * feature - {<OpenLayers.Feature.Vector>} The feature to be built as GML. * * Returns: * {DOMElement} A node reprensting the feature in GML. */ createFeatureXML: function(feature) { var geometry = feature.geometry; var geometryNode = this.buildGeometryNode(geometry); var geomContainer = this.createElementNS(this.featureNS, this.featurePrefix + ":" + this.geometryName); geomContainer.appendChild(geometryNode); 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 = 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; }, /** * APIMethod: buildGeometryNode */ buildGeometryNode: function(geometry) { 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 - {<OpenLayers.Geometry.Point>} 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 - {<OpenLayers.Geometry.MultiPoint>} 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<points.length; i++) { pointMember = this.createElementNS(this.gmlns, "gml:pointMember"); pointGeom = this.buildGeometry.point.apply(this, [points[i]]); pointMember.appendChild(pointGeom); gml.appendChild(pointMember); } return gml; }, /** * Method: buildGeometry.linestring * Given an OpenLayers linestring geometry, create a GML linestring. * * Parameters: * geometry - {<OpenLayers.Geometry.LineString>} 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 - {<OpenLayers.Geometry.MultiLineString>} 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<lines.length; ++i) { lineMember = this.createElementNS(this.gmlns, "gml:lineStringMember"); lineGeom = this.buildGeometry.linestring.apply(this, [lines[i]]); lineMember.appendChild(lineGeom); gml.appendChild(lineMember); } return gml; }, /** * Method: buildGeometry.linearring * Given an OpenLayers linearring geometry, create a GML linearring. * * Parameters: * geometry - {<OpenLayers.Geometry.LinearRing>} 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 - {<OpenLayers.Geometry.Polygon>} 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<rings.length; ++i) { type = (i==0) ? "outerBoundaryIs" : "innerBoundaryIs"; ringMember = this.createElementNS(this.gmlns, "gml:" + type); ringGeom = this.buildGeometry.linearring.apply(this, [rings[i]]); ringMember.appendChild(ringGeom); gml.appendChild(ringMember); } return gml; }, /** * Method: buildGeometry.multipolygon * Given an OpenLayers multipolygon geometry, create a GML multipolygon. * * Parameters: * geometry - {<OpenLayers.Geometry.MultiPolygon>} 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<polys.length; ++i) { polyMember = this.createElementNS(this.gmlns, "gml:polygonMember"); polyGeom = this.buildGeometry.polygon.apply(this, [polys[i]]); polyMember.appendChild(polyGeom); gml.appendChild(polyMember); } return gml; } }, /** * Method: buildCoordinates * builds the coordinates XmlNode * <gml:coordinates decimal="." cs="," ts=" ">...</gml:coordinates> * * Parameters: * geometry - {<OpenLayers.Geometry>} * * Returns: * {XmlNode} created xmlNode */ buildCoordinatesNode: function(geometry) { var coordinatesNode = this.createElementNS(this.gmlns, "gml:coordinates"); coordinatesNode.setAttribute("decimal", "."); coordinatesNode.setAttribute("cs", ","); coordinatesNode.setAttribute("ts", " "); var points = (geometry.components) ? geometry.components : [geometry]; var parts = []; for(var i=0; i<points.length; i++) { parts.push(points[i].x + "," + points[i].y); } var txtNode = this.createTextNode(parts.join(" ")); coordinatesNode.appendChild(txtNode); return coordinatesNode; }, CLASS_NAME: "OpenLayers.Format.GML" });
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -