- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个 (d3 v4) 制图可视化,它允许用户在许多数据集(json 文件)和两个不同区域(一个行政单位)之间切换国家和较小的行政单位并入其首都)。实际上,通过按钮和 jquery,在初始国家/地区级别从一个数据集切换到另一个数据集效果很好。
问题:当切换到关于首都的 map /数据集时,它有点不太令人信服,因为投影最初是为整个国家设置的,因此用户必须多次缩放才能可视化妥妥的都城 map 。我想在调用投影时更改 .scale 和 .center 的值,但经过几次试验我还没有找到如何去做。
因为我只有两个不同的区域要显示,我的直觉是设置 scale 和 center 的第一个值并将它们更改为其他值(我知道我想在这两种情况下使用的 .scale 和 .center 的值) 当用户通过功能切换到首都 map 时。是否有可能轻松切换这些值?你对解决这个问题有什么建议吗?
当用户单击按钮切换到另一个数据集时,我将 json 文件路径加载到一个函数中,我试图以相同的方式加载 scale 的值,但我可能做错了。好像关于投影的那部分代码不能放在函数里?
感谢您的帮助!
我的一小部分代码:
var width = 1100, height = 770;
var projection = d3.geoConicConformal()
.scale(19000) // value I would like to which when the region changes
.center([4.45, 50.53]) // value I would like to which when the region changes
.translate([width/2,height/2]);
var svg = d3.select( "#mapcontainer" )
.append( "svg" )
.attr("width", width)
.attr("height", height)
.style("border", "solid 1px black");
var path = d3.geoPath()
.projection(projection);
var color, jsonfile, legendtext;
function load (jsonfile, legendtext, color) {
d3.selectAll(".currentmap").remove() ;
d3.json(jsonfile, function(error, belgique) {
g.selectAll("path")
.data(belgique.features)
.enter()
.append("path")
.attr("d", path)
.style("stroke", "#fff")
.attr( "class", "currentmap")
.style("fill", function(d) {
var value = d.properties.DATA;
if (value) {return color(value);}
else {return "rgb(250,110,110)"}
});
})
};
//one of the following function for each map
function BGQprovinces() {
jsonfile = "ATLAS/NewGeoJson/bgq-data1-provinces.json";
legendText [= …];
color = d3.scaleOrdinal()
.domain( […])
.range([…]);
load(jsonfile, legendtext, color) ;
};
;
最佳答案
实现这一点的方法很少。
fitSize 和 fitExtent
一个是修改投影比例和平移,而不是比例和中心。这几乎是相同的操作,但 translate 平移投影平面,center 平移未投影平面。为此,您需要使用 projection.fitSize([width,height],geojsonObject) 或 projection.fitExtent([[x0,y0],[x1,y1]],geojsonObject)。后者将允许边距,例如,提供的第一个坐标是左上角,第二个坐标是边界框的右下角,在该边界框中将限制特征。
d3.json(jsonfile, function(error, belgique) {
projection.fitSize([width,height], belgique);
// now draw as you would:
d3.selectAll(".currentmap").remove() ;
g.selectAll("path")
.data(belgique.features)
.enter()
.append("path")
.attr("d", path)
...
请注意,要显示整个国家/地区,您需要具有显示整个国家/地区的 map 项或显示国家/地区所有部分的 map 项集合。您不能将数组与 fitSize 或 fitExtent 一起使用,如果您有一组特征,则可以使用以下方法创建特征集合:
var featureCollection = {"type":"featureCollection","features":featureArray}
对于您的情况,我建议使用 fitSize 或 fitExtent。
质心
如果您真的想修改中心属性而不是平移,或者您可能想更改旋转(世界上许多地方更可能出现圆锥形保角的结果,比利时应该没问题),那么您需要中心的地理坐标。少数方法之一是从 path.geoCentroid 获取特征的质心:
var centroid = path.geoCentroid(geojsonObject);
然后用它来设置要旋转的投影参数:
projection.rotate([ -centroid[0],-centroid[1] ])
projection.center([0,0])
或居中:
projection.rotate([0,0])
projection.center(centroid)
或两者的结合(取决于 map 投影类型)。现在您可以应用 fitSize 或 fitExtent,特征已经在中间,但现在我们可以设置比例。我建议将此作为潜在答案的原因是因为并非所有投影,尤其是圆锥投影,都可以通过仅修改比例以及平移和/或居中来获得所需的结果。
当然,对于圆锥投影,您可能还需要找到一种方法来设置平行线,但如果出现这种情况,我会把它留给另一个答案。
关于d3.js - 多个 map 与 d3.js : change values of scale and center,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47411470/
我正在尝试使用 flot 绘制 SQL 数据库中的数据图表,这是使用 php 收集的,然后使用 json 编码的。 目前看起来像: [{"month":"February","data":482},
我有一个来自 php 行的 json 结果,类似于 ["value"]["value"] 我尝试使用内爆函数,但得到的结果是“value”“value” |id_kategori|created_at
脚本 1 将记录 two 但浏览器仍会将 select 元素呈现为 One。该表单还将提交值 one。 脚本 2 将记录、呈现和提交 两个。我希望它们是同义词并做同样的事情。请解释它们为何不同,以及我
我的python字典结构是这样的: ips[host][ip] 每行 ips[host][ip] 看起来像这样: [host, ip, network, mask, broadcast, mac, g
在 C# 中 我正在关注的一本书对设置和获取属性提出了这样的建议: double pri_test; public double Test { get { return pri_test; }
您可能熟悉 enum 位掩码方案,例如: enum Flags { FLAG1 = 0x1, FLAG2 = 0x2, FLAG3 = 0x4, FLAG4 = 0x8
在一些地方我看到了(String)value。在一些地方value.toString() 这两者有什么区别,在什么情况下我需要使用哪一个。 new Long(value) 和 (Long)value
有没有什么时候 var result = !value ? null : value[0]; 不会等同于 var result = value ? value[0] : null; 最佳答案 在此处将
我正在使用扫描仪检测设备。目前,我的条形码的值为 2345345 A1。因此,当我扫描到记事本或文本编辑器时,输出将类似于 2345345 A1,这是正确的条形码值。 问题是: 当我第一次将条形码扫描
我正在读取 C# 中的资源文件并将其转换为 JSON 字符串格式。现在我想将该 JSON 字符串的值转换为键。 例子, [ { "key": "CreateAccount", "text":
我有以下问题: 我有一个数据框,最多可能有 600 万行左右。此数据框中的一列包含某些 ID。 ID NaN NaN D1 D1 D1 NaN D1 D1 NaN NaN NaN NaN D2 NaN
import java.util.*; import java.lang.*; class Main { public static void main (String[] args) thr
我目前正在开发我的应用程序,使其设计基于 Holo 主题。在全局范围内我想做的是工作,但我对文件夹 values、values-v11 和 values-v14. 所以我知道: values 的目标是
我遇到了一个非常奇怪的问题。 我的公司为我们的各种 Assets 使用集中式用户注册网络服务。我们一般通过HttpURLConnection使用请求方法GET向Web服务发送请求,通过qs设置参数。这
查询: UPDATE nominees SET votes = ( SELECT votes FROM nominees WHERE ID =1 ) +1 错误: You can't specify
如果我运行一段代码: obj = {}; obj['number'] = 1; obj['expressionS'] = 'Sin(0.5 * c1)'; obj['c
我正在为我的应用创建一个带有 Twitter 帐户的登录页面。当我构建我的项目时会发生上述错误。 values/strings.xml @dimen/abc_text_size_medium
我在搜索引擎中使用以下 View : CREATE VIEW msr_joined_view AS SELECT table1.id AS msr_id, table1.msr_number, tab
为什么验证会返回此错误。如何解决? ul#navigation li#navigation-3 a.current Value Error : background-position Too
我有一个数据名如下 import pandas as pd d = { 'Name' : ['James', 'John', 'Peter', 'Thomas', 'Jacob', 'Andr
我是一名优秀的程序员,十分优秀!