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')}};
};