Json 使用两个量化/转换的拓扑子构建统一的拓扑子? 背景

Json 使用两个量化/转换的拓扑子构建统一的拓扑子? 背景,json,d3.js,geojson,topojson,quantization,Json,D3.js,Geojson,Topojson,Quantization,我正在绘制一张地图,显示美国的地图。在这张地图上,我绘制了与尼尔森DMA地形相对应的热圈 我使用的第一个topojson是Nielsen DMA topojson(来自simzhou的repo),它可以在美国地图上直观地绘制这些热循环 下面你可以看到这张地图,上面有DMA热环,还有完全由尼尔森DMA拓扑构建的DMA边界线 问题: 我遇到的问题是试图画州边界线,而不是这些DMA边界线。我带来了@mbostock为我们提供的“”。当通过topojson.feature(us,us.objects.

我正在绘制一张地图,显示美国的地图。在这张地图上,我绘制了与尼尔森DMA地形相对应的热圈

我使用的第一个topojson是Nielsen DMA topojson(来自simzhou的repo),它可以在美国地图上直观地绘制这些热循环

下面你可以看到这张地图,上面有DMA热环,还有完全由尼尔森DMA拓扑构建的DMA边界线

问题: 我遇到的问题是试图画州边界线,而不是这些DMA边界线。我带来了@mbostock为我们提供的“”。当通过
topojson.feature(us,us.objects.states).features
(我也尝试过
topojson.mesh
)绘制州边界时,就会出现问题。我99%确信这是因为两个json文件使用不同的
transform
值,因此位置/坐标在不同的尺度上进行转换

以下是两个JSON:尼尔森DMA和美国

您可以在下面看到变换对象的不同之处:

变换对象来自美国地图集

"transform": {
       "scale": [0.009995801851947097,0.005844667153098606],
       "translate":[-56.77775821661018,12.469025989284091]
}
从DMA转换对象

"transform": {
        "scale": [0.00577894299429943, 0.002484260626062607],
        "translate": [-124.732975, 24.544237]
},
这是我到目前为止所做的

方法: 1.通过GeoJSON往返 正如Bostock所详述的,我尝试“通过GeoJSON的往返”创建一个新的topoJSON

量化→ 非量化,以消除量化。这通常是为了临时处理数据(例如,topojson.presimplify)。我想您可能需要这样做,这样您就可以将拓扑与不同的量化转换结合起来,但您可以通过GeoJSON往返来实现这一点

对于每个JSON 1.我将它们从topoJSON转换为geoJSON。
topo2geo-nielsen_dma=us-dma-geo.json
现在,对于每个json,我们都有一个具有绝对坐标的特性集合。 2.使用新的geoJSON,然后通过CLI将它们转换回topoJSON。
geo2topo-nielsen_dma=us-dma-geo.json>us-dma-topo.json
两个JSON不再具有
transform
属性,但它们确实具有
bbox
。 3.现在我让两个JSON从topojson->geojson->topojson进行往返。 4.我从这两个JSON中剥离了
bbox
属性 5.然后,我简单地将一个几何体集合添加到另一个几何体集合上
statesJSON.objects.nielsen_dma=dmaJSON.objects.nielsen_dma

我现在有了一个带有
nielsen_dma
状态
几何体的topojson。然而,这仍然不起作用,划定州界线会带来混乱

在geoJSON的往返过程中,我是否没有删除两个JSON的坐标量化? 可能(ir)相关问题:
  • 尼尔森DMA地图不包括阿拉斯加和夏威夷的几何图形。这两个JSON之间的差异会导致这个问题吗
  • 当我第一次读到这篇文章时,我试图解决评论中的潜在问题(我有点忽略了这一点,因为我假设显示地图的代码看起来与可能的有点不同-我为误读道歉)。然而,在第二次检查中,我意识到,虽然这个问题是一个复杂的问题,但尝试的解决方案会导致一些关于D3和topojson的有趣问题,这些问题目前还不清楚——但潜在的问题仍然是混合预测和未预测的数据,因此我将尝试在这里讨论x和y:

    Topojson

    Topojson本质上是一种通过编码拓扑和量化增量编码整数坐标来存储geojson要素或要素类的方法。Topojson本身不会更改基础坐标,而是更改其表示形式

    为了在D3中使用topojson,我们需要将其转换回geojson,因为D3 GeoPath只接受geojson-topojson.feature()返回geojson

    疼痛的潜在来源

    最终的问题根本不是由topojson引起的。您有两个使用不同坐标系的topojon源:

    • 美国json使用二维笛卡尔坐标空间(使用阿尔伯斯投影投影的特征)。未压缩的坐标是SVG像素

    • 尼尔森json使用纬度/经度坐标空间(3d地球仪上的点)。未压缩的坐标不是笛卡尔坐标(除非应用直板卡里投影:long=x,lat=y)

    当US json通过
    topojson.feature()
    传递时,返回的geojson将在大约为[0,0]、[960600]的边界框内具有x,y值(在本例中)。当任何未投影的topojson(Nielsen json for exmaple)通过
    topojson.feature()
    传递时,返回的geojson将在[-180,90]、[180,-90]的边界框内具有长的lat值,也就是说,它将具有有效的长/lat对

    这些基本的和不同的坐标系是问题所在,而不是拓扑结构中坐标的表示

    合并Topojson

    我不确定你是如何将两者结合在一起的。topojson将geojson拆分为组成部分—弧和要素(它们引用弧并保存要素属性)。圆弧以数字形式引用-如果未修改索引,则不能仅使用:

    statesJSON.objects.nielsen_dma = dmaJSON.objects.nielsen_dma
    
    但是,即使您修改了arc索引并引入了不在statesJSON中但在dmaJSON中的arc,您仍然会遇到问题。这是因为我们仍然使用不同的坐标系

    topojson使用的转换包括缩放和平移-投影数据使用Albers投影,未投影数据不使用任何投影,但可以通过平板Carree投影强制转换为x,y(长=x,宽=y)。但一个板块的特点是纬度是str