Topojson:量化 VS 简化

27

“量化”和“简化”之间有什么区别?量化是简化的另一种方法吗?在某些情况下,使用量化更好吗?还是应该同时使用两种方法?

2个回答

50

你的几何图形的总大小由两个因素控制:点的数量每个坐标的数字位数(精度)

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

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

实数可以具有任意精度(在JSON中; 在JavaScript中,它们受 IEEE 754 的精度限制),因此具有无限数量的数字。但在实践中,以上情况是相当典型的,因此假设每个坐标具有18个数字。包括额外的符号( [ ] ),每个点最多需要39个字节才能在JSON中编码,并且整个几何图形大约为39 * 1,000,000≈39MB。

现在我们将这些实数转换为整数:经度和纬度都缩小到整数x和y ,其中0 ≤ x ≤ 99且0 ≤ y ≤ 99。真实数字点⟨λ,φ⟩和整数坐标⟨x,y⟩之间的简单映射为:

x = floor((λ + 180) / 360 * 100);
y = floor((φ + 90) / 180 * 100);

由于现在每个坐标最多需要2位数字进行编码,因此每个点在JSON中的编码最多需要1 + 2 + 1 + 2 + 1 = 7字节,并且整个几何体积约为7MB。我们将总大小缩小了82%。

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

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

相比之下,简化通过删除点来删除信息,应用试图测量每个点的视觉显著性并删除最不显著的点的启发式算法。有许多不同的简化方法,但TopoJSON参考实现使用的Visvalingam方法在我的线简化文章中描述,因此我在这里不再赘述。

虽然量化和简化主要独立地处理这两种不同类型的信息,但还存在一个额外的复杂性:在构建拓扑之前会应用量化,而简化必须在保留拓扑结构时应用。由于量化经常引入重合点([24,62],[24,62],[24,62]…),并且重合点将被删除,因此量化也可以删除点。

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

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


2
经验法则是,您的网格大小应该至少比整个地图的最大预期显示尺寸大两倍。例如,如果您在960×500像素的空间中显示世界地图,那么默认的10,000×10,000(-q 1e4)是一个合理的选择。”因此,我预计在960×500像素上有一个简单的“两倍”因子,所以1820×1000应该足够了,我会选择-q 1820。我错在哪里? - Hugolpz
7
由于 JSON 数字是以基数10表示的,为了最大限度地利用编码,应使用一个十的幂次方作为网格大小。另外,请查看最后一段;除非您已知输入是拓扑有效的,否则您可能希望使用 -q 1e5 或 1e6 来生成更干净的拓扑。最后,因为您的浏览器在渲染时使用抗锯齿技术,所以使用略微细于像素网格的网格大小会更有益。 - mbostock
@mbostock,你推荐什么设置来处理 A)世界地图,B)美国 48 个州大小的地图,C)加利福尼亚州地图?你在其他地方有过推荐吗?找到简化的正确设置似乎需要不断试错。 - Hugo LOPEZ

4
两者相关但目的和结果不同。
我认为量化是基于参数(您调整为视图的期望分辨率)来折叠附近的点 - 没有必要具有比绘制地图的像素更高的分辨率。但它不会费力分析路径以确定表示形状所需的最佳点数。 简化是一种算法,将分析多边形并以最优方式减少点数,从而使多边形的整体变形最小化。基本上,它可以用于显着减少点数(因此文件大小),而不会对路径的质量产生明显影响。 作为平行案例研究,考虑由10个点组成的直线。量化将根据您使用的值减少点数(折叠相邻或重合点)。简化将分析该行并意识到可以删除十个点中的八个点而不会显着改变多边形的整体形状,并将该行减少到两个点(因为在直线上删除点不会导致路径变形)。 另请参阅:

两者应该结合使用:量化将地图缩小到正确大小的网格,简化优化路径。


1
当你被大师打败时,你一定会爱上它 :) - reblace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接