Merge pull request #5944 from tschaub/geojson-as-features

Allow readFeature and readFeatures to be called with GeoJSON geometries
This commit is contained in:
Tim Schaub
2016-10-11 14:07:36 -06:00
committed by GitHub
2 changed files with 43 additions and 15 deletions

View File

@@ -357,8 +357,9 @@ ol.format.GeoJSON.prototype.getExtensions = function() {
/**
* Read a feature from a GeoJSON Feature source. Only works for Feature,
* use `readFeatures` to read FeatureCollection source.
* Read a feature from a GeoJSON Feature source. Only works for Feature or
* geometry types. Use {@link ol.format.GeoJSON#readFeatures} to read
* FeatureCollection source.
*
* @function
* @param {Document|Node|Object|string} source Source.
@@ -370,8 +371,9 @@ ol.format.GeoJSON.prototype.readFeature;
/**
* Read all features from a GeoJSON source. Works with both Feature and
* FeatureCollection sources.
* Read all features from a GeoJSON source. Works for all GeoJSON types.
* If the source includes only geometries, features will be created with those
* geometries.
*
* @function
* @param {Document|Node|Object|string} source Source.
@@ -387,11 +389,23 @@ ol.format.GeoJSON.prototype.readFeatures;
*/
ol.format.GeoJSON.prototype.readFeatureFromObject = function(
object, opt_options) {
var geoJSONFeature = /** @type {GeoJSONFeature} */ (object);
ol.DEBUG && console.assert(geoJSONFeature.type == 'Feature',
'geoJSONFeature.type should be Feature');
var geometry = ol.format.GeoJSON.readGeometry_(geoJSONFeature.geometry,
opt_options);
ol.DEBUG && console.assert(object.type !== 'FeatureCollection', 'Expected a Feature or geometry');
/**
* @type {GeoJSONFeature}
*/
var geoJSONFeature = null;
if (object.type === 'Feature') {
geoJSONFeature = /** @type {GeoJSONFeature} */ (object);
} else {
geoJSONFeature = /** @type {GeoJSONFeature} */ ({
type: 'Feature',
geometry: /** @type {GeoJSONGeometry|GeoJSONGeometryCollection} */ (object)
});
}
var geometry = ol.format.GeoJSON.readGeometry_(geoJSONFeature.geometry, opt_options);
var feature = new ol.Feature();
if (this.geometryName_) {
feature.setGeometryName(this.geometryName_);
@@ -414,10 +428,8 @@ ol.format.GeoJSON.prototype.readFeaturesFromObject = function(
object, opt_options) {
var geoJSONObject = /** @type {GeoJSONObject} */ (object);
/** @type {Array.<ol.Feature>} */
var features;
if (geoJSONObject.type == 'Feature') {
features = [this.readFeatureFromObject(object, opt_options)];
} else if (geoJSONObject.type == 'FeatureCollection') {
var features = null;
if (geoJSONObject.type === 'FeatureCollection') {
var geoJSONFeatureCollection = /** @type {GeoJSONFeatureCollection} */
(object);
features = [];
@@ -428,9 +440,9 @@ ol.format.GeoJSON.prototype.readFeaturesFromObject = function(
opt_options));
}
} else {
ol.asserts.assert(false, 35); // Unknown GeoJSON object type
features = [this.readFeatureFromObject(object, opt_options)];
}
return /** Array.<ol.Feature> */ (features);
return features;
};

View File

@@ -154,6 +154,14 @@ describe('ol.format.GeoJSON', function() {
expect(feature.get('prop0')).to.be('value0');
});
it('can read a single point geometry as a feature', function() {
var feature = format.readFeature(pointGeoJSON.geometry);
expect(feature).to.be.an(ol.Feature);
var geometry = feature.getGeometry();
expect(geometry).to.be.an(ol.geom.Point);
expect(geometry.getCoordinates()).to.eql([102.0, 0.5]);
});
it('can read a single line string feature', function() {
var feature = format.readFeature(lineStringGeoJSON);
expect(feature).to.be.an(ol.Feature);
@@ -277,6 +285,14 @@ describe('ol.format.GeoJSON', function() {
expect(secondGeom).to.be.a(ol.geom.LineString);
});
it('can parse a polygon geometry as an array of one feature', function() {
var features = format.readFeatures(polygonGeoJSON);
expect(features).to.be.an(Array);
expect(features).to.have.length(1);
var geometry = features[0].getGeometry();
expect(geometry).to.be.an(ol.geom.Polygon);
});
it('parses countries.geojson', function(done) {
afterLoadText('spec/ol/format/geojson/countries.geojson', function(text) {
var result = format.readFeatures(text);