json - Topojson:量化 VS 简化

标签 json d3.js topojson

quantization有什么区别和 simplification ?
量化是另一种简化方式吗?
在某些情况下使用量化更好吗?
或者我应该同时使用两者?

最佳答案

几何体的总大小由两个因素控制:点数每个坐标的位数(精度) .

假设您有一个包含 1,000,000 个点的大型几何图形,其中每个二维点表示为 ±180° 的经度和 ±90° 的纬度:

[-90.07231180399987,29.501753271000098],[-90.06635619599979,29.499494248000133],…

实数可以具有任意精度(在 JSON 中;在 JavaScript 中,它们受 IEEE 754 的精度限制),因此是无限位数。但在实践中,以上是非常典型的,所以假设每个坐标有 18 位数字。包括额外的符号( [], ),每个点最多需要 1 + 18 + 1 + 18 + 1 = 39 个字节来编码为 JSON,整个几何体约为 39 * 1,000,3900 MB .

现在假设我们将这些实数转换为整数:经度和纬度都被简化为整数 x 和 y,其中 0 ≤ x ≤ 99 和 0 ≤ y ≤ 99。实数点 ⟨λ,φ⟩ 和整数坐标之间的简单映射⟨x,y⟩ 是:
x = floor((λ + 180) / 360 * 100);
y = floor((φ + 90) / 180 * 100);

由于现在每个坐标最多需要 2 个数字来编码,因此每个点最多需要 1 + 2 + 1 + 2 + 1 = 7 个字节来编码为 JSON,整个几何体大约为 7MB;我们将总大小减少了 82%。

当然,没有什么是免费的:如果您删除太多信息,您将无法再准确地显示几何图形。经验法则是,您的网格大小应至少是整个 map 的最大预期显示大小的两倍。例如,如果您在 960×500 像素空间中显示世界地图,那么默认的 10,000×10,000 ( -q 1e4 ) 是一个合理的选择。

所以,量化通过降低每个坐标的精度来去除信息 ,有效地将每个点捕捉到规则网格。这减少了生成的 TopoJSON 文件的大小,因为每个坐标都表示为一个数字较少的整数(例如 0 到 9,999 之间)。

相比之下,简化通过删除点来删除信息 ,应用尝试测量每个点的视觉显着性并删除最不显着的点的启发式方法。有许多不同的简化方法,但我的 Line Simplification article 中描述了 TopoJSON 引用实现使用的 Visvalingam 方法。所以我不会在这里重复自己。

虽然量化和简化主要独立处理这两种不同类型的信息,但还有一个额外的复杂性:量化是在 topology is constructed 之前应用的。 ,而在 preserve the topology 之后必须应用简化.由于量化经常引入重合点([24,62],[24,62],[24,62]…),重合点被去除,量化也可以去除点。

在构造拓扑之前应用量化的原因是几何输入通常在拓扑上无效。例如,如果您采用内华达县的 shapefile 并将其与内华达州边界的 shapefile 结合,则一个 shapefile 中的坐标可能与另一个 shapefile 中的坐标不完全匹配。通过在构建拓扑之前量化坐标,您可以将坐标捕捉到规则网格,并且可以获得具有更少弧的更清晰的拓扑,希望能够正确识别所有共享弧。 (当然,如果你过度量化,那么你会导致太多的重合点并得到自相交的弧线,从而导致其他问题。)

在 future 的版本中,也许是 1.5.0,TopoJSON 将允许您在独立于输出 TopoJSON 文件的量化构造拓扑之前控制量化。因此,您可以使用更细的网格(或根本不使用网格!)来计算拓扑,然后进行简化,然后使用适合低分辨率屏幕显示的更粗的网格。目前,这些是捆绑在一起的,所以我建议使用更精细的网格(例如, -q 1e6 ),以生成一个干净的拓扑,但代价是文件稍大。由于 TopoJSON 还使用增量编码坐标,因此您很少为所有数字支付全价!

关于json - Topojson:量化 VS 简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18900022/

相关文章:

javascript - 访问不常见 JSON 对象中的数据

d3.js 中的 csv 到数组

javascript - 根据子节点数量动态调整 d3 树布局的大小

javascript - 是否可以使用 JavasScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?

javascript - 在 D3 中使用投影进行动态简化

javascript - D3JS TopoJSON 澳大利亚 map : projection accurate but no country rendered

java - 如果您决定重命名类中的字段,如何读取旧的 json 字符串(使用 gson)

c# - 如何使用 JSONConvert 将变量 Result 转换为对象?

javascript - 包含数千行的 HTML 表格

javascript - 在 d3js 中生成箭头