Skip to content

Commit f5b72cb

Browse files
committed
Merge branch 'bounds-null' into 3.2
2 parents cffb119 + 14b17b3 commit f5b72cb

4 files changed

Lines changed: 72 additions & 34 deletions

File tree

d3.js

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2258,23 +2258,26 @@ d3 = function() {
22582258
φ1 = λ1 = -(λ0 = φ0 = Infinity);
22592259
ranges = [];
22602260
d3.geo.stream(feature, bound);
2261-
ranges.sort(compareRanges);
2262-
for (var i = 1, n = ranges.length, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
2263-
b = ranges[i];
2264-
if (withinRange(b[0], a) || withinRange(b[1], a)) {
2265-
if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
2266-
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
2267-
} else {
2268-
merged.push(a = b);
2261+
var n = ranges.length;
2262+
if (n) {
2263+
ranges.sort(compareRanges);
2264+
for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
2265+
b = ranges[i];
2266+
if (withinRange(b[0], a) || withinRange(b[1], a)) {
2267+
if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
2268+
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
2269+
} else {
2270+
merged.push(a = b);
2271+
}
2272+
}
2273+
var best = -Infinity, ;
2274+
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
2275+
b = merged[i];
2276+
if (( = angle(a[1], b[0])) > best) best = , λ0 = b[0], λ1 = a[1];
22692277
}
2270-
}
2271-
var best = -Infinity, ;
2272-
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
2273-
b = merged[i];
2274-
if (( = angle(a[1], b[0])) > best) best = , λ0 = b[0], λ1 = a[1];
22752278
}
22762279
ranges = range = null;
2277-
return [ [ λ0, φ0 ], [ λ1, φ1 ] ];
2280+
return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];
22782281
};
22792282
}();
22802283
d3.geo.centroid = function(object) {

d3.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/geo/bounds.js

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -136,29 +136,34 @@ d3.geo.bounds = (function() {
136136

137137
d3.geo.stream(feature, bound);
138138

139-
// First, sort ranges by their minimum longitudes.
140-
ranges.sort(compareRanges);
141-
142-
// Then, merge any ranges that overlap.
143-
for (var i = 1, n = ranges.length, a = ranges[0], b, merged = [a]; i < n; ++i) {
144-
b = ranges[i];
145-
if (withinRange(b[0], a) || withinRange(b[1], a)) {
146-
if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
147-
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
148-
} else {
149-
merged.push(a = b);
139+
var n = ranges.length;
140+
if (n) {
141+
// First, sort ranges by their minimum longitudes.
142+
ranges.sort(compareRanges);
143+
144+
// Then, merge any ranges that overlap.
145+
for (var i = 1, a = ranges[0], b, merged = [a]; i < n; ++i) {
146+
b = ranges[i];
147+
if (withinRange(b[0], a) || withinRange(b[1], a)) {
148+
if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
149+
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
150+
} else {
151+
merged.push(a = b);
152+
}
150153
}
151-
}
152154

153-
// Finally, find the largest gap between the merged ranges.
154-
// The final bounding box will be the inverse of this gap.
155-
var best = -Infinity, ;
156-
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
157-
b = merged[i];
158-
if (( = angle(a[1], b[0])) > best) best = , λ0 = b[0], λ1 = a[1];
155+
// Finally, find the largest gap between the merged ranges.
156+
// The final bounding box will be the inverse of this gap.
157+
var best = -Infinity, ;
158+
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
159+
b = merged[i];
160+
if (( = angle(a[1], b[0])) > best) best = , λ0 = b[0], λ1 = a[1];
161+
}
159162
}
160163
ranges = range = null;
161164

162-
return [[λ0, φ0], [λ1, φ1]];
165+
return λ0 === Infinity || φ0 === Infinity
166+
? [[NaN, NaN], [NaN, NaN]]
167+
: [[λ0, φ0], [λ1, φ1]];
163168
};
164169
})();

test/geo/bounds-test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,36 @@ suite.addBatch({
228228
}
229229
]
230230
}), [[-120,46], [-119,47]]);
231+
},
232+
"null geometries": {
233+
"Feature": function(bounds) {
234+
var b = bounds({type: "Feature", geometry: null});
235+
assert.isNaN(b[0][0]);
236+
assert.isNaN(b[0][1]);
237+
assert.isNaN(b[1][0]);
238+
assert.isNaN(b[1][1]);
239+
},
240+
"MultiPoint": function(bounds) {
241+
var b = bounds({type: "MultiPoint", coordinates: []});
242+
assert.isNaN(b[0][0]);
243+
assert.isNaN(b[0][1]);
244+
assert.isNaN(b[1][0]);
245+
assert.isNaN(b[1][1]);
246+
},
247+
"MultiLineString": function(bounds) {
248+
var b = bounds({type: "MultiLineString", coordinates: []});
249+
assert.isNaN(b[0][0]);
250+
assert.isNaN(b[0][1]);
251+
assert.isNaN(b[1][0]);
252+
assert.isNaN(b[1][1]);
253+
},
254+
"MultiPolygon": function(bounds) {
255+
var b = bounds({type: "MultiPolygon", coordinates: []});
256+
assert.isNaN(b[0][0]);
257+
assert.isNaN(b[0][1]);
258+
assert.isNaN(b[1][0]);
259+
assert.isNaN(b[1][1]);
260+
}
231261
}
232262
}
233263
});

0 commit comments

Comments
 (0)