首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >半径以迈尔斯为单位的D3托波逊圆

半径以迈尔斯为单位的D3托波逊圆
EN

Stack Overflow用户
提问于 2017-03-22 17:37:01
回答 1查看 874关注 0票数 1

(假设现有投影/topojson)

我想做的是在半径(r)的一点(长,拉)上创建一个圆(R),以英里为单位。我知道这里有一个d3.geo函数,但是经过一些考虑后,我不认为它将与我的特定应用程序非常兼容。

现在我正在寻找一个本地的svg circle解决方案,其中cx和cy是lat和long,r是半径(以英里为单位)。我知道cx和cy,但我不知道如何确定r是15英里。因此,最主要的是如何确保半径在像素空间绘制时以英里为单位。必须有办法使用projection函数为半径设置适当的标度。但我还没在实践中见过这个。

此外,我还应该指出,我的投影是动态的,取决于用户事件的投影(包括缩放)可能发生的变化。因此,我不确定这是否会影响到在现有投影的范围内如何缩放圆圈,但我想,为了安全起见,我会披露这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-25 15:52:12

为什么不使用内置的圆生成器d3.geoCircle()

返回“多边形”类型的新GeoJSON几何对象,该对象与当前的居中半径精密度近似为球面上的一个圆。任何参数都会传递给访问器。

剩下的唯一任务就是计算圆周的半径(以度为单位)。因为地球不是一个完美的球体,这本身就会成为相当大的挑战。但对于许多应用程序来说,近似就足够了。仅考虑到3,958英里的平均半径,计算可以写成:

代码语言:javascript
复制
var EARTH_RADIUS = 3959;                         // mean radius in miles
var radiusMi     = 5;                            // radius to be drawn in miles
var radiusDeg    = radiusMi / EARTH_RADIUS * 90; // radius in degrees for circle generator

然后,可以将它传递给圆圈生成器:

代码语言:javascript
复制
var circle = d3.geoCircle().radius(radiusDeg);

最后,圆圈生成器用于通过数据绑定将其输出传递到适当的路径生成器,同时考虑到投影:

代码语言:javascript
复制
svg.append("path")
  .datum(circle)
    .attr("d", path);

看看这个区块,它的特征是半径50英里的圆圈,每个圆圈位于世界各地的不同位置。圆发生器与投影相结合,可以控制圆的正确大小和形状。

D3 v3

如果您仍然坚持使用D3 v3,那么这个示例也可以工作。但是,您需要相应地调整名字

此外,圆生成器的一些方法被重命名为:

将这些调整应用于我的上述链接块,这同样适用于v3:v3块

当涉及到具有严重扭曲现象的异常预测时,这种方法就会发挥其优势。只要将块中的投影更改为d3.geoGnomonic(),就很容易看到。更新后的区块截图仍然显示相同的圆圈,每个圆圈的半径为50英里:

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

https://stackoverflow.com/questions/42958915

复制
相关文章

相似问题

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