Fix d3.geo.bounds for null geometries.

This fixes an error that would be thrown if no defined bounds were
found.  It also ensures that undefined bounds are returned as
[[NaN, NaN], [NaN, NaN]], for consistency with d3.extent, which returns
[undefined, undefined] for an empty array.

Fixes #1154.
This commit is contained in:
Jason Davies 2013-05-29 00:48:03 +01:00
Родитель e15ac86caa
Коммит 14b17b3329
4 изменённых файлов: 73 добавлений и 35 удалений

7
d3.js поставляемый
Просмотреть файл

@ -2259,8 +2259,10 @@ d3 = function() {
φ1 = λ1 = -(λ0 = φ0 = Infinity);
ranges = [];
d3.geo.stream(feature, bound);
var n = ranges.length;
if (n) {
ranges.sort(compareRanges);
for (var i = 1, n = ranges.length, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
b = ranges[i];
if (withinRange(b[0], a) || withinRange(b[1], a)) {
if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
@ -2274,8 +2276,9 @@ d3 = function() {
b = merged[i];
if (( = angle(a[1], b[0])) > best) best = , λ0 = b[0], λ1 = a[1];
}
}
ranges = range = null;
return [ [ λ0, φ0 ], [ λ1, φ1 ] ];
return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];
};
}();
d3.geo.centroid = function(object) {

6
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -136,11 +136,13 @@ d3.geo.bounds = (function() {
d3.geo.stream(feature, bound);
var n = ranges.length;
if (n) {
// First, sort ranges by their minimum longitudes.
ranges.sort(compareRanges);
// Then, merge any ranges that overlap.
for (var i = 1, n = ranges.length, a = ranges[0], b, merged = [a]; i < n; ++i) {
for (var i = 1, a = ranges[0], b, merged = [a]; i < n; ++i) {
b = ranges[i];
if (withinRange(b[0], a) || withinRange(b[1], a)) {
if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
@ -157,8 +159,11 @@ d3.geo.bounds = (function() {
b = merged[i];
if (( = angle(a[1], b[0])) > best) best = , λ0 = b[0], λ1 = a[1];
}
}
ranges = range = null;
return [[λ0, φ0], [λ1, φ1]];
return λ0 === Infinity || φ0 === Infinity
? [[NaN, NaN], [NaN, NaN]]
: [[λ0, φ0], [λ1, φ1]];
};
})();

Просмотреть файл

@ -228,6 +228,36 @@ suite.addBatch({
}
]
}), [[-120,46], [-119,47]]);
},
"null geometries": {
"Feature": function(bounds) {
var b = bounds({type: "Feature", geometry: null});
assert.isNaN(b[0][0]);
assert.isNaN(b[0][1]);
assert.isNaN(b[1][0]);
assert.isNaN(b[1][1]);
},
"MultiPoint": function(bounds) {
var b = bounds({type: "MultiPoint", coordinates: []});
assert.isNaN(b[0][0]);
assert.isNaN(b[0][1]);
assert.isNaN(b[1][0]);
assert.isNaN(b[1][1]);
},
"MultiLineString": function(bounds) {
var b = bounds({type: "MultiLineString", coordinates: []});
assert.isNaN(b[0][0]);
assert.isNaN(b[0][1]);
assert.isNaN(b[1][0]);
assert.isNaN(b[1][1]);
},
"MultiPolygon": function(bounds) {
var b = bounds({type: "MultiPolygon", coordinates: []});
assert.isNaN(b[0][0]);
assert.isNaN(b[0][1]);
assert.isNaN(b[1][0]);
assert.isNaN(b[1][1]);
}
}
}
});