D3.js d3和x27;s fitSize被新西兰geojson扭曲

D3.js d3和x27;s fitSize被新西兰geojson扭曲,d3.js,geojson,D3.js,Geojson,我试图将此示例扩展到包括亚洲和大洋洲(特别是澳大利亚和新西兰): 因此,我将示例中的json数据替换为来自亚洲+大洋洲的数据,并删除了所有太平洋小岛。当我这样做时,我看到整个地图向右倾斜(如下所示)。而通过简单地删除新西兰,地图将适当地缩放到整个画布 代码的相关区域似乎是 const projection = d3.geoMercator() // d3's 'fitSize' magically sizes and positions the map for you .fit

我试图将此示例扩展到包括亚洲和大洋洲(特别是澳大利亚和新西兰):

因此,我将示例中的json数据替换为来自亚洲+大洋洲的数据,并删除了所有太平洋小岛。当我这样做时,我看到整个地图向右倾斜(如下所示)。而通过简单地删除新西兰,地图将适当地缩放到整个画布

代码的相关区域似乎是

 const projection = d3.geoMercator()
   // d3's 'fitSize' magically sizes and positions the map for you
    .fitSize([width, height], data);

但是我找不到任何文档来解释为什么fitSize可能会在新西兰被绊倒(我需要将新西兰包括在最终的可视化中)。

抱歉-我发现了问题-新西兰地理数据中有一些小岛(在我的笔记本电脑屏幕上看不见),它们被映射到了图像的左侧。最后

我添加了一个答案,因为可能无法删除功能以按预期对齐地图,例如白令海或太平洋边缘的地图。或者,你可能想包括那些新西兰小岛

默认情况下,大多数D3投影以0°N、0°E为中心,反子午线以180°W/E为中心。这意味着反子午线分割的任何特征都可能出现在地图的两侧。然后,FitSize/fitExtent将缩放和平移地图,以便地图的两面都可见,中间可能有一个很大的空白。正如您所指出的,您的功能架起了反子午线的桥梁,因此fitSize/fitExtent无法按需要工作

projection.fitSize
projection.fitExtent
都是设置投影
projection.scale
projection.translate
的方便方法。缩放和平移都可以修改投影坐标-它们所能做的就是平移和缩放投影数据。因此,fitSize和fitExtent,或translate或center,都会修改反斜线

还有两种其他有用的投影方法:
projection.center()
projection.rotate()
。Projection.center以地理坐标转换地图。.center()指定的地理坐标和.translate()指定的像素坐标将在地图中对齐。但是,
projection.rotate()
将在投影之前对地图应用旋转,这将移动反子午线

projection.rotate
采用两个(或三个)值的数组,第一个值表示经度,第二个值表示纬度。通常,您希望将纬度保持在0-否则,这将更改墨卡托投影的外观。更改经度不会改变墨卡托(经度和投影x值具有线性关系)。在您的情况下,将世界旋转180度将使本初子午线成为反子午线,这将确保投影的反子午线不会与您的特征相交,这意味着fitSize和fitExtent将根据需要工作,并且您的特征不会在地图的两个远边上分开:

var宽度=480;
var高度=480;
//具有穿越反子午线(180W/E)的功能,确保正确的缠绕方向。
风险值数据={
“类型”:“FeatureCollection”,
“特点”:[
{
“类型”:“功能”,
“属性”:{},
“几何学”:{
“类型”:“多边形”,
“坐标”:[
[
[
150.8203125,
-28.92163128242129
],
[
-121.0625,
-30.145127183376115
],
[
-121.765625,
-60.586967342258674
],
[
145.8984375,
-57.70414723434192
],            
[
150.8203125,
-28.92163128242129
]
]
]
}
}
]
}
var svg=d3.选择(“svg”);
var g=svg.append(“g”);
var projection=d3.geoMercator().旋转([180,0]);
var path=d3.地质路径(投影);
d3.json(“https://d3js.org/world-110m.v1.json)然后(函数(世界){
//画世界。
让countries=topojson.feature(world,world.objects.countries).features;
投影.fitSize([宽度,高度],数据)
让features=g.selectAll(“路径”)
.数据(国家)
.输入()
.append(“路径”)
.attr(“d”,路径)
.样式(“笔划宽度”,1);
g、 附加(“路径”)
.基准(数据)
.attr(“d”,路径)
.attr(“填充”、“无”)
.attr(“笔划”、“黑色”)
.attr(“笔划宽度”,1);
});


只是想补充一点,问题在于地图元素内部的宽度与整个画布一样大。抱歉-我解决了问题-新西兰数据中有一些小岛(在我的笔记本电脑屏幕上看不见),它们被映射到了图像的左侧。结束