问题标签 [d3.geo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
d3.js - 在 D3 地理投影中组合两个旋转?
根据我找到的所有优秀示例,玩 D3 地理正交投影来构建交互式地球仪。
你可以在http://bl.ocks.org/patricksurry/5721459看到我的简单模型
我希望用户像轨迹球一样操纵地球(http://www.opengl.org/wiki/Trackball)。我从 Mike 的一个示例(http://mbostock.github.io/d3/talk/20111018/azimuthal.html)开始,并稍微改进以使用画布坐标并以“轨迹球坐标”表示鼠标位置(即绕画布水平和垂直轴),以便固定的鼠标移动在地球边缘附近提供更多旋转(如果您使用上面解释的双曲线扩展,则可以在地球之外工作),而不是迈克的一对一对应。
当地球开始于未旋转的位置(北极垂直)时,它工作得很好,但是当地球已经旋转(操纵示例使北极面向页面外)时,轨迹球控件变得不直观,因为你可以不要简单地将轨迹球坐标的变化表示为 d3.geo.rotate 纬度/经度坐标中的增量。D3 的 3 轴旋转包括应用经度旋转(围绕北极旋转),然后是纬度旋转(围绕画布平面中的水平轴旋转),然后是“偏航”旋转(围绕垂直于平面的轴旋转) - 见http://bl.ocks.org/mbostock/4282586。
我想我需要的是一种组合我的两个旋转矩阵的方法(当前在投影中的一个,用一个新的来稍微旋转轨迹球),但是除了挖掘之外,我在 D3 中看不到这样做的方法进入源代码(https://github.com/mbostock/d3/blob/master/src/geo/rotation.js)并尝试进行数学运算来定义旋转矩阵。代码看起来很优雅但没有注释,我不确定我是否可以正确地用正交投影实例破译闭包。
最后一点,如果有人知道 d3.geo.projection 的旋转矩阵形式,那也可能解决我的问题。
有任何想法吗?
d3.js - D3.geo:平行线是球弧而不是直线?
我刚刚制作了一个 D3js 地球本地化器,它看起来像这样:
如果你仔细看,红色方块看起来很丑,因为它不遵循地球的曲线。我有十进制度的区域边界框:
我画的线如下:
对于更大的区域,它甚至是与预期相反的曲线(对于边界框):
如何添加相当优雅的球面弧?
javascript - 为什么设置缩放比例时 Math.PI * 2 倍?
在一些 d3 平铺地图示例中,当使用投影设置缩放比例时,它总是乘以 2*Math.PI。
例如,在这个演示“D3 Tile Map with Hand-Drawn Polygon”中。
http://bl.ocks.org/emeeks/11051379
我认为 projection.scale() 是像素单位。非常混淆单位缩放比例()使用什么。
javascript - D3.js 在画布图像上映射投影
我正在尝试获取画布元素的内容(实际上只是加载到画布上的图像)并使用 d3 将它们扭曲为不同的地图投影。所以因为我已经找到了一个这样做的例子(this other SO question)。
问题是它不适用于每个投影。编码:
在上面的例子中,如果我将投影的比例设置得太低(比如 80),那么变量 p(在 for 循环中)最终会变成null
. 我不确定为什么会发生这种情况,我需要设置比例以使投影适合画布区域。
一个有效的 jsfiddle 示例:http: //jsfiddle.net/vjnfyd8t/
d3.js - 使用 D3 的 projection.stream() 的正确方法是什么?
所以我在做一些实验D3's geo stream
API
,感觉有点朦胧。我一直在阅读这里的文档:
https://github.com/mbostock/d3/wiki/Geo-Streams
我的困惑之一是流转换的正确实现。假设我创建了一个:
根据文档,this.stream引用了“包装流”。但什么是流,真的吗?据我所知,它更像是一个过程,而不是显式的数据结构——一系列数据和函数调用来转换数据。上面的语法似乎表明包装的流只是包含“流侦听器” 的对象
继续前进,我可以使用投影方法应用流变换:
虽然我不太了解底层机制,但效果似乎相对简单:路径生成器的底层变换函数是使用变换x,y
参数调用的。
对于我的用例,我觉得这没什么用,特别是因为我的输入数据还没有被投影。我想先使用投影来转换数据,然后再转换那些输出的坐标。为此,是否有分层变换的通用模式?
我看到它D3
确实提供了在应用侦听器之前首先应用投影变换的 projection.stream( listener ) 模式,但我不确定如何实现这一点。侦听器参数应该是什么?这是一个例子:http: //jsfiddle.net/kv7yn8rw/2/。
任何指导将不胜感激!
d3.js - D3js:如何获得穿过反子午线的特征的真实边界框?
我正在使用
获得所有国家功能的界限。一切都很好,直到我遇到跨越反子午线的斐济或俄罗斯。
纬度反馈是完美的,让我们在这个问题上忽略它们。然而,边界框的纵向宽度太大了,从 W:-180 到 E:+180。
从计算机或 GIS 的角度来看,这是完全合理的,但作为一个人类,我完全错过了真正的西方和东方的界限。
截至目前,我看不到任何方法可以获取这些岛屿的真实西部 (~177⁰) 和东部 (~ -179⁰) 值。
有没有一种方法可以通过 d3js 获取这些岛的真实边界框值?
我目前计划通过为自己提供一些近似的 WSEN 值来绕过这个问题,基于以前的D3.geo :球面弧而不是平行线?. 这有点难看,但它会起作用。
编辑: 有趣的是,该区域是正确计算的:
这让我认为 D3js 有一种内部方法来正确管理跨越反子午线的特征,而无需总是做全球性的戏剧。
d3.js - D3js 过渡混乱?
在我的重投影过渡期间(从上到下),我得到了奇怪的伪影:
(1) 起始状态快照:
(2) 过渡(放大)快照:
(3) 最终状态快照:
现场演示在那里。控制台中没有错误消息。初始状态和最终状态都是完美的。我没有任何线索。有这种过渡/重投影显示错误的经验吗?
javascript - d3.js 和 python 的 googlemaps(来自 d3.geo.path() 的更多 NaN)
我正在尝试使用带有节点和链接数据的 cvs 文件中的数据修改此示例。我有从 python 的googlemaps 模块获得的地址。所有节点都有两个浮点数39.338923 / -74.475714
,表示经度/纬度 (lng/lat) 坐标。但是,当我到达:
在上述示例中,事情变得可疑。显示path()
via的输出console.log
,我看到NaN
和LNaN
。我看过这个SO question,我相当肯定所有 lng/lat 值都是“kosher”。
由于我对 javascript、d3.json 和制图非常陌生,我应该如何解决这个问题?我目前卡住了。由于path()
的输出是一个字符串,我可以找到 lng., lat. 给出的值NaN
。这里有些例子:
由于该问题,有很多链接数据无法使用。我知道在此之前代码可能在很多地方出错。我会说,如果我注释掉上面的.attr("d",
......,就没有错误。不幸的是,在这种情况下没有绘制链接。非常感谢任何和所有帮助!
d3.js - D3(波多黎各)上更详细的国家多边形
我正在关注地图制作教程,我希望在教程中放大波多黎各(而不是英国)的地图。
不过,为了调整项目参数,我不得不依靠修改这些值,因为我期望的结果并没有出现。
我目前正在使用 d3.geo.mercator() 而不是 albers()
虽然我想做类似下面的事情(这使得波多黎各路径出现在屏幕外 - 什么都看不到)。
d3.js - d3.js 带有地图图块的缩放过渡
我正在尝试在使用图块的地图上实现缩放转换。我想放大一个位置,然后在另外两个位置之间来回移动。
这是我正在使用的示例:http: //bl.ocks.org/mbostock/6242308 这就是我想要的,只是我希望使用地图图块而不是 topojson 或 geojson 文件。
现在地图正在跳转函数中调用最终位置,但位置之间的转换不起作用。任何关于正在发生的事情的想法都会受到极大的欢迎 - 控制台中没有显示任何内容,我有点卡住了。非常感谢。
我的代码在下面,它也在这个plunker中。