“量化”和“简化”之间有什么区别?量化是简化的另一种方法吗?在某些情况下,使用量化更好吗?还是应该同时使用两种方法?
你的几何图形的总大小由两个因素控制:点的数量和每个坐标的数字位数(精度)。
假设你有一个拥有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还使用增量编码坐标,因此您很少需要支付所有数字的全部价格!
两者应该结合使用:量化将地图缩小到正确大小的网格,简化优化路径。
-q 1820
。我错在哪里? - Hugolpz