手工生成的TopoJSON不解析

时间:2014-04-01 14:00:45

标签: topojson

我写了一个简单的函数来将d3.geom.voronoi的结果解析成topoJSON格式,你可以在这里看到:

http://bl.ocks.org/emeeks/9908143

据我所知,它与http://bl.ocks.org/mbostock/5249328中生成的topoJSON匹配,除了它不使用translate或scale(尽管我用(0,0)的翻译生成它并且比例为(1)并收到相同的错误)。当我尝试使用topojson解析这些功能时,我收到此错误:

TypeError: Cannot read property 'length' of undefined
at arc (topojson.js:172:54)
at line (topojson.js:187:52)
at ring (topojson.js:193:20)
at Array.map (native)
at polygon (topojson.js:199:19)
at Object.geometryType.Polygon (topojson.js:214:37)
at geometry (topojson.js:205:71)
at object (topojson.js:218:12)
at feature (topojson.js:160:17)
at topojson.js:151:55

我基于此的Polygon示例有一个弧数组,而Linestring示例我将它与一个弧数组进行比较,所以我的假设是Polygon默认是多边形而且我是跟随这个例子的数组数组,但如果我只是制作一个弧数组,它会给我一个错误“不能调用未定义的切片”。

我很确定我的vorToPoly函数正确映射弧,但是如果有人可以查看我的对象topoCollection(我已经将它回显到控制台)并告诉我它是如何与topojson所期望的相匹配的,我很感激。

1 个答案:

答案 0 :(得分:1)

Mike Bostock指出发生错误是因为我的topojson集合指的是一个不存在的弧,因为它开始计算的弧数为1而不是0.问题发生在我的vorToPoly代码的这一部分:

 topoArcs.push([[Math.floor(vorPolys[x][y][0]),Math.floor(vorPolys[x][y][1])],[Math.floor(vorPolys[x][nextVal][0]),Math.floor(vorPolys[x][nextVal][1])]]);
 arcHash[hashVal] = topoArcs.length;

它应该被翻转:

 arcHash[hashVal] = topoArcs.length;
 topoArcs.push([[Math.floor(vorPolys[x][y][0]),Math.floor(vorPolys[x][y][1])],[Math.floor(vorPolys[x][nextVal][0]),Math.floor(vorPolys[x][nextVal][1])]]);

这样哈希从0开始而不是1.翻转这使得一切正常。