【问题标题】:D3.geo.bounds does not return bounding box?D3.geo.bounds 不返回边界框?
【发布时间】:2013-07-19 06:36:32
【问题描述】:

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

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

对于仅包含点特征的 geoJSON FeatureCollection,不会返回正确的边界框:具体而言,似乎使用了集合中第一个和最后一个点的 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(如果是,我将如何解决这个问题),还是这是一个错误?

【问题讨论】:

    标签: javascript d3.js geospatial


    【解决方案1】:

    我认为这里的混淆在于d3.geo.bounds 期望要素具有纬度/经度值,而不是 x/y 值。所以你的输入被当作% 360,你不会得到你期望的最大值/最小值。

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

    【讨论】:

    • 我认为 D3 不会对纬度进行任何额外的处理,只是对经度进行处理。
    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 2012-11-09
    • 2017-04-16
    • 1970-01-01
    • 2021-02-12
    • 2020-10-02
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多