Skip to content

Commit e0c91c1

Browse files
committed
d3.geo.area: return positive areas.
1 parent 7860b0d commit e0c91c1

4 files changed

Lines changed: 30 additions & 6 deletions

File tree

d3.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5519,7 +5519,7 @@
55195519
λ0 = λ, φ0 = φ;
55205520
cosφ0 = cosφ, sinφ0 = sinφ;
55215521
}
5522-
return area > 2 * π && area <= 4 * π ? 4 * π - area : area <= -2 * π && area > -4 * π ? area + 4 * π : area;
5522+
return Math.abs(area < -ε ? 4 * π + area : area);
55235523
}
55245524
var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {
55255525
return Math.sqrt(2 / (1 + cosλcosφ));

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/area.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ var d3_geo_areaType = d3_geo_type({
1313
Feature: function(feature) { return d3_geo_areaType.geometry(feature.geometry); },
1414
FeatureCollection: function(collection) { return d3.sum(collection.features, d3_geo_areaType.Feature); },
1515
GeometryCollection: function(collection) { return d3.sum(collection.geometries, d3_geo_areaType.geometry); },
16-
geometry: function(geometry) { return d3_geo_areaType[geometry.type](geometry); } // TODO add 3rd argument to d3.sum?
16+
geometry: function(geometry) { return d3_geo_areaType[geometry.type](geometry); }
1717
});
1818

1919
function d3_geo_areaPolygon(polygon) {
@@ -58,7 +58,5 @@ function d3_geo_areaRing(ring) {
5858
λ0 = λ, φ0 = φ;
5959
cosφ0 = cosφ, sinφ0 = sinφ;
6060
}
61-
return area > 2 * π && area <= 4 * π ? 4 * π - area
62-
: area <= -2 * π && area > -4 * π ? area + 4 * π
63-
: area;
61+
return Math.abs(area < -ε ? 4 * π + area : area);
6462
}

test/geo/area-test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,32 @@ suite.addBatch({
5555
"semilune": function(area) {
5656
assert.inDelta(area(d3.geo.graticule().extent([[0, 0], [90, 90]]).outline()), π / 2, 1e-5);
5757
}
58+
},
59+
"circles": {
60+
"hemisphere": function(area) {
61+
assert.inDelta(area(d3.geo.circle().angle(90)()), 2 * π, 1e-5);
62+
},
63+
"45°": function(area) {
64+
assert.inDelta(area(d3.geo.circle().angle(45).precision(.1)()), π * (2 - Math.SQRT2), 1e-5);
65+
},
66+
"45° North": function(area) {
67+
assert.inDelta(area(d3.geo.circle().angle(45).precision(.1).origin([0, 90])()), π * (2 - Math.SQRT2), 1e-5);
68+
},
69+
"45° South": function(area) {
70+
assert.inDelta(area(d3.geo.circle().angle(45).precision(.1).origin([0, -90])()), π * (2 - Math.SQRT2), 1e-5);
71+
},
72+
"135°": function(area) {
73+
assert.inDelta(area(d3.geo.circle().angle(135).precision(.1)()), π * (2 + Math.SQRT2), 1e-5);
74+
},
75+
"135° North": function(area) {
76+
assert.inDelta(area(d3.geo.circle().angle(135).precision(.1).origin([0, 90])()), π * (2 + Math.SQRT2), 1e-5);
77+
},
78+
"135° South": function(area) {
79+
assert.inDelta(area(d3.geo.circle().angle(135).precision(.1).origin([0, -90])()), π * (2 + Math.SQRT2), 1e-5);
80+
},
81+
"tiny": function(area) {
82+
assert.inDelta(area(d3.geo.circle().angle(1e-6)()), 0, 1e-6);
83+
}
5884
}
5985
},
6086
"MultiPolygon": {

0 commit comments

Comments
 (0)