diff --git a/src/ol/parser/featureparser.js b/src/ol/parser/featureparser.js index c9210f226f..0f09dc8511 100644 --- a/src/ol/parser/featureparser.js +++ b/src/ol/parser/featureparser.js @@ -3,6 +3,7 @@ goog.provide('ol.parser.AsyncStringFeatureParser'); goog.provide('ol.parser.DomFeatureParser'); goog.provide('ol.parser.ObjectFeatureParser'); goog.provide('ol.parser.ReadFeaturesOptions'); +goog.provide('ol.parser.ReadFeaturesResult'); goog.provide('ol.parser.StringFeatureParser'); goog.require('ol.Feature'); diff --git a/src/ol/parser/geojson.js b/src/ol/parser/geojson.js index b67332b9f4..6943cebcc2 100644 --- a/src/ol/parser/geojson.js +++ b/src/ol/parser/geojson.js @@ -15,6 +15,7 @@ goog.require('ol.geom.Polygon'); goog.require('ol.geom.SharedVertices'); goog.require('ol.parser.Parser'); goog.require('ol.parser.ReadFeaturesOptions'); +goog.require('ol.parser.ReadFeaturesResult'); goog.require('ol.parser.StringFeatureParser'); @@ -63,8 +64,7 @@ ol.parser.GeoJSON.read = function(str) { ol.parser.GeoJSON.prototype.readFeaturesFromString = function(str, opt_options) { var json = /** @type {GeoJSONFeatureCollection} */ (JSON.parse(str)); - return {features: this.parseAsFeatureCollection_(json, opt_options), - metadata: {projection: 'EPSG:4326'}}; + return this.parseAsFeatureCollection_(json, opt_options); }; @@ -77,8 +77,7 @@ ol.parser.GeoJSON.prototype.readFeaturesFromString = */ ol.parser.GeoJSON.prototype.readFeaturesFromObject = function(object, opt_options) { - return {features: this.parseAsFeatureCollection_(object, opt_options), - metadata: {projection: 'EPSG:4326'}}; + return this.parseAsFeatureCollection_(object, opt_options); }; @@ -119,7 +118,8 @@ ol.parser.GeoJSON.prototype.parse_ = function(json, opt_options) { /** * @param {GeoJSONObject} json GeoJSON object. * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. - * @return {Array.} Parsed object coerced into array of features. + * @return {ol.parser.ReadFeaturesResult} Parsed object coerced into array of + * features. * @private */ ol.parser.GeoJSON.prototype.parseAsFeatureCollection_ = function(json, @@ -149,7 +149,14 @@ ol.parser.GeoJSON.prototype.parseAsFeatureCollection_ = function(json, } } } - return features; + var projection = 'EPSG:4326'; + if (json.hasOwnProperty('crs')) { + var crs = /** GeoJSONCRS */ (json.crs); + if (crs.type === 'name') { + projection = (/** GeoJSONCRSName */ (crs.properties)).name; + } + } + return {features: features, metadata: {projection: projection}}; }; diff --git a/test/spec/ol/parser/geojson.test.js b/test/spec/ol/parser/geojson.test.js index f49221fdc2..bc97c33cb3 100644 --- a/test/spec/ol/parser/geojson.test.js +++ b/test/spec/ol/parser/geojson.test.js @@ -269,7 +269,7 @@ describe('ol.parser.GeoJSON', function() { describe('#parseAsFeatureCollection_()', function() { - it('returns an array of features for FeatureCollection', function() { + it('generates an array of features for FeatureCollection', function() { var pointVertices = new ol.geom.SharedVertices(); var lineVertices = new ol.geom.SharedVertices(); var polygonVertices = new ol.geom.SharedVertices(); @@ -310,8 +310,9 @@ describe('ol.parser.GeoJSON', function() { } }] }; - var features = parser.parseAsFeatureCollection_(json, + var result = parser.parseAsFeatureCollection_(json, {callback: callback}); + var features = result.features; expect(features.length).to.be(2); @@ -328,9 +329,81 @@ describe('ol.parser.GeoJSON', function() { expect(pointVertices.coordinates.length).to.be(2); expect(lineVertices.coordinates.length).to.be(4); expect(polygonVertices.coordinates.length).to.be(0); + + expect(result.metadata.projection).to.be('EPSG:4326'); }); - it('returns an array of features for Feature', function() { + it('reads named crs from top-level object', function() { + var pointVertices = new ol.geom.SharedVertices(); + var lineVertices = new ol.geom.SharedVertices(); + var polygonVertices = new ol.geom.SharedVertices(); + + var lookup = { + 'point': pointVertices, + 'linestring': lineVertices, + 'polygon': polygonVertices, + 'multipoint': pointVertices, + 'multilinstring': lineVertices, + 'multipolygon': polygonVertices + }; + + var callback = function(feature, type) { + return lookup[type]; + }; + + var parser = new ol.parser.GeoJSON(); + var json = { + type: 'FeatureCollection', + crs: { + type: 'name', + properties: { + name: 'EPSG:1234' + } + }, + features: [{ + type: 'Feature', + properties: { + foo: 'bar' + }, + geometry: { + type: 'Point', + coordinates: [1, 2] + } + }, { + type: 'Feature', + properties: { + bam: 'baz' + }, + geometry: { + type: 'LineString', + coordinates: [[1, 2], [3, 4]] + } + }] + }; + var result = parser.parseAsFeatureCollection_(json, + {callback: callback}); + var features = result.features; + + expect(features.length).to.be(2); + + var first = features[0]; + expect(first).to.be.a(ol.Feature); + expect(first.get('foo')).to.be('bar'); + expect(first.getGeometry()).to.be.a(ol.geom.Point); + + var second = features[1]; + expect(second).to.be.a(ol.Feature); + expect(second.get('bam')).to.be('baz'); + expect(second.getGeometry()).to.be.a(ol.geom.LineString); + + expect(pointVertices.coordinates.length).to.be(2); + expect(lineVertices.coordinates.length).to.be(4); + expect(polygonVertices.coordinates.length).to.be(0); + + expect(result.metadata.projection).to.be('EPSG:1234'); + }); + + it('generates an array of features for Feature', function() { var pointVertices = new ol.geom.SharedVertices(); var lineVertices = new ol.geom.SharedVertices(); var polygonVertices = new ol.geom.SharedVertices(); @@ -359,8 +432,9 @@ describe('ol.parser.GeoJSON', function() { coordinates: [[1, 2], [3, 4]] } }; - var features = parser.parseAsFeatureCollection_(json, + var result = parser.parseAsFeatureCollection_(json, {callback: callback}); + var features = result.features; expect(features.length).to.be(1); @@ -372,9 +446,11 @@ describe('ol.parser.GeoJSON', function() { expect(pointVertices.coordinates.length).to.be(0); expect(lineVertices.coordinates.length).to.be(4); expect(polygonVertices.coordinates.length).to.be(0); + + expect(result.metadata.projection).to.be('EPSG:4326'); }); - it('returns an array of features for GeometryCollection', function() { + it('generates an array of features for GeometryCollection', function() { var pointVertices = new ol.geom.SharedVertices(); var lineVertices = new ol.geom.SharedVertices(); var polygonVertices = new ol.geom.SharedVertices(); @@ -406,8 +482,9 @@ describe('ol.parser.GeoJSON', function() { coordinates: [[[7, 8], [9, 10], [11, 12], [7, 8]]] }] }; - var features = parser.parseAsFeatureCollection_(json, + var result = parser.parseAsFeatureCollection_(json, {callback: callback}); + var features = result.features; expect(features.length).to.be(3); @@ -418,9 +495,11 @@ describe('ol.parser.GeoJSON', function() { expect(pointVertices.coordinates.length).to.be(2); expect(lineVertices.coordinates.length).to.be(4); expect(polygonVertices.coordinates.length).to.be(8); + + expect(result.metadata.projection).to.be('EPSG:4326'); }); - it('returns an array of features for Point', function() { + it('generates an array of features for Point', function() { var pointVertices = new ol.geom.SharedVertices(); var lineVertices = new ol.geom.SharedVertices(); var polygonVertices = new ol.geom.SharedVertices(); @@ -443,8 +522,9 @@ describe('ol.parser.GeoJSON', function() { type: 'Point', coordinates: [1, 2] }; - var features = parser.parseAsFeatureCollection_(json, + var result = parser.parseAsFeatureCollection_(json, {callback: callback}); + var features = result.features; expect(features.length).to.be(1); @@ -453,9 +533,11 @@ describe('ol.parser.GeoJSON', function() { expect(pointVertices.coordinates.length).to.be(2); expect(lineVertices.coordinates.length).to.be(0); expect(polygonVertices.coordinates.length).to.be(0); + + expect(result.metadata.projection).to.be('EPSG:4326'); }); - it('returns an array of features for LineString', function() { + it('generates an array of features for LineString', function() { var pointVertices = new ol.geom.SharedVertices(); var lineVertices = new ol.geom.SharedVertices(); var polygonVertices = new ol.geom.SharedVertices(); @@ -478,8 +560,9 @@ describe('ol.parser.GeoJSON', function() { type: 'LineString', coordinates: [[3, 4], [5, 6]] }; - var features = parser.parseAsFeatureCollection_(json, + var result = parser.parseAsFeatureCollection_(json, {callback: callback}); + var features = result.features; expect(features.length).to.be(1); @@ -488,9 +571,11 @@ describe('ol.parser.GeoJSON', function() { expect(pointVertices.coordinates.length).to.be(0); expect(lineVertices.coordinates.length).to.be(4); expect(polygonVertices.coordinates.length).to.be(0); + + expect(result.metadata.projection).to.be('EPSG:4326'); }); - it('returns an array of features for Polygon', function() { + it('generates an array of features for Polygon', function() { var pointVertices = new ol.geom.SharedVertices(); var lineVertices = new ol.geom.SharedVertices(); var polygonVertices = new ol.geom.SharedVertices(); @@ -513,8 +598,9 @@ describe('ol.parser.GeoJSON', function() { type: 'Polygon', coordinates: [[[7, 8], [9, 10], [11, 12], [7, 8]]] }; - var features = parser.parseAsFeatureCollection_(json, + var result = parser.parseAsFeatureCollection_(json, {callback: callback}); + var features = result.features; expect(features.length).to.be(1); @@ -523,6 +609,8 @@ describe('ol.parser.GeoJSON', function() { expect(pointVertices.coordinates.length).to.be(0); expect(lineVertices.coordinates.length).to.be(0); expect(polygonVertices.coordinates.length).to.be(8); + + expect(result.metadata.projection).to.be('EPSG:4326'); });