【发布时间】:2018-05-31 21:28:55
【问题描述】:
背景
我正在构建一张显示美国地图的地图。在这张地图上,我正在绘制与尼尔森 DMA 地形相对应的热圈。
我使用的第一个 topojson 是这个 Nielsen DMA topojson(来自 simzhou 的 repo here),用于在美国地图上直观地绘制这些热圈。
您可以在下面看到地图,其中包含 DMA 热圈,以及完全由 Nielsen DMA topojson 构建的 DMA 边界线。
问题:
我遇到的问题是尝试绘制状态边界线,而不是这些 DMA 边界线。我带来了@mbostock 为我们提供的“https://unpkg.com/us-atlas@1/us/10m.json”。当通过topojson.feature(us, us.objects.states).features(我也尝试过topojson.mesh)绘制州边界时,事情就会出错。我 99% 确定这是因为两个 json 文件使用不同的 transform 值,因此位置/坐标在不同的比例上进行了转换。
这是两个 json:Nielsen DMA here 和美国 here
您可以在下面看到变换对象的不同之处:
变换对象来自美国地图集
"transform": {
"scale": [0.009995801851947097,0.005844667153098606],
"translate":[-56.77775821661018,12.469025989284091]
}
从 DMA topojson 转换对象
"transform": {
"scale": [0.00577894299429943, 0.002484260626062607],
"translate": [-124.732975, 24.544237]
},
这是我到目前为止所做的。
方法:
1。通过 GeoJSON 往返
正如 Bostock here 详述的那样,我尝试“通过 GeoJSON 往返”制作一个新的 topoJSON。
量化→非量化,去除量化。这通常是临时完成的以处理数据(例如,topojson.presimplify)。我想您可能想要这样,以便您可以将拓扑与不同的量化变换结合起来,但您始终可以通过 GeoJSON 进行往返。
对于每个 json
1. 我将它们从 topoJSON 转换为 geoJSON。
topo2geo nielsen_dma=us-dma-geo.json < us-dma-topo.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 属性,因为它们是 optional.
5. 然后我简单地将一个几何集合添加到另一个。 statesJSON.objects.nielsen_dma = dmaJSON.objects.nielsen_dma
我现在有一个带有 nielsen_dma 和 states 几何形状的 topojson。然而这仍然不起作用,并且绘制状态线会带来混乱。
在往返 geoJSON 期间,我是否未能删除两个 json 的坐标量化?
可能(ir)相关问题:
- 尼尔森 DMA 地图不包括阿拉斯加和夏威夷的几何图形。两个 json 之间的这种差异会导致这个问题吗?
【问题讨论】:
-
@AndrewReid 我很欣赏评论和链接的方向。我将在下周深入研究并弄清楚这一点。谢谢!
-
Mapshaper.org 可以在 shape/topojson/geojson 之间进行转换。 topojson 的变换值仅用于底层坐标的压缩,它们不会修改投影(或缺少),因此您不能直接修改 topojson 以使一层的未投影经纬度(非笛卡尔)坐标匹配另一个的投影笛卡尔坐标。
-
我很抱歉,在我的第一条评论中引用的 geojson 有点大(您可以使用 mapshaper 将其简化为更适合网络浏览器的大小)。但是使用它是非常可取的 - 否则你正在使用两个不同的坐标系(它们的不同不仅仅是平移和缩放 - 一个是投影的 2d 空间(使用 Albers 投影),另一个由 3d 地球上的点组成(和如果明确转录到笛卡尔坐标空间是 Plate Caree 投影)。使用所有经纬度或所有投影 x,y 可以更轻松地进行操作,确保特征重叠
-
(原始链接数据集确实具有所有状态,但由于某种原因,在我的复制和粘贴过程中,我丢失了一些状态,但当我意识到这一点时,我已经找到了一个较小的 geojson 并将其转换为块的 topojson:github.com/PublicaMundi/MappingAPI/blob/master/data/geojson/…)。
标签: json d3.js geojson topojson quantization