Javascript 多边形包含的变化使我的演示在D3中出错

Javascript 多边形包含的变化使我的演示在D3中出错,javascript,d3.js,projection,geo,Javascript,D3.js,Projection,Geo,我正在使用D3在画布上绘制一些信息。我在第3版中实现了目标,但在第4版中失败了(当然,我已经将第4版中更新的函数,如d3.geo.mercator()更改为d3.geoMercator())。我调试了一些相关函数,发现投影函数不同 在第3版中: function projection(point) { point = projectRotate(point[0] * d3_radians, point[1] * d3_radians); return [ point[0] * k + δ

我正在使用D3在画布上绘制一些信息。我在第3版中实现了目标,但在第4版中失败了(当然,我已经将第4版中更新的函数,如
d3.geo.mercator()
更改为
d3.geoMercator()
)。我调试了一些相关函数,发现投影函数不同

在第3版中:

function projection(point) {
  point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
  return [ point[0] * k + δx, δy - point[1] * k ];
}
在第4版中:

function projection(point) {
  point = projectRotate(point[0] * radians, point[1] * radians);
  return [point[0] * k + dx, dy - point[1] * k];
}
我的代码片段如下所示:

var d3Projection = d3.geoMercator().scale(1).translate([0, 0]);
// var d3Projection = d3.geo.mercator().scale(1).translate([0, 0]);
var d3Path = d3.geoPath().projection(d3Projection);
// var d3Path = d3.geo.path().projection(d3Projection);
var pixelBounds = d3Path.bounds(features);
var pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0];
var pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1];
我在那里调试发现,δx'的值与'dx'不同,δy(dy)

在版本4中调试 在版本3中调试

有人能解释一下这种情况的区别吗?

那么dx(δx),dy(δy)是什么意思呢?

D3V3

D3 V4中心坐标错误

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu强 我发现不同的代码导致我的演示错误
这段代码是从v3.5.17改过来的,如果我把这行代码改回v3.5.16,一切都会好的。我会找到原因。

香草D3v3和v4中的投影函数是相同的,您的问题是您使用的是一些修改过的D3v3版本。如果您尝试在D3v3环境中运行此代码段(将topojson加载到
var topo
):

你会得到

[-3.141592653589793,-3.141592653589793],[3.141592653589793,3.141592653589793]

但是,如果您加载电流<代码>https://d3js.org/d3.v3.min.js,将产生相同的片段

[[2.110384445824674,-0.5558860193147427],[2.133721203257625,-0.529805661805025]


这与V4相同。因此,您需要修复代码以使用当前D3(v3和v4),或者以与D3v3相同的方式修改D3v4。

我发现了·D3.geoMercator().scale(1)。translate([0,0])·进行错误的投影。如果我删除translate([0,0]),我的演示将使用错误的中心。最好是创建最小的示例,而不是整个应用程序。从源代码中可以看出,V3和V4之间的投影应该是相同的,所以我猜在其他地方可能有错误。当我尝试您的代码片段时,只是计算某些功能集的边界,它返回相同的数组。@veproza我添加了在线演示。D3 V4的中心设置错误。我认为/components/wind/wind.js(wind-d3.v3.js)中的代码片段有问题,“function name”是getProjection。我猜我的topojson数据是否不标准。这不是我的意思。我可以让你的演示在我的电脑上运行,但是如果你有一个最小的演示,只需要足够的代码就可以让错误重现,而不是整个应用程序。谢谢你的回复。我会检查“修改过的D3V3”。我发现D3V3代码与我调用的代码相同,所以这不是“修改过的代码”的原因。好吧,试着制作一个最小的示例,而不是一个完整的应用程序,我们会看看它是否能让我们更进一步。浏览整个应用程序太复杂了,任何人都无法有效地帮助您。最低示例的URL位于四楼。非常感谢你坚持解决我的问题!
var features = topojson.feature(topo, topo.objects.counties);
var d3Projection = d3.geo.mercator().scale(1).translate([0, 0]);
var d3Path = d3.geo.path().projection(d3Projection);
console.log(JSON.stringify(d3Path.bounds(features)));