2

我正在使用

var bounds = d3.geo.path()
    .projection(function(d) { return d; })
    .bounds;

获得所有国家功能的界限。一切都很好,直到我遇到跨越反子午线的斐济或俄罗斯。

Fiji.bb = [[-180,-18.294755298529864], [180.00000000000006,-16.037142847284727]];
// with [[West,South],[East,North]]

纬度反馈是完美的,让我们在这个问题上忽略它们。然而,边界框的纵向宽度太大了,从 W:-180 到 E:+180。

从计算机或 GIS 的角度来看,这是完全合理的,但作为一个人类,我完全错过了真正的西方和东方的界限。

// current data back
Fiji.bb = [[-180,-18.294...],[180.00000000000006,-16.0371...]];
// wanted data back
Fiji.bb = [[177,-18.294...],[-179,-16.0371...]];

截至目前,我看不到任何方法可以获取这些岛屿的真实西部 (~177⁰) 和东部 (~ -179⁰) 值。

有没有一种方法可以通过 d3js 获取这些岛的真实边界框值?

我目前计划通过为自己提供一些近似的 WSEN 值来绕过这个问题,基于以前的D3.geo :球面弧而不是平行线?. 这有点难看,但它会起作用。


编辑: 有趣的是,该区域是正确计算的:

var area = d3.geo.path()
    .projection(function(d) { return d; })
    .area;
// area = 1.639711598252461;

这让我认为 D3js 有一种内部方法来正确管理跨越反子午线的特征,而无需总是做全球性的戏剧。

4

2 回答 2

4

您应该使用d3.geo.bounds它,因为您需要球坐标中的边界框。

(使用d3.geo.path恒等函数作为投影不起作用,因为 d3.geo.path 只能计算笛卡尔坐标中的边界框。)

有关详细信息,请参阅 Jason Davies 的地理边界框页面。

于 2015-06-15T20:27:33.463 回答
1

我手动纠正了斐济、俄罗斯和新西兰的东西方价值观。就像是:

var bounds = d3.geo.path()
    .projection(function(d) { return d; })
    .bounds;
var bb = bounds(countries[i]);
var red_rect = function () {
    if (countries[i].id === "Fiji") {bb[0][0] = 177; bb[1][0] = -179;}
    if (countries[i].id === "Russia") { bb[0][0] = 19.5; bb[1][0] = -169; }
    if (countries[i].id === "New Zealand") { bb[0][0] = 165.5; bb[1][0] = -176;}
    if (true) {
        return t = {
            type: "Polygon",
            coordinates: [ 
                [ [bb[0][0] - 5, bb[0][1] - 5] ]
                .concat(parallel(bb[1][1] + 5, bb[0][0] - 5, bb[1][0] + 5))
                .concat(parallel(bb[0][1] - 5, bb[0][0] - 5, bb[1][0] + 5).reverse())
            ]
        }
    }
}
于 2015-01-31T21:41:12.350 回答