d3.geo.area: return positive areas.

This commit is contained in:
Jason Davies 2012-12-09 20:32:01 +00:00
Родитель 7860b0d31e
Коммит e0c91c1e27
4 изменённых файлов: 30 добавлений и 6 удалений

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

@ -5519,7 +5519,7 @@
λ0 = λ, φ0 = φ;
cosφ0 = cosφ, sinφ0 = sinφ;
}
return area > 2 * π && area <= 4 * π ? 4 * π - area : area <= -2 * π && area > -4 * π ? area + 4 * π : area;
return Math.abs(area < -ε ? 4 * π + area : area);
}
var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {
return Math.sqrt(2 / (1 + cosλcosφ));

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

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

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

@ -13,7 +13,7 @@ var d3_geo_areaType = d3_geo_type({
Feature: function(feature) { return d3_geo_areaType.geometry(feature.geometry); },
FeatureCollection: function(collection) { return d3.sum(collection.features, d3_geo_areaType.Feature); },
GeometryCollection: function(collection) { return d3.sum(collection.geometries, d3_geo_areaType.geometry); },
geometry: function(geometry) { return d3_geo_areaType[geometry.type](geometry); } // TODO add 3rd argument to d3.sum?
geometry: function(geometry) { return d3_geo_areaType[geometry.type](geometry); }
});
function d3_geo_areaPolygon(polygon) {
@ -58,7 +58,5 @@ function d3_geo_areaRing(ring) {
λ0 = λ, φ0 = φ;
cosφ0 = cosφ, sinφ0 = sinφ;
}
return area > 2 * π && area <= 4 * π ? 4 * π - area
: area <= -2 * π && area > -4 * π ? area + 4 * π
: area;
return Math.abs(area < -ε ? 4 * π + area : area);
}

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

@ -55,6 +55,32 @@ suite.addBatch({
"semilune": function(area) {
assert.inDelta(area(d3.geo.graticule().extent([[0, 0], [90, 90]]).outline()), π / 2, 1e-5);
}
},
"circles": {
"hemisphere": function(area) {
assert.inDelta(area(d3.geo.circle().angle(90)()), 2 * π, 1e-5);
},
"45°": function(area) {
assert.inDelta(area(d3.geo.circle().angle(45).precision(.1)()), π * (2 - Math.SQRT2), 1e-5);
},
"45° North": function(area) {
assert.inDelta(area(d3.geo.circle().angle(45).precision(.1).origin([0, 90])()), π * (2 - Math.SQRT2), 1e-5);
},
"45° South": function(area) {
assert.inDelta(area(d3.geo.circle().angle(45).precision(.1).origin([0, -90])()), π * (2 - Math.SQRT2), 1e-5);
},
"135°": function(area) {
assert.inDelta(area(d3.geo.circle().angle(135).precision(.1)()), π * (2 + Math.SQRT2), 1e-5);
},
"135° North": function(area) {
assert.inDelta(area(d3.geo.circle().angle(135).precision(.1).origin([0, 90])()), π * (2 + Math.SQRT2), 1e-5);
},
"135° South": function(area) {
assert.inDelta(area(d3.geo.circle().angle(135).precision(.1).origin([0, -90])()), π * (2 + Math.SQRT2), 1e-5);
},
"tiny": function(area) {
assert.inDelta(area(d3.geo.circle().angle(1e-6)()), 0, 1e-6);
}
}
},
"MultiPolygon": {