首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >D3.geo :球面弧,而不是平行直线?

D3.geo :球面弧,而不是平行直线?
EN

Stack Overflow用户
提问于 2014-08-20 23:04:45
回答 2查看 2.4K关注 0票数 6

我刚刚做了一个D3js地球仪,它看起来像这样:

如果你仔细看,红色方块看起来很难看,因为它不遵循地球的曲线。我有以十进制为单位的面积边框:

代码语言:javascript
复制
var bb = {W:-5.0, N:50.0, E:10.0, S:40.0 }

我画的线如下:

代码语言:javascript
复制
svg.append("path")
.datum({type: "LineString", coordinates: 
        [[-5, 40], [-5, 50], [10, 50], [10, 40], [-5, 40]]
       })
.attr("d", path);

对于更大的区域,它甚至与预期相反(对于一个包围框):

如何添加比较优雅的球面弧?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-21 00:06:58

给定已知的十进制包围框(从这里挖到bb),例如:

代码语言:javascript
复制
  bounds = [[-50.8,20.0][30,51.5]];
  WNES0 = bounds[0][0], // West    "W":-50.8  
  WNES1 = bounds[1][2], // North   "N": 51.5
  WNES2 = bounds[1][0], // East    "E": 30
  WNES3 = bounds[0][3], // South   "S": 20.0

需要一些数学。

代码语言:javascript
复制
// *********** MATH TOOLKIT ********** //
function parallel(φ, λ0, λ1) {
  if (λ0 > λ1) λ1 += 360;
  var dλ = λ1 - λ0,
      step = dλ / Math.ceil(dλ);
  return d3.range(λ0, λ1 + .5 * step, step).map(function(λ) { return [normalise(λ), φ]; });
}
function normalise(x) {
  return (x + 180) % 360 - 180;
}   

然后,让我们计算多边形的坐标并投影它:

代码语言:javascript
复制
// *********** APPEND SHAPES ********** //
svg.append("path")
.datum({type: "Polygon", coordinates: [
    [[WNES0,WNES3]]
      .concat(parallel(WNES1, WNES0, WNES2))
      .concat(parallel(WNES3, WNES0, WNES2).reverse())
  ]})
.attr("d", path)
.style({'fill': '#B10000', 'fill-opacity': 0.3, 'stroke': '#B10000', 'stroke-linejoin': 'round'})
.style({'stroke-width': 1 });

180经线交叉:180经络上的盒需要特殊管理。例如,在⁰东部155号和-155号西部之间的一组太平洋岛屿的本地化最初是.

...with正确旋转(+180⁰):

..。用正确的拳击:

定位器现在完美了!块上的现场演示

代码语言:javascript
复制
var bb = { "item":"India", "W": 67.0, "N":37.5, "E": 99.0, "S": 5.0 }, 
localisator("body", 200, bb.item, bb.W, bb.N, bb.E, bb.S);

+1欢迎。

票数 12
EN

Stack Overflow用户

发布于 2014-08-21 00:32:25

您可以使用在分度发生器中构建的d3来实现以下功能:

代码语言:javascript
复制
var bb = {W: -5.0, N: 50.0, E: 10.0, S: 40.0 };
var arc = d3.geo.graticule()
    .majorExtent([[bb.W, bb.S], [bb.E, bb.N]]);

然后使用网格生成器的大纲函数绘制路径:

代码语言:javascript
复制
svg.append("path")
    .attr("class", "arc")
    .attr("d", path(arc.outline()));

完整的工作示例可以找到这里

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25415885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档