- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Mike Bostock 示例的 d3.v3 的美国 map :
我希望 map 在页面加载时最初放大到标记的位置,但应该呈现整个 map ,以便用户可以根据需要缩小。
var w = 300;
var h = 280;
//Define map projection
var projection = d3.geo.albersUsa()
.translate([w/2, h/2])
.scale([300]);
//Define path generator
var path = d3.geo.path()
.projection(projection);
//Create SVG element
var svg = d3.select("#map1").append("svg")
.attr("width", w)
.attr("height", h)
var g = svg.append("g");
var tooltip = d3.select("body")
.append("div")
.style("position", "absolute")
.style("z-index", "1000")
.style('opacity', 0)
.style("font-family", "sans-serif")
.style("background-color", "white")
.style("border-radius", "5px")
.style("padding", "10px")
.style('color', '#000')
.style("font-size", "12px");
//Load in GeoJSON data
d3.json("us-states.json", function(json) {
d3.csv("cities.csv", function(error, data) {
g.selectAll("circle")
.data(data)
.enter()
.append("circle")
.attr("cx", function(d) {
return projection([d.longi, d.lati])[0];
})
.attr("cy", function(d) {
return projection([d.longi, d.lati])[1];
})
.attr("r", 4)
.style("fill", "#4F6D88")
.on("mouseover", function(d){
tooltip.transition().style("opacity", 0.9)
.style('left', (d3.event.pageX) + 'px')
.style('top', (d3.event.pageY) + 'px')
.text(d.city)
})
.on("mousemove", function(event){
tooltip.style("top", (event.pageY-10)+"px").style("left",(event.pageX+10)+"px");
})
.on("mouseout", function(){
tooltip.transition().delay(500).style("opacity", 0);
});
});
//Bind data and create one path per GeoJSON feature
g.selectAll("path")
.data(json.features)
.enter()
.append("path")
.attr("d", path);
});
var zoom = d3.behavior.zoom()
.scaleExtent([1, 50])
.on("zoom", function() {
var e = d3.event,
tx = Math.min(0, Math.max(e.translate[0], w - w * e.scale)),
ty = Math.min(0, Math.max(e.translate[1], h - h * e.scale));
zoom.translate([tx, ty]);
g.attr("transform", [
"translate(" + [tx, ty] + ")",
"scale(" + e.scale + ")"
].join(" "));
});
svg.call(zoom)
我有使用上面粘贴的滚动放大的代码,但我希望它能够放大加载到这些特定位置。我想要的样子:
最佳答案
在 d3 中缩放 map 有两种主要方法:
在 d3v4 中使用 fitSize 或 fitExtent 修改投影是最简单的 - 尽管您需要将点转换为 geojson。您还可以手动计算平移和缩放值来更新投影(请参阅 Mike Bostock 的 this answer,其中解释了这种常见的 d3v3 方法)。
或者,您可以通过调用缩放函数来修改绘制的路径 - this question昨天问的有一个很好的例子(在 d3v4 中)。或者,您可以手动计算并应用缩放,然后更新缩放以指示当前比例并进行平移。我将使用修改上面提到的 d3v3 投影的常用方法(使用 Mike 的答案)并将其应用于路径上的变换 - 而不是修改投影。 尽管不难看出如何更改我的答案以修改投影。
<小时/>首先,您需要确定点的 x 和 y 坐标之间的最大差值。如果处理两点,这将相当容易:
var data = [[-100,45],[-110,45]];
var p1 = projection(data[0]);
var p2 = projection(data[1]);
var dx = Math.abs(p1[0] - p2[0]);
var dy = Math.abs(p1[1] - p2[1]);
为了更简短的答案,我假设使用简单的数据格式。另外,如果处理很多点,这会更复杂一些。一种可能的选择是将您的点放入 geojson 中并获取点的边界框。
现在我们需要找出点的质心 - 对于两个点,这只是 x 和 y 值的平均值:
var x = (p1[0] + p2[0])/2;
var y = (p1[1] + p2[1])/2;
接下来我们需要计算一个新的比例尺,同时还要确定比例尺是否受到坐标 x 值差异或坐标 y 值差异的限制:
var scale = 0.9 / Math.max( dx/w , dy/h );
0.9 稍微缩小了比例,它与 0.9 * scale
相同,并且允许可变的边距量。 dx/w 返回的值是我们需要在 svg 容器的宽度上拉伸(stretch)差异的比例值的 1 倍。
(这样写可能更有意义:var scale = 0.9 * Math.min(w/dx,h/dy);
- 我们希望通过最低比例值并将其乘以某个百分比以给出边距。但另一种表示形式在在线示例中普遍存在)
现在我们有了一个比例,我们只需要确定一个翻译。为此,我们找出需要将 x
和 y
变量中保存的值重新定位多远,以便这些值居中:
var translate = [w/2 - scale * x, h/2-scale*y];
现在您可以设置 map 的初始比例和平移:
g.attr("transform", "translate("+translate+")scale("+scale+")");
但是,您可能希望在页面加载时更新缩放参数以反射(reflect)初始缩放和平移:
zoom.translate(translate);
zoom.scale(scale);
这样,当您放大或缩小初始 View 时,变化是相对于您的初始缩放而言的。
现在您所要做的就是在添加积分时包含上述代码。请注意,如果您想返回到初始位置,则此技术可能需要进行一些修改。
关于javascript - d3 美国 map 缩放加载至标记状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47750168/
虽然我在 reactjs 组件(组件名称为 renderLocationLink)的渲染方法返回的 html 中包含了 a 标签的 onclick 处理程序,但渲染正确地发生了 onclick 处理程
我必须以 docx 格式存储一些文档,但无法忍受使用 msword:我想编辑某种纯文本标记,除了基于 XML 的东西(我也不喜欢那样)和从/到那个到/从 docx 转换。 有什么选择吗? 编辑:由于人
有一个页面,其 anchor 标记在延迟后变得可点击。我想使用用户脚本在可点击后点击它。 页面加载时,HTML 源代码为: Download 延迟一段时间后,#button 变
我正在将 XML 文件解析为 pandas 数据帧。使用下面的代码我可以成功获取所有内容,但是这使用了完整 XML 的编辑版本。完整的 XML 在主数据表之上有一堆摘要数据,请参阅完整的 XML he
目前我正在研究 xml.sax 解析器来解析 xml 文件 假设我有以下代码 filepath = 'users/file.xml' try: parser = xml.sax.make_pa
我正在尝试构建一种语法来解释用户输入的文本,搜索引擎风格。它将支持 AND、OR、NOT 和 ANDNOT bool 运算符。我几乎所有东西都在工作,但我想添加一个规则,将引用字符串之外的两个相邻关键
我遇到了 Terraform EKS 标记的问题,并且似乎没有找到可行的解决方案来在创建新集群时标记所有 VPC 子网。 提供一些上下文:我们有一个 AWS VPC,我们在其中将多个 EKS 集群部署
我是xpath的新手,对此了解不多。我知道有一种方法可以使用xpath在xml / xhtml文件中查找特定标签。就我而言,我试图找到第一个(a)链接元素。不幸的是,我的xpath字符串[// a [
我在索引页上的产品卡上遇到问题。在产品卡内部,我有 Vue 组件来渲染表单(数量和添加到购物车按钮)。当我单击“添加到购物车”按钮时,我得到了预期的结果。响应被发送到根 vue 组件,然后我看到产品已
html setMouse(true)} onMouseEnter={() => setMouse(false)} className='resume-container'> CSS .resum
我在组件中有一组枚举,如下所示: type TOption = (clVisible, clVisibleAlways, clRenderable, clEditable); TOptions
是否有出于性能考虑的javadoc标签? 人们可以想象: /** * ...other javadoc tags... * @perform Expected to run in O(n) tim
html setMouse(true)} onMouseEnter={() => setMouse(false)} className='resume-container'> CSS .resum
我有一个包含多个小子图的图。目标是当且仅当子图中的所有节点都是蓝色时,才将子图中的所有蓝色节点标记为红色。如果子图中的一个节点具有不同的颜色,绿色,那么我们将不会更改该子图中节点的颜色。 这是我正在使
我正在使用 json-ld 开发事件标记以包含在确认电子邮件中。 我的一些事件会定期重复发生。但是,最新的 Schema.org 规范不支持重复发生的事件,因此我遵循了此处提供的建议:http://l
我创建了一个插件,可以添加带有相应行号的标记。现在,这很棒,因为它现在显示在“标记” View 中。有没有办法当我双击标记上的一行时,它会转到标记指示的行? 谢谢。 最佳答案 双击“标记” View
是否有一个插件具有与 Facebook 标记类似的行为? 它的特别之处在于它具有: 在键入的单词之间自动完成 特殊输出的 html(与另一个输入字段同步) 最佳答案 您可以使用jquery提及输入pl
有没有更好的方法来读取java文件中的 token ?我目前正在使用 StringTokenizer 来分割 token 。但在大多数情况下,它的效率可能非常低,因为您必须逐个 token 地读取 t
我想知道是否有某种方法可以标记文件来识别该文件是否包含x。 考虑以下示例: 在批量转换过程中,我正在创建一个日志文件,其中列出了各个转换的成功/失败。 所以流程如下: 开始转换过程 创建名为batch
我一直在尝试模拟点击标签,但这并没有像我需要的那样工作。我的 anchor 标记看起来像这样 Download this pic 正常的 $("a").click() 或 trigger('cli
我是一名优秀的程序员,十分优秀!