D3.geo.bounds不返回边界框?

时间:2013-07-18 21:50:28

标签: javascript d3.js geospatial

我遇到了一个问题,我已追溯到d3.geo.bounds函数中的意外行为。

var bounds = d3.geo.bounds(data);

对于仅包含点要素的geoJSON FeatureCollection,不会返回正确的边界框:具体而言,集合中第一个和最后一个点的x值似乎用于代替最小和最大x值。一组点。这可以在http://jsbin.com/icosof/4/edit的行动中看到。

因此返回的边界框坐标包括最小和最大y值,但不包括最大和最小x值。相反,这些似乎是从集合中的第一个和最后一个特征中获取的:

[[6113.30166221, -6663.98951731], [5153.32052977, -77.3529517971]]

通过直接操作坐标生成边界对象

xvalues = [];
$.each(data.features, function(i,el){
  xvalues.push(el.geometry.coordinates[0]);
});

yvalues = [];
$.each(data.features, function(i,el){
  yvalues.push(el.geometry.coordinates[1]);
});
console.log([[Math.min.apply(null,xvalues),Math.min.apply(null,yvalues)],
[Math.max.apply(null,xvalues),Math.max.apply(null,yvalues)]]);

产生所需的结果:

 [[3397.33954824, -6663.98951731], [6504.18296202, -77.3529517971]]

d3.geo.bounds是否期望按x坐标排序的FeatureCollection(如果是这样,我将如何解决此问题),或者这是一个错误?

1 个答案:

答案 0 :(得分:0)

我认为这里的混淆是d3.geo.bounds期望要素具有纬度/经度值,而不是x / y值。因此,您的输入将被视为% 360,您将无法获得预期的最大/最小值。

您可能需要将坐标转换为纬度/经度值才能使其工作 - 留给读者练习,因为我不知道您的坐标系是什么。