客户端 topojson 渲染看似不正确的路径

Posted

技术标签:

【中文标题】客户端 topojson 渲染看似不正确的路径【英文标题】:Client side topojson rendering seemingly incorrect paths 【发布时间】:2014-07-25 19:33:01 【问题描述】:

我一直在尝试创建一个包含合并图层数据的 TopoJson 文件,其中包含美国各州、县和国会选区等图层。

原始 .shp shapefile 来自人口普查局的Cartographic Boundary Files。

这些通过 ogr2ogr 转换为 GeoJson。

然后通过节点服务器端库组合成TopoJson格式,量化为1e7,retain-proportion为0.15。到目前为止,没有任何问题的迹象。

我使用 mapshaper 查看最终的 topojson 文件,看起来一切正常:

但是,当尝试使用 topojson 客户端库和 D3.geo.path() 进行渲染时,我在 congressionalDist 层遇到了一些奇怪的路径:(注意美国大陆、AK 和 HI 周围的大矩形路径)@ 987654333@

可以在此处找到该页面的工作版本:http://jsl6906.net/D3/topojson_problem/map/

一些相关说明:

如果我更改我的 topojson 生成脚本以消除简化,则路径似乎可以通过相同的 d3.js 页面正确显示 如果我在创建 topojson 时只保留 congressionalDist 层,那么路径似乎可以通过相同的 d3.js 页面正确显示:

在尝试了尽可能多的故障排除后,我想我会在这里请人看看是否有人遇到过类似的问题。感谢您的帮助。

【问题讨论】:

这似乎/可能与***.com/questions/23953366/… 中提到的问题有关。那里的一些区域的边界计算出错了,也导致了大的矩形。例如,在您的示例中,d3.geo.bounds(cds[84]) 导致 `[[-180, -90], [180, 90]]' 这似乎是不正确的。我不知道为什么会这样。 仍然不确定是什么原因造成的,但我注意到一件有趣的事情是绑定到违规矩形的数据的id 属性以ZZ 结尾,而所有其他对象都有一个id 以两个数字结尾。 id 的负责人是:09ZZ、17ZZ 和 26ZZ。例如,尝试以下操作:d3.selectAll(d3.selectAll('.cd')[0].filter(function(d) return d3.select(d).attr('id').slice(-2) === 'ZZ' )).style('stroke', 'red'),您会注意到只有这些矩形是红色的。 看来ZZ 是赋予“未定义”国会选区的代码。我不确定这意味着什么,但您可以在 CD113FP 列下的this dataset 中看到它,NAMELSAD 列包含“未定义国会选区”。在this file 中运行 ogr2ogr 时,还提到了删除此类区域,这是us-atlas 的一部分 如果这可能有用 - 这是我的完整工作流程: 1. 下载 shapefile (census.gov/geo/maps-data/data/tiger-cart-boundary) 2. 将 shapefile 转换为 geoJson (jsl6906.net/D3/topojson_problem/3create_geo_jsons.bat.txt) 3. 将 geoJson 文件合并到 topoJson (@ 987654330@) 您的路径是否可能是“由内而外”(逆时针与顺时针)?如果您为阿拉斯加或夏威夷指定填充颜色会发生什么 - 它会填充矩形中除了岛屿/州的所有内容吗?见,例如***.com/q/21786168/3128209 【参考方案1】:

正如我在 cmets 中提到的,我注意到三个有问题的矩形都绑定到具有以 ZZ 结尾的 id 属性的数据,而所有其他路径的 ID 都以数字结尾。

经过一些谷歌搜索,我想出了我认为的答案。

根据 census.gov 网站上的this document

在康涅狄格州、伊利诺伊州和密歇根州,州参与者没有分配当前(第 113 位) 国会选区覆盖整个州或同等地区。已分配代码“ZZ” 到没有定义国会选区的地区(通常是大型水体)。这些未分配的区域 出于数据展示的目的,在州内被视为单一的国会选区。

似乎这三个未定义的区域将占三个矩形。目前尚不清楚他们在过程中的哪个阶段引起了问题,但我相信有一个简单的解决方案可以解决您当前的问题。在搜索有关 ZZ 代码的信息时,我在 mbostock 的一个名为 us-atlas 的项目中偶然发现了 this makefile

他似乎遇到了类似的问题,并且在运行ogr2ogr 时设法过滤掉了未定义的国会选区。以下是该文件中的相关代码:

# remove undefined congressional districts
shp/us/congress-ungrouped.shp: shp/us/congress-unfiltered.shp
    rm -f $@
    ogr2ogr -f 'ESRI Shapefile' -where "GEOID NOT LIKE '%ZZ'" $@ $<

我敢打赌,如果您使用此处显示的标志在 shapefile 上运行 ogr2ogr,它将解决问题。

【讨论】:

有趣,谢谢。在接下来的几天里,我将进一步研究这个问题。虽然这似乎确实是问题的根源,但它似乎并不能解释为什么如果我不将它们与州/县 shapefile 结合起来,或者为什么我不使用 topojson 简化形状,路径会呈现良好,问题不存在。对此有何快速反应? 暂时没有。如果您继续调查它的详细信息,我建议您在转换过程的每个步骤中检查您的数据集的外观,特别注意代表数据的 种类 的任何显着差异与其他地区的数据相比,未定义的地区。我的猜测是,在其中一个步骤之后,这些数据将采用 d3 无法正确呈现的格式。 我想到的另一种可能性......当你说你将这些数据与状态边界等结合起来时,在这个过程中是否有一个步骤,其中形状或路径本身以某种方式合并为一个单一的形状或路径?如果是这样,如果将这些相同的水体 用作州/县数据集。 不幸的是,仔细研究后,似乎不是“ZZ”路径导致了问题。不过,感谢您的领导。

以上是关于客户端 topojson 渲染看似不正确的路径的主要内容,如果未能解决你的问题,请参考以下文章

使用 D3.js 仅渲染 topojson 地图的一部分

Qt 文件对话框渲染不正确并崩溃

Apollo 客户端和 Redux 设置导致无限渲染循环

JAX-WS 客户端:访问本地 WSDL 的正确路径是啥?

浏览器的渲染

从 topojson 获取各个国家的边界​​框