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:
Родитель
e15ac86caa
Коммит
14b17b3329
|
@ -2259,23 +2259,26 @@ d3 = function() {
|
|||
φ1 = λ1 = -(λ0 = φ0 = Infinity);
|
||||
ranges = [];
|
||||
d3.geo.stream(feature, bound);
|
||||
ranges.sort(compareRanges);
|
||||
for (var i = 1, n = ranges.length, 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];
|
||||
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
|
||||
} else {
|
||||
merged.push(a = b);
|
||||
var n = ranges.length;
|
||||
if (n) {
|
||||
ranges.sort(compareRanges);
|
||||
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];
|
||||
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
|
||||
} else {
|
||||
merged.push(a = b);
|
||||
}
|
||||
}
|
||||
var best = -Infinity, dλ;
|
||||
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
|
||||
b = merged[i];
|
||||
if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];
|
||||
}
|
||||
}
|
||||
var best = -Infinity, dλ;
|
||||
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
|
||||
b = merged[i];
|
||||
if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ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) {
|
||||
|
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -136,29 +136,34 @@ d3.geo.bounds = (function() {
|
|||
|
||||
d3.geo.stream(feature, bound);
|
||||
|
||||
// First, sort ranges by their minimum longitudes.
|
||||
ranges.sort(compareRanges);
|
||||
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) {
|
||||
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];
|
||||
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
|
||||
} else {
|
||||
merged.push(a = b);
|
||||
// Then, merge any ranges that overlap.
|
||||
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];
|
||||
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
|
||||
} else {
|
||||
merged.push(a = b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Finally, find the largest gap between the merged ranges.
|
||||
// The final bounding box will be the inverse of this gap.
|
||||
var best = -Infinity, dλ;
|
||||
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
|
||||
b = merged[i];
|
||||
if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];
|
||||
// Finally, find the largest gap between the merged ranges.
|
||||
// The final bounding box will be the inverse of this gap.
|
||||
var best = -Infinity, dλ;
|
||||
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
|
||||
b = merged[i];
|
||||
if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
Загрузка…
Ссылка в новой задаче