如何将两个带量化/变换的TopoJSON合并为统一文件?
背景
我最近在制作一幅美国地图,需要绘制对应Nielsen DMA区域的热力圈。最开始我用了simzhou的GitHub仓库里的Nielsen DMA TopoJSON来绘制热力圈和DMA边界,成品地图是这样的:

问题
现在我需要换成州边界来展示,于是引入了@mbostock提供的美国州界TopoJSON文件。但用topojson.feature(us, us.objects.states).features(也试过topojson.mesh)绘制州边界时,画面完全混乱了。我几乎可以肯定是因为两个TopoJSON的transform值不一样,导致坐标缩放不匹配。
两个TopoJSON文件的transform对象差异如下:
US Atlas的transform对象
"transform": { "scale": [0.009995801851947097,0.005844667153098606], "translate":[-56.77775821661018,12.469025989284091] }
DMA TopoJSON的transform对象
"transform": { "scale": [0.00577894299429943, 0.002484260626062607], "translate": [-124.732975, 24.544237] },
已尝试方法
1. GeoJSON往返转换
我按照Bostock在相关讨论中提到的方法,尝试通过“GeoJSON往返转换”生成新的TopoJSON,他的原话是:
量化→非量化,以移除量化。这通常临时用于数据处理(如topojson.presimplify)。若要合并不同量化变换的拓扑,可通过GeoJSON往返实现。
我对每个JSON执行了以下步骤:
- 将TopoJSON转换为GeoJSON:
topo2geo nielsen_dma=us-dma-geo.json < us-dma-topo.json,得到带绝对坐标的要素集合。 - 将新GeoJSON通过CLI转回TopoJSON:
geo2topo nielsen_dma=us-dma-geo.json > us-dma-topo.json,此时两个JSON都没有transform属性,但有bbox。 - 对两个JSON完成TopoJSON→GeoJSON→TopoJSON的往返转换。
- 移除两者的
bbox属性(这是可选属性)。 - 将其中一个的几何集合添加到另一个:
statesJSON.objects.nielsen_dma = dmaJSON.objects.nielsen_dma
现在我得到了包含nielsen_dma和states几何的TopoJSON,但绘制州边界还是混乱的:

疑问:往返GeoJSON时是否未成功移除坐标量化?
可能相关问题:
- Nielsen DMA地图不含阿拉斯加和夏威夷的几何,这会导致问题吗?
内容的提问来源于stack exchange,提问作者jaysonder
相关产品推荐
相关产品推荐

