📄 geojson.js
字号:
/* Copyright (c) 2006-2007 MetaCarta, Inc., published under the BSD license. * See http://svn.openlayers.org/trunk/openlayers/release-license.txt * for the full text of the license. *//** * @requires OpenLayers/Format/JSON.js * @requires OpenLayers/Feature/Vector.js * @requires OpenLayers/Geometry/Point.js * @requires OpenLayers/Geometry/MultiPoint.js * @requires OpenLayers/Geometry/LineString.js * @requires OpenLayers/Geometry/MultiLineString.js * @requires OpenLayers/Geometry/Polygon.js * @requires OpenLayers/Geometry/MultiPolygon.js * * Class: OpenLayers.Format.GeoJSON * Read and write GeoJSON. Create a new parser with the * <OpenLayers.Format.GeoJSON> constructor. * * Inherits from: * - <OpenLayers.Format.JSON> */OpenLayers.Format.GeoJSON = OpenLayers.Class(OpenLayers.Format.JSON, { /** * Constructor: OpenLayers.Format.GeoJSON * Create a new parser for GeoJSON. * * Parameters: * options - {Object} An optional object whose properties will be set on * this instance. */ initialize: function(options) { OpenLayers.Format.JSON.prototype.initialize.apply(this, [options]); }, /** * APIMethod: read * Deserialize a GeoJSON string. * * Parameters: * json - {String} A GeoJSON string * type - {String} Optional string that determines the structure of * the output. Supported values are "Geometry", "Feature", * "GeometryCollection", and "FeatureCollection". If absent or null, * a default of "FeatureCollection" is assumed. * filter - {Function} A function which will be called for every key and * value at every level of the final result. Each value will be * replaced by the result of the filter function. This can be used to * reform generic objects into instances of classes, or to transform * date strings into Date objects. * * Returns: * {Object} The return depends on the value of the type argument. If type * is "FeatureCollection" (the default), the return will be an array * of <OpenLayers.Feature.Vector>. If type is "Geometry", the input json * must represent a single geometry, and the return will be an * <OpenLayers.Geometry>. If type is "Feature", the input json must * represent a single feature, and the return will be an * <OpenLayers.Feature.Vector>. If type is "GeometryCollection", the * input json must represent a geometry collection, and the return will * be an array of <OpenLayers.Geometry>. */ read: function(json, type, filter) { type = (type) ? type : "FeatureCollection"; var results = null; var obj = null; if (typeof json == "string") { obj = OpenLayers.Format.JSON.prototype.read.apply(this, [json, filter]); } else { obj = json; } if(!obj) { OpenLayers.Console.error("Bad JSON: " + json); } else if(typeof(obj.type) != "string") { OpenLayers.Console.error("Bad GeoJSON - no type: " + json); } else if(this.isValidType(obj, type)) { switch(type) { case "Geometry": try { results = this.parseGeometry(obj); } catch(err) { OpenLayers.Console.error(err); } break; case "Feature": try { results = this.parseFeature(obj); results.type = "Feature"; } catch(err) { OpenLayers.Console.error(err); } break; case "GeometryCollection": results = []; for(var i=0; i<obj.geometries.length; ++i) { try { results.push(this.parseGeometry(obj.geometries[i])); } catch(err) { results = null; OpenLayers.Console.error(err); } } break; case "FeatureCollection": // for type FeatureCollection, we allow input to be any type results = []; switch(obj.type) { case "Feature": try { results.push(this.parseFeature(obj)); } catch(err) { results = null; OpenLayers.Console.error(err); } break; case "FeatureCollection": for(var i=0; i<obj.features.length; ++i) { try { results.push(this.parseFeature(obj.features[i])); } catch(err) { results = null; OpenLayers.Console.error(err); } } break; case "GeometryCollection": for(var i=0; i<obj.geometries.length; ++i) { try { var geom = this.parseGeometry(obj.geometries[i]); results.push(new OpenLayers.Feature.Vector(geom)); } catch(err) { results = null; OpenLayers.Console.error(err); } } break; default: try { var geom = this.parseGeometry(obj); results.push(new OpenLayers.Feature.Vector(geom)); } catch(err) { results = null; OpenLayers.Console.error(err); } } break; } } return results; }, /** * Method: isValidType * Check if a GeoJSON object is a valid representative of the given type. * * Returns: * {Boolean} The object is valid GeoJSON object of the given type. */ isValidType: function(obj, type) { var valid = false; switch(type) { case "Geometry": if(OpenLayers.Util.indexOf(["Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "Box"], obj.type) == -1) { // unsupported geometry type OpenLayers.Console.error("Unsupported geometry type: " + obj.type); } else { valid = true; } break; case "FeatureCollection": // allow for any type to be converted to a feature collection valid = true; break default: // for GeometryCollection and Feature, types must match if(obj.type == type) { valid = true; } else { OpenLayers.Console.error("Cannot convert types from " + obj.type + " to " + type); } } return valid; }, /** * Method: parseFeature * Convert a feature object from GeoJSON into an * <OpenLayers.Feature.Vector>. * * Parameters: * obj - {Object} An object created from a GeoJSON object * * Returns: * {<OpenLayers.Feature.Vector>} A feature. */ parseFeature: function(obj) { var feature, geometry, attributes; attributes = (obj.properties) ? obj.properties : {}; try { geometry = this.parseGeometry(obj.geometry); } catch(err) { // deal with bad geometries throw err; } feature = new OpenLayers.Feature.Vector(geometry, attributes); if(obj.id) { feature.fid = obj.id; } return feature; }, /** * Method: parseGeometry * Convert a geometry object from GeoJSON into an <OpenLayers.Geometry>. * * Parameters: * obj - {Object} An object created from a GeoJSON object * * Returns: * {<OpenLayers.Geometry>} A geometry. */ parseGeometry: function(obj) { var geometry; if(!(obj.coordinates instanceof Array)) { throw "Geometry must have coordinates array: " + obj; } if(!this.parseCoords[obj.type.toLowerCase()]) { throw "Unsupported geometry type: " + obj.type; } try { geometry = this.parseCoords[obj.type.toLowerCase()].apply(this, [obj.coordinates]); } catch(err) { // deal with bad coordinates throw err; } return geometry; }, /** * Property: parseCoords * Object with properties corresponding to the GeoJSON geometry types. * Property values are functions that do the actual parsing. */ parseCoords: { /** * Method: parseCoords.point * Convert a coordinate array from GeoJSON into an * <OpenLayers.Geometry>. * * Parameters: * array - {Object} The coordinates array from the GeoJSON fragment. * * Returns: * {<OpenLayers.Geometry>} A geometry. */ "point": function(array) { if(array.length != 2) { throw "Only 2D points are supported: " + array; } return new OpenLayers.Geometry.Point(array[0], array[1]); }, /** * Method: parseCoords.multipoint * Convert a coordinate array from GeoJSON into an * <OpenLayers.Geometry>. * * Parameters: * array {Object} The coordinates array from the GeoJSON fragment. * * Returns: * {<OpenLayers.Geometry>} A geometry. */ "multipoint": function(array) { var points = []; var p = null; for(var i=0; i<array.length; ++i) { try { p = this.parseCoords["point"].apply(this, [array[i]]); } catch(err) { throw err; } points.push(p); } return new OpenLayers.Geometry.MultiPoint(points); }, /** * Method: parseCoords.linestring * Convert a coordinate array from GeoJSON into an * <OpenLayers.Geometry>. * * Parameters: * array - {Object} The coordinates array from the GeoJSON fragment. * * Returns: * {<OpenLayers.Geometry>} A geometry. */ "linestring": function(array) { var points = []; var p = null; for(var i=0; i<array.length; ++i) { try { p = this.parseCoords["point"].apply(this, [array[i]]); } catch(err) { throw err; } points.push(p); } return new OpenLayers.Geometry.LineString(points); }, /** * Method: parseCoords.multilinestring * Convert a coordinate array from GeoJSON into an * <OpenLayers.Geometry>. * * Parameters: * array - {Object} The coordinates array from the GeoJSON fragment. * * Returns: * {<OpenLayers.Geometry>} A geometry. */ "multilinestring": function(array) { var lines = []; var l = null; for(var i=0; i<array.length; ++i) { try { l = this.parseCoords["linestring"].apply(this, [array[i]]); } catch(err) { throw err;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -