D3多边形投影错误

D3 polygon projection is wrong

我有一个使用 D3 geoOrthographic 和 topoJSON 的工作世界投影。它旋转和一切。

我想在一个坐标处放置一个六边形形状,并根据它在地球上的位置进行投影,这很有效...除了我的形状真的很奇怪。我得到一个 5 边形,就像其中一个点丢失了一样,它随地球正确旋转。

然后还有一个围绕地球边缘的不旋转的圆。

我有一个抛出六边形坐标的函数,我已经尝试了几种比例和偏移,总是完全相同的行为。

let hex = svgOrbit.append("path")
    .datum({"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[6.732,6],[5,7],[3.268,6],[3.268,4],[5,3],[6.732,4]]]}]})
    .attr("d", myGeoOrthographicProjection);

无论我如何旋转,圆看起来都是这样,尝试六边形的方向没有那个缺失点。

该路径确实显示了具有这两个独立多边形的 d 属性。

我只是不明白这里发生了什么。甚至没有任何奇怪的数字,如零或 NaN 或坐标中的任何东西。整个星球投影正确,但一个六边形将它抛出一个循环?

外圈表示您有一个倒置的多边形:您正在绘制减去预期特征的世界特征。由于 d3 在计算投影时使用球面数学,缠绕顺序很重要,这与大多数将球面坐标视为笛卡尔坐标(即使在投影时)的地理工具相反。下面的第一张红色地图通过应用填充显示了这一点。

缺失的一点有点奇怪,通常D3不会渲染无效的geojson语法,也不会在不渲染任何东西时抛出错误或警告。这里的问题是坐标数组中的最后一个点应该是第一个坐标。我忘记了它在规范中的什么位置,也根本没有考虑为什么 D3 会这样渲染它。当试图在 geojson.io 查看您的 geojson 时,我注意到它根本没有呈现,缺少端点。

我已经倒转坐标(懒惰地使用 .reverse())并在右侧的地图中添加了额外的点。

let hex = {"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[6.732,6],[5,7],[3.268,6],[3.268,4],[5,3],[6.732,4]]]}]};

let hex2 = {"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[6.732,6],[5,7],[3.268,6],[3.268,4],[5,3],[6.732,4],[6.732,6]].reverse()]}]};



    
    
let projection = d3.geoOrthographic().scale(125).translate([125,125]);
let path = d3.geoPath(projection);

let svg = d3.select("body")
  .append("svg")
  .attr("width", 500)
  .attr("height", 250);
  
svg
  .append("path")
  .datum(hex)
  .attr("d", path)
  .attr("fill", "crimson");
  
svg.append("g")
  .attr("transform","translate(250,0)")
  .append("path")
  .datum(hex2)
  .attr("d", path)
  .attr("fill","steelblue");
  

  

  
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>