quantization
和simplification
之间有什么区别?
量化是另一种简化方式吗?
在某些情况下使用量化是否更好?
或者我应该使用两者的组合吗?
答案 0 :(得分:42)
几何体的总大小由两个因素控制:点数和每个坐标的位数(精度)。
假设您有一个具有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,000≈39MB。
现在说我们将这些实数转换为整数:经度和纬度都减少为整数 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%。
当然,没有任何东西可以免费提供:如果您删除了太多信息,您将无法再准确地显示几何体。经验法则是,网格的大小应至少是整个地图的最大预期显示大小的两倍。例如,如果您在960×500像素空间中显示世界地图,则默认10,000×10,000(-q 1e4
)是合理的选择。
因此,量化通过降低每个坐标的精度来消除信息,有效地将每个点捕捉到常规网格。这减少了生成的TopoJSON文件的大小,因为每个坐标都表示为一个整数(例如介于0和9,999之间),数字较少。
相反,简化通过删除点来移除信息,应用试图测量每个点的视觉显着性并删除最不显着点的启发式算法。有许多不同的简化方法,但TopoJSON参考实现使用的Visvalingam方法在我的Line Simplification article中有所描述,所以我在此不再重复。
虽然量化和简化主要是独立地处理这两种不同类型的信息,但还有一个复杂因素:在<{em> topology is constructed之前应用量化,而之后应用 / em>到preserve the topology。由于量化经常引入重合点([24,62],[24,62],[24,62]…
),并且删除了重合点,因此量化也可以删除点。
在构造拓扑之前应用量化的原因是几何输入通常不是拓扑有效的。例如,如果您获取内华达州的shapefile并将其与Nevada状态边界的shapefile组合,则一个shapefile中的坐标可能与其他shapefile中的坐标不完全匹配。通过在构建拓扑之前量化坐标,可以将坐标捕捉到常规网格,并且可以获得具有更少弧的更清晰的拓扑,希望能够正确识别所有共享弧。 (当然,如果你过度量化,那么你可能会导致过多的重合点并得到自相交的弧,这会导致其他问题。)
在未来的版本中,可能是1.5.0,TopoJSON允许您在构造拓扑之前控制量化,而不依赖于输出TopoJSON文件的量化。因此,您可以使用更精细的网格(或根本没有网格!)来计算拓扑,然后简化,然后使用适合低分辨率屏幕显示的较粗网格。目前,它们是捆绑在一起的,因此我建议使用更精细的网格(例如,-q 1e6
)来生成一个干净的拓扑,代价是稍微大一点的文件。由于TopoJSON也使用增量编码坐标,因此您很少支付所有数字的全价!
答案 1 :(得分:3)
这两者是相关的,但有不同的目的和结果。
我相信量化会根据参数(您调整到视图的预期分辨率)折叠附近的点 - 没有必要使分辨率高于绘制地图的像素。但是,它不会分析路径以确定表示形状所需的最佳点数。
简化是一种算法,它将分析多边形并以最佳方式减少点数,从而最大限度地减少多边形的整体变形。基本上,它可用于戏剧性地减少点数(以及文件大小),而不会对路径质量产生明显影响。
作为一个平行案例研究,考虑由10分组成的直线。量化将根据您使用的值减少点数(折叠附近或重合点)。简化将分析线并且意识到可以移除十个点中的八个而不显着改变多边形的整体形状,并将线减少到两个点(因为通过移除线上的点没有路径变形)。 / p>
另见:
两者都应该结合使用:quatization将地图缩小到正确大小的网格,简化优化路径。