📄 kml.js
字号:
*/ parseAttributes: function(node) { var attributes = {}; // assume attribute nodes are type 1 children with a type 3 child var child, grandchildren, grandchild; var children = node.childNodes; for(var 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; } } } } return attributes; }, /** * APIMethod: write * Accept Feature Collection, and return a string. * * Parameters: * features - An array of <OpenLayers.Feature.Vector> features. * * Returns: * {String} A KML string. */ write: function(features) { if(!(features instanceof Array)) { features = [features]; } var kml = this.createElementNS(this.kmlns, "kml"); var folder = this.createFolderXML(); for(var i=0; i<features.length; ++i) { folder.appendChild(this.createPlacemarkXML(features[i])); } kml.appendChild(folder); return OpenLayers.Format.XML.prototype.write.apply(this, [kml]); }, /** * Method: createFolderXML * Creates and returns a KML folder node * * Returns: * {DOMElement} */ createFolderXML: function() { // Folder name var folderName = this.createElementNS(this.kmlns, "name"); var folderNameText = this.createTextNode(this.foldersName); folderName.appendChild(folderNameText); // Folder description var folderDesc = this.createElementNS(this.kmlns, "description"); var folderDescText = this.createTextNode(this.foldersDesc); folderDesc.appendChild(folderDescText); // Folder var folder = this.createElementNS(this.kmlns, "Folder"); folder.appendChild(folderName); folder.appendChild(folderDesc); return folder; }, /** * Method: createPlacemarkXML * Creates and returns a KML placemark node representing the given feature. * * Parameters: * feature - {<OpenLayers.Feature.Vector>} * * Returns: * {DOMElement} */ createPlacemarkXML: function(feature) { // Placemark name var placemarkName = this.createElementNS(this.kmlns, "name"); var name = (feature.attributes.name) ? feature.attributes.name : feature.id; placemarkName.appendChild(this.createTextNode(name)); // Placemark description var placemarkDesc = this.createElementNS(this.kmlns, "description"); var desc = (feature.attributes.description) ? feature.attributes.description : this.placemarksDesc; placemarkDesc.appendChild(this.createTextNode(desc)); // Placemark var placemarkNode = this.createElementNS(this.kmlns, "Placemark"); if(feature.fid != null) { placemarkNode.setAttribute("id", feature.fid); } placemarkNode.appendChild(placemarkName); placemarkNode.appendChild(placemarkDesc); // Geometry node (Point, LineString, etc. nodes) var geometryNode = this.buildGeometryNode(feature.geometry); placemarkNode.appendChild(geometryNode); // TBD - deal with remaining (non name/description) attributes. return placemarkNode; }, /** * Method: buildGeometryNode * Builds and returns a KML geometry node with the given geometry. * * Parameters: * geometry - {<OpenLayers.Geometry>} * * Returns: * {DOMElement} */ buildGeometryNode: function(geometry) { var className = geometry.CLASS_NAME; var type = className.substring(className.lastIndexOf(".") + 1); var builder = this.buildGeometry[type.toLowerCase()]; var node = null; if(builder) { node = builder.apply(this, [geometry]); } return node; }, /** * Property: buildGeometry * Object containing methods to do the actual geometry node building * based on geometry type. */ buildGeometry: { // TBD: Anybody care about namespace aliases here (these nodes have // no prefixes)? /** * Method: buildGeometry.point * Given an OpenLayers point geometry, create a KML point. * * Parameters: * geometry - {<OpenLayers.Geometry.Point>} A point geometry. * * Returns: * {DOMElement} A KML point node. */ point: function(geometry) { var kml = this.createElementNS(this.kmlns, "Point"); kml.appendChild(this.buildCoordinatesNode(geometry)); return kml; }, /** * Method: buildGeometry.multipoint * Given an OpenLayers multipoint geometry, create a KML * GeometryCollection. * * Parameters: * geometry - {<OpenLayers.Geometry.Point>} A multipoint geometry. * * Returns: * {DOMElement} A KML GeometryCollection node. */ multipoint: function(geometry) { return this.buildGeometry.collection(geometry); }, /** * Method: buildGeometry.linestring * Given an OpenLayers linestring geometry, create a KML linestring. * * Parameters: * geometry - {<OpenLayers.Geometry.LineString>} A linestring geometry. * * Returns: * {DOMElement} A KML linestring node. */ linestring: function(geometry) { var kml = this.createElementNS(this.kmlns, "LineString"); kml.appendChild(this.buildCoordinatesNode(geometry)); return kml; }, /** * Method: buildGeometry.multilinestring * Given an OpenLayers multilinestring geometry, create a KML * GeometryCollection. * * Parameters: * geometry - {<OpenLayers.Geometry.Point>} A multilinestring geometry. * * Returns: * {DOMElement} A KML GeometryCollection node. */ multilinestring: function(geometry) { return this.buildGeometry.collection(geometry); }, /** * Method: buildGeometry.linearring * Given an OpenLayers linearring geometry, create a KML linearring. * * Parameters: * geometry - {<OpenLayers.Geometry.LinearRing>} A linearring geometry. * * Returns: * {DOMElement} A KML linearring node. */ linearring: function(geometry) { var kml = this.createElementNS(this.kmlns, "LinearRing"); kml.appendChild(this.buildCoordinatesNode(geometry)); return kml; }, /** * Method: buildGeometry.polygon * Given an OpenLayers polygon geometry, create a KML polygon. * * Parameters: * geometry - {<OpenLayers.Geometry.Polygon>} A polygon geometry. * * Returns: * {DOMElement} A KML polygon node. */ polygon: function(geometry) { var kml = this.createElementNS(this.kmlns, "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.kmlns, type); ringGeom = this.buildGeometry.linearring.apply(this, [rings[i]]); ringMember.appendChild(ringGeom); kml.appendChild(ringMember); } return kml; }, /** * Method: buildGeometry.multipolygon * Given an OpenLayers multipolygon geometry, create a KML * GeometryCollection. * * Parameters: * geometry - {<OpenLayers.Geometry.Point>} A multipolygon geometry. * * Returns: * {DOMElement} A KML GeometryCollection node. */ multipolygon: function(geometry) { return this.buildGeometry.collection(geometry); }, /** * Method: buildGeometry.collection * Given an OpenLayers geometry collection, create a KML MultiGeometry. * * Parameters: * geometry - {<OpenLayers.Geometry.Collection>} A geometry collection. * * Returns: * {DOMElement} A KML MultiGeometry node. */ collection: function(geometry) { var kml = this.createElementNS(this.kmlns, "MultiGeometry"); var child; for(var i=0; i<geometry.components.length; ++i) { child = this.buildGeometryNode.apply(this, [geometry.components[i]]); if(child) { kml.appendChild(child); } } return kml; } }, /** * Method: buildCoordinatesNode * Builds and returns the KML coordinates node with the given geometry * <coordinates>...</coordinates> * * Parameters: * geometry - {<OpenLayers.Geometry>} * * Return: * {DOMElement} */ buildCoordinatesNode: function(geometry) { var coordinatesNode = this.createElementNS(this.kmlns, "coordinates"); var path; var points = geometry.components; if(points) { // LineString or LinearRing var point; var numPoints = points.length; var parts = new Array(numPoints); for(var i=0; i<numPoints; ++i) { point = points[i]; parts[i] = point.x + "," + point.y; } path = parts.join(" "); } else { // Point path = geometry.x + "," + geometry.y; } var txtNode = this.createTextNode(path); coordinatesNode.appendChild(txtNode); return coordinatesNode; }, CLASS_NAME: "OpenLayers.Format.KML" });
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -