From 109ec71877b4bc6e4b6303a53011647ff923f2d5 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Wed, 24 Jul 2013 22:19:21 +0200 Subject: [PATCH] Using single argument for callback and string for projection This makes the asynchronous and synchronous versions of readFeatures work with the same data structures, and leaves projection handling outside the parsers. --- src/objectliterals.jsdoc | 7 +++--- src/ol/layer/vectorlayer.js | 11 +++++----- src/ol/parser/featureparser.js | 36 +++++++++++++++---------------- src/ol/parser/geojson.js | 5 ++--- src/ol/parser/gpx.js | 5 ++--- src/ol/parser/kml.js | 39 ++++++++++++++++------------------ 6 files changed, 48 insertions(+), 55 deletions(-) diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index 70ef57ea1e..a670c3e478 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -516,9 +516,10 @@ * @property {string|undefined} logo Logo. * @property {ol.parser.Parser} parser Parser instance to parse data * provided as `data` or fetched from `url`. - * @property {ol.ProjectionLike|undefined} projection Projection. EPSG:4326 - * is assumed if not defined. TODO: Get projection from the parser instead - * of assuming EPSG:4326. + * @property {ol.ProjectionLike|undefined} projection Projection. Usually the + * projection is provided by the parser, so this only needs to be set if + * the parser does not know the SRS (e.g. in some GML flavors), or if the + * projection determined by the parser needs to be overridden. * @property {string|undefined} url Server url providing the vector data. */ diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index f0746f61d7..6655842bb0 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -423,8 +423,6 @@ ol.layer.Vector.prototype.groupFeaturesBySymbolizerLiteral = * one projection. */ ol.layer.Vector.prototype.parseFeatures = function(data, parser, projection) { - var features; - var lookup = {}; lookup[ol.geom.GeometryType.POINT] = this.pointVertices_; lookup[ol.geom.GeometryType.LINESTRING] = this.lineVertices_; @@ -437,10 +435,11 @@ ol.layer.Vector.prototype.parseFeatures = function(data, parser, projection) { return lookup[type]; }; - var addFeatures = function(features, metadata) { + var addFeatures = function(data) { + var features = data.features; var sourceProjection = this.getSource().getProjection(); if (goog.isNull(sourceProjection)) { - sourceProjection = metadata.projection; + sourceProjection = data.metadata.projection; } var transform = ol.proj.getTransform(sourceProjection, projection); @@ -472,7 +471,7 @@ ol.layer.Vector.prototype.parseFeatures = function(data, parser, projection) { goog.isFunction(parser.readFeaturesWithMetadataFromString), 'Expected parser with a readFeaturesWithMetadataFromString method.'); result = parser.readFeaturesWithMetadataFromString(data, options); - addFeatures.call(this, result.features, result.metadata); + addFeatures.call(this, result); } } else if (goog.isObject(data)) { if (goog.isFunction(parser.readFeaturesFromObjectAsync)) { @@ -483,7 +482,7 @@ ol.layer.Vector.prototype.parseFeatures = function(data, parser, projection) { goog.isFunction(parser.readFeaturesWithMetadataFromObject), 'Expected parser with a readFeaturesWithMetadataFromObject method.'); result = parser.readFeaturesWithMetadataFromObject(data, options); - addFeatures.call(this, result.features, result.metadata); + addFeatures.call(this, result); } } else { // TODO: parse more data types diff --git a/src/ol/parser/featureparser.js b/src/ol/parser/featureparser.js index ff27ede189..f8c8d09a8f 100644 --- a/src/ol/parser/featureparser.js +++ b/src/ol/parser/featureparser.js @@ -8,19 +8,6 @@ goog.provide('ol.parser.StringFeatureParser'); goog.require('ol.Feature'); -/** - * @typedef {{projection: ol.Projection}} - */ -ol.parser.ReadFeaturesMetadata; - - -/** - * @typedef {{features: Array., - * metadata: ol.parser.ReadFeaturesMetadata}} - */ -ol.parser.ReadFeaturesResult; - - /** * @interface @@ -78,9 +65,8 @@ ol.parser.AsyncStringFeatureParser = function() {}; /** * @param {string} data String data. - * @param {function(Array., ol.parser.ReadFeaturesMetadata)} - * callback Callback which is called - * after parsing. + * @param {function(ol.parser.ReadFeaturesResult)} callback Callback which is + * called after parsing. * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. */ ol.parser.AsyncStringFeatureParser.prototype.readFeaturesFromStringAsync = @@ -96,9 +82,8 @@ ol.parser.AsyncObjectFeatureParser = function() {}; /** * @param {Object} obj Object representing features. - * @param {function(Array., ol.parser.ReadFeaturesMetadata)} - * callback Callback which is called - * after parsing. + * @param {function(ol.parser.ReadFeaturesResult)} callback Callback which is + * called after parsing. * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. */ ol.parser.AsyncObjectFeatureParser.prototype.readFeaturesFromObjectAsync = @@ -111,7 +96,20 @@ ol.parser.AsyncObjectFeatureParser.prototype.readFeaturesFromObjectAsync = ol.parser.ReadFeaturesCallback; +/** + * @typedef {{projection: ol.ProjectionLike}} + */ +ol.parser.ReadFeaturesMetadata; + + /** * @typedef {{callback: ol.parser.ReadFeaturesCallback}} */ ol.parser.ReadFeaturesOptions; + + +/** + * @typedef {{features: Array., + * metadata: ol.parser.ReadFeaturesMetadata}} + */ +ol.parser.ReadFeaturesResult; diff --git a/src/ol/parser/geojson.js b/src/ol/parser/geojson.js index 32b3857be6..e1e3b26fd6 100644 --- a/src/ol/parser/geojson.js +++ b/src/ol/parser/geojson.js @@ -16,7 +16,6 @@ goog.require('ol.geom.SharedVertices'); goog.require('ol.parser.Parser'); goog.require('ol.parser.ReadFeaturesOptions'); goog.require('ol.parser.StringFeatureParser'); -goog.require('ol.proj'); @@ -65,7 +64,7 @@ ol.parser.GeoJSON.prototype.readFeaturesWithMetadataFromString = function(str, opt_options) { var json = /** @type {GeoJSONFeatureCollection} */ (JSON.parse(str)); return {features: this.parseFeatureCollection_(json, opt_options), - metadata: {projection: ol.proj.get('EPSG:4326')}}; + metadata: {projection: 'EPSG:4326'}}; }; @@ -79,7 +78,7 @@ ol.parser.GeoJSON.prototype.readFeaturesWithMetadataFromString = ol.parser.GeoJSON.prototype.readFeaturesWithMetadataFromObject = function(object, opt_options) { return {features: this.parseFeatureCollection_(object, opt_options), - metadata: {projection: ol.proj.get('EPSG:4326')}}; + metadata: {projection: 'EPSG:4326'}}; }; diff --git a/src/ol/parser/gpx.js b/src/ol/parser/gpx.js index 295c62d8e0..4f4ff946e7 100644 --- a/src/ol/parser/gpx.js +++ b/src/ol/parser/gpx.js @@ -12,7 +12,6 @@ goog.require('ol.parser.ObjectFeatureParser'); goog.require('ol.parser.ReadFeaturesOptions'); goog.require('ol.parser.StringFeatureParser'); goog.require('ol.parser.XML'); -goog.require('ol.proj'); @@ -47,7 +46,6 @@ ol.parser.GPX = function(opt_options) { 'gpx': function(node, obj) { if (!goog.isDef(obj.features)) { obj.features = []; - obj.metadata = {projection: ol.proj.get('EPSG:4326')}; } this.readChildNodes(node, obj); }, @@ -245,7 +243,8 @@ ol.parser.GPX.prototype.read = function(data) { if (data && data.nodeType == 9) { data = data.documentElement; } - var obj = {features: [], metadata: {projection: ol.proj.get('EPSG:4326')}}; + var obj = /** @type {ol.parser.ReadFeaturesResult} */ + ({metadata: {projection: 'EPSG:4326'}}); this.readNode(data, obj); return obj; }; diff --git a/src/ol/parser/kml.js b/src/ol/parser/kml.js index 021118d640..b3080ac44d 100644 --- a/src/ol/parser/kml.js +++ b/src/ol/parser/kml.js @@ -27,7 +27,6 @@ goog.require('ol.parser.DomFeatureParser'); goog.require('ol.parser.ReadFeaturesOptions'); goog.require('ol.parser.StringFeatureParser'); goog.require('ol.parser.XML'); -goog.require('ol.proj'); goog.require('ol.style.Icon'); goog.require('ol.style.Line'); goog.require('ol.style.LineLiteral'); @@ -66,7 +65,6 @@ ol.parser.KML = function(opt_options) { 'kml': function(node, obj) { if (!goog.isDef(obj.features)) { obj.features = []; - obj.metadata = {projection: ol.proj.get('EPSG:4326')}; } if (!goog.isDef(obj.links)) { obj.links = []; @@ -823,9 +821,8 @@ goog.inherits(ol.parser.KML, ol.parser.XML); /** * @param {Object} obj Object representing features. - * @param {function(Array., ol.parser.ReadFeaturesMetadata)} - * callback Callback which is called - * after parsing. + * @param {function(ol.parser.ReadFeaturesResult)} callback Callback which is + * called after parsing. * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. */ ol.parser.KML.prototype.readFeaturesFromObjectAsync = @@ -836,16 +833,15 @@ ol.parser.KML.prototype.readFeaturesFromObjectAsync = /** - * @param {string} data String data. - * @param {function(Array., ol.parser.ReadFeaturesMetadata)} - * callback Callback which is called - * after parsing. + * @param {string} str String data. + * @param {function(ol.parser.ReadFeaturesResult)} + * callback Callback which is called after parsing. * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. */ ol.parser.KML.prototype.readFeaturesFromStringAsync = - function(data, callback, opt_options) { + function(str, callback, opt_options) { this.readFeaturesOptions_ = opt_options; - this.read(data, callback); + this.read(str, callback); }; @@ -858,7 +854,7 @@ ol.parser.KML.prototype.readFeaturesFromStringAsync = ol.parser.KML.prototype.readFeaturesWithMetadataFromString = function(str, opt_options) { this.readFeaturesOptions_ = opt_options; - return this.read(str); + return /** @type {ol.parser.ReadFeaturesResult} */ (this.read(str)); }; @@ -871,7 +867,7 @@ ol.parser.KML.prototype.readFeaturesWithMetadataFromString = ol.parser.KML.prototype.readFeaturesWithMetadataFromNode = function(node, opt_options) { this.readFeaturesOptions_ = opt_options; - return this.read(node); + return /** @type {ol.parser.ReadFeaturesResult} */ (this.read(node)); }; @@ -883,7 +879,7 @@ ol.parser.KML.prototype.readFeaturesWithMetadataFromNode = ol.parser.KML.prototype.readFeaturesWithMetadataFromObject = function(obj, opt_options) { this.readFeaturesOptions_ = opt_options; - return this.read(obj); + return /** @type {ol.parser.ReadFeaturesResult} */ (this.read(obj)); }; @@ -934,10 +930,11 @@ ol.parser.KML.prototype.parseLinks = function(deferreds, obj, done) { /** * @param {string|Document|Element|Object} data Data to read. - * @param {Function=} opt_callback Optional callback to call when reading - * is done. - * @return {ol.parser.ReadFeaturesResult} An object representing the - * document. + * @param {function(ol.parser.ReadFeaturesResult)=} opt_callback Optional + * callback to call when reading is done. If provided, this method will + * return undefined. + * @return {ol.parser.ReadFeaturesResult|undefined} An object representing the + * document if `opt_callback` was not provided. */ ol.parser.KML.prototype.read = function(data, opt_callback) { if (goog.isString(data)) { @@ -946,7 +943,8 @@ ol.parser.KML.prototype.read = function(data, opt_callback) { if (data && data.nodeType == 9) { data = data.documentElement; } - var obj = {features: [], metadata: {projection: ol.proj.get('EPSG:4326')}}; + var obj = /** @type {ol.parser.ReadFeaturesResult} */ + ({metadata: {projection: 'EPSG:4326'}}); this.readNode(data, obj); if (goog.isDef(opt_callback)) { var deferreds = []; @@ -966,9 +964,8 @@ ol.parser.KML.prototype.read = function(data, opt_callback) { }, this); }); } else { - return /* ol.parser.ReadFeaturesResult */(obj); + return obj; } - return {features: null, metadata: {projection: ol.proj.get('EPSG:4326')}}; };