Normalize all toGeoJSON output to Features

This commit is contained in:
John Firebaugh 2013-06-24 13:52:05 -04:00
parent d57525ec52
commit e7d0fb1b37
2 changed files with 80 additions and 20 deletions

View File

@ -1,7 +1,31 @@
describe("L.GeoJSON", function () {
describe("addData", function () {
var geoJSON = {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [20, 10]
}
};
it("sets feature property on member layers", function () {
var layer = new L.GeoJSON();
layer.addData(geoJSON);
expect(layer.getLayers()[0].feature).to.eql(geoJSON);
});
it("normalizes a geometry to a Feature", function () {
var layer = new L.GeoJSON();
layer.addData(geoJSON.geometry);
expect(layer.getLayers()[0].feature).to.eql(geoJSON);
});
});
});
describe("L.Marker#toGeoJSON", function () { describe("L.Marker#toGeoJSON", function () {
it("returns a Point object", function () { it("returns a Point object", function () {
var marker = new L.Marker([10, 20]); var marker = new L.Marker([10, 20]);
expect(marker.toGeoJSON()).to.eql({ expect(marker.toGeoJSON().geometry).to.eql({
type: 'Point', type: 'Point',
coordinates: [20, 10] coordinates: [20, 10]
}); });
@ -11,7 +35,7 @@ describe("L.Marker#toGeoJSON", function () {
describe("L.Polyline#toGeoJSON", function () { describe("L.Polyline#toGeoJSON", function () {
it("returns a LineString object", function () { it("returns a LineString object", function () {
var polyline = new L.Polyline([[10, 20], [2, 5]]); var polyline = new L.Polyline([[10, 20], [2, 5]]);
expect(polyline.toGeoJSON()).to.eql({ expect(polyline.toGeoJSON().geometry).to.eql({
type: 'LineString', type: 'LineString',
coordinates: [[20, 10], [5, 2]] coordinates: [[20, 10], [5, 2]]
}); });
@ -21,7 +45,7 @@ describe("L.Polyline#toGeoJSON", function () {
describe("L.MultiPolyline#toGeoJSON", function () { describe("L.MultiPolyline#toGeoJSON", function () {
it("returns a MultiLineString object", function () { it("returns a MultiLineString object", function () {
var multiPolyline = new L.MultiPolyline([[[10, 20], [2, 5]], [[1, 2], [3, 4]]]); var multiPolyline = new L.MultiPolyline([[[10, 20], [2, 5]], [[1, 2], [3, 4]]]);
expect(multiPolyline.toGeoJSON()).to.eql({ expect(multiPolyline.toGeoJSON().geometry).to.eql({
type: 'MultiLineString', type: 'MultiLineString',
coordinates: [ coordinates: [
[[20, 10], [5, 2]], [[20, 10], [5, 2]],
@ -34,7 +58,7 @@ describe("L.MultiPolyline#toGeoJSON", function () {
describe("L.Polygon#toGeoJSON", function () { describe("L.Polygon#toGeoJSON", function () {
it("returns a Polygon object (no holes)", function () { it("returns a Polygon object (no holes)", function () {
var polygon = new L.Polygon([[1, 2], [3, 4], [5, 6]]); var polygon = new L.Polygon([[1, 2], [3, 4], [5, 6]]);
expect(polygon.toGeoJSON()).to.eql({ expect(polygon.toGeoJSON().geometry).to.eql({
type: 'Polygon', type: 'Polygon',
coordinates: [[[2, 1], [4, 3], [6, 5], [2, 1]]] coordinates: [[[2, 1], [4, 3], [6, 5], [2, 1]]]
}); });
@ -42,7 +66,7 @@ describe("L.Polygon#toGeoJSON", function () {
it("returns a Polygon object (with holes)", function () { it("returns a Polygon object (with holes)", function () {
var polygon = new L.Polygon([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]); var polygon = new L.Polygon([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]);
expect(polygon.toGeoJSON()).to.eql({ expect(polygon.toGeoJSON().geometry).to.eql({
type: 'Polygon', type: 'Polygon',
coordinates: [ coordinates: [
[[2, 1], [4, 3], [6, 5], [2, 1]], [[2, 1], [4, 3], [6, 5], [2, 1]],
@ -55,7 +79,7 @@ describe("L.Polygon#toGeoJSON", function () {
describe("L.MultiPolygon#toGeoJSON", function () { describe("L.MultiPolygon#toGeoJSON", function () {
it("returns a MultiPolygon object", function () { it("returns a MultiPolygon object", function () {
var multiPolygon = new L.MultiPolygon([[[1, 2], [3, 4], [5, 6]]]); var multiPolygon = new L.MultiPolygon([[[1, 2], [3, 4], [5, 6]]]);
expect(multiPolygon.toGeoJSON()).to.eql({ expect(multiPolygon.toGeoJSON().geometry).to.eql({
type: 'MultiPolygon', type: 'MultiPolygon',
coordinates: [ coordinates: [
[[[2, 1], [4, 3], [6, 5], [2, 1]]] [[[2, 1], [4, 3], [6, 5], [2, 1]]]
@ -65,13 +89,37 @@ describe("L.MultiPolygon#toGeoJSON", function () {
}); });
describe("L.LayerGroup#toGeoJSON", function () { describe("L.LayerGroup#toGeoJSON", function () {
it("returns a GeometryCollection object", function () { it("returns a FeatureCollection object", function () {
var marker = new L.Marker([10, 20]), var marker = new L.Marker([10, 20]),
polyline = new L.Polyline([[10, 20], [2, 5]]), polyline = new L.Polyline([[10, 20], [2, 5]]),
layerGroup = new L.LayerGroup([marker, polyline]); layerGroup = new L.LayerGroup([marker, polyline]);
expect(layerGroup.toGeoJSON()).to.eql({ expect(layerGroup.toGeoJSON()).to.eql({
type: 'GeometryCollection', type: 'FeatureCollection',
geometries: [marker.toGeoJSON(), polyline.toGeoJSON()] features: [marker.toGeoJSON(), polyline.toGeoJSON()]
});
});
it("ensures that every member is a Feature", function () {
var tileLayer = new L.TileLayer(),
layerGroup = new L.LayerGroup([tileLayer]);
tileLayer.toGeoJSON = function () {
return {
type: 'Point',
coordinates: [20, 10]
}
};
expect(layerGroup.toGeoJSON()).to.eql({
type: 'FeatureCollection',
features: [{
type: 'Feature',
properties: {},
geometry: {
type: 'Point',
coordinates: [20, 10]
}
}]
}); });
}); });
@ -79,8 +127,8 @@ describe("L.LayerGroup#toGeoJSON", function () {
var tileLayer = new L.TileLayer(), var tileLayer = new L.TileLayer(),
layerGroup = new L.LayerGroup([tileLayer]); layerGroup = new L.LayerGroup([tileLayer]);
expect(layerGroup.toGeoJSON()).to.eql({ expect(layerGroup.toGeoJSON()).to.eql({
type: 'GeometryCollection', type: 'FeatureCollection',
geometries: [] features: []
}); });
}); });
}); });

View File

@ -33,7 +33,7 @@ L.GeoJSON = L.FeatureGroup.extend({
if (options.filter && !options.filter(geojson)) { return; } if (options.filter && !options.filter(geojson)) { return; }
var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng); var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng);
layer.feature = geojson; layer.feature = L.GeoJSON.asFeature(geojson);
layer.defaultOptions = layer.options; layer.defaultOptions = layer.options;
this.resetStyle(layer); this.resetStyle(layer);
@ -161,7 +161,19 @@ L.extend(L.GeoJSON, {
}, },
getFeature: function (layer, newGeometry) { getFeature: function (layer, newGeometry) {
return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : newGeometry; return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);
},
asFeature: function (geoJSON) {
if (geoJSON.type === 'Feature') {
return geoJSON;
}
return {
type: 'Feature',
properties: {},
geometry: geoJSON
};
} }
}); });
@ -212,7 +224,7 @@ L.Polygon.include({
var coords = []; var coords = [];
this.eachLayer(function (layer) { this.eachLayer(function (layer) {
coords.push(layer.toGeoJSON().coordinates); coords.push(layer.toGeoJSON().geometry.coordinates);
}); });
return L.GeoJSON.getFeature(this, { return L.GeoJSON.getFeature(this, {
@ -229,18 +241,18 @@ L.Polygon.include({
L.LayerGroup.include({ L.LayerGroup.include({
toGeoJSON: function () { toGeoJSON: function () {
var geoms = []; var features = [];
this.eachLayer(function (layer) { this.eachLayer(function (layer) {
if (layer.toGeoJSON) { if (layer.toGeoJSON) {
geoms.push(layer.toGeoJSON()); features.push(L.GeoJSON.asFeature(layer.toGeoJSON()));
} }
}); });
return L.GeoJSON.getFeature(this, { return {
type: 'GeometryCollection', type: 'FeatureCollection',
geometries: geoms features: features
}); };
} }
}); });