Javascript D3.js geoPath地图返回错误:<;路径>;属性d:预期数量

Javascript D3.js geoPath地图返回错误:<;路径>;属性d:预期数量,javascript,json,d3.js,maps,geojson,Javascript,Json,D3.js,Maps,Geojson,我在D3.js中绘制地图时遇到问题 下面的代码适用于某些json文件,但在我需要使用的数据上,它返回一个类似于以下内容的错误字符串: 错误:属性d:预期数字,“…21478248741596,NaNL547.70469610…” 并展示了这张图片(虽然它不是我所希望的英格兰地图) 代码如下: const width=800 常数高度=800 const svg=d3.select('svg') .append('g') .attr('class','map'); 常量投影=d3.geoMer

我在D3.js中绘制地图时遇到问题

下面的代码适用于某些json文件,但在我需要使用的数据上,它返回一个类似于以下内容的错误字符串:

错误:属性d:预期数字,“…21478248741596,NaNL547.70469610…”

并展示了这张图片(虽然它不是我所希望的英格兰地图)

代码如下:

const width=800
常数高度=800
const svg=d3.select('svg')
.append('g')
.attr('class','map');
常量投影=d3.geoMercator()
我保证([
d3.json('https://raw.githubusercontent.com/joewretham/d3_map_project/main/Clinical_Commissioning_Groups__April_2019__Boundaries_EN_BUC.json')
]).那么(
d=>ready(null,d[0],d[1])
);
功能就绪(错误、数据){
var fixed=data.features.map(函数(特征){
返回草皮。倒带(功能{
相反:正确
});
});
const path=d3.geoPath().projection(projection);
投影。fitSize([宽度、高度]{
“类型”:“FeatureCollection”,
“功能”:固定
})
append('g')
.attr('类别','国家')
.selectAll('路径')
.数据(固定)
.enter().append('path')
.attr('d',路径)
.style('fill','teal')
.style('笔划','白色')
.style(“不透明度”,0.8)
.样式(“笔划宽度”,0.3);
};


您的JSON文件有一些不常见的投影。通常情况下,坐标以lat/long表示。但是,由于许多原因,例如地球是一个球体,球体投影在数学上很困难,存在几种不同的投影。最常见的是WGS84(按ID也称为4326),并使用lat/long格式。但是,事实证明存在多个国家系统。在您的案例中,它是英国国家系统

使用,我能够将投影从OSGB36转换为WGS84,从而得到正确的结果:

const width=800
常数高度=800
const svg=d3.select('svg')
.append('g')
.attr('class','map');
控制台日志(窗口);
常量投影=d3.geoMercator()
我保证([
d3.json('https://raw.githubusercontent.com/joewretham/d3_map_project/main/Clinical_Commissioning_Groups__April_2019__Boundaries_EN_BUC.json')
]).那么(
d=>ready(null,d[0],d[1])
);
功能就绪(错误、数据){
数据=退货出口。toWGS84(数据);
var fixed=data.features.map(函数(特征){
返回草皮。倒带(功能{
相反:正确
});
});
const path=d3.geoPath().projection(projection);
投影。fitSize([宽度、高度]{
“类型”:“FeatureCollection”,
“功能”:固定
})
append('g')
.attr('类别','国家')
.selectAll('路径')
.数据(固定)
.enter().append('path')
.attr('d',路径)
.style('fill','teal')
.style('笔划','白色')
.style(“不透明度”,0.8)
.样式(“笔划宽度”,0.3);
};


请使用堆栈片段或JSFIDLE/Codepen将代码转换为可运行代码。它将帮助我们理解这个问题,并将导致更好的回答Hanks Ruben-Updated您的JSON文件有一些不寻常的投影。通常,坐标以lat/long表示,但有许多不同的投影-最常见的是WGS84(也称为4326,其ID)。当前投影距离某个零点似乎以米或英尺为单位。我不知道当前的投影,如果你发现了,你可以将JSON转换成WGS84。嗨,鲁本-谢谢你的回复。你带我找到了解决方案-我回到了我从()获得数据的地方,我发现他们提供的API在WGS84中有坐标。更新了小提琴-。谢谢你的帮助太好了!很乐意帮忙!感谢鲁本-这太棒了,你解决了我的问题,我也学到了投影技术WGS84不是投影:它是一个三维坐标系,而OP的投影数据是二维的-作为D3投影项目数据,你需要在通过D3投影之前取消投影数据(答案是这样的)。但是,您也可以使用
d3.geointity.fitSize/fitdext
正确缩放和平移数据,将其视为平面(尽管叠加其他特征会很困难),而不是取消投影并立即重新投影,这也将消除对
turf.rewind
的需要。不管怎样,答案很好。啊,很高兴知道,谢谢!