Topojson:量化VS简化

dan*_*nce 25 json d3.js topojson

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

mbo*_*ock 44

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

假设您有一个具有1,000,000个点的大几何体,其中每个二维点表示为经度±180°,纬度为±90°:

[-90.07231180399987,29.501753271000098],[-90.06635619599979,29.499494248000133],…
Run Code Online (Sandbox Code Playgroud)

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

现在说我们将这些实数的整数:经度和纬度上被还原成整数XŸ其中0≤ X ≤99和0≤ ÿ ≤99之间的实数的简单映射点⟨λ,φ⟩和整数坐标⟨x,y⟩是:

x = floor((? + 180) / 360 * 100);
y = floor((? + 90) / 180 * 100);
Run Code Online (Sandbox Code Playgroud)

由于每个坐标现在最多需要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文章中有描述,所以我在此不再重复.

而量化和简化地址这两种不同类型的信息大多独立地,有一个额外的并发症:施加量化之前构造的拓扑,而简化必然施加保护拓扑.由于量化经常引入重合点([24,62],[24,62],[24,62]…),并且去除了重合点,所以量化也可以去除点.

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

在未来的版本中,可能是1.5.0,TopoJSON允许您在拓扑构造之前控制量化,而不依赖于输出TopoJSON文件的量化.因此,您可以使用更精细的网格(或根本没有网格!)来计算拓扑,然后简化,然后使用适合低分辨率屏幕显示的较粗网格.目前,它们是捆绑在一起的,因此我建议使用更精细的网格(例如-q 1e6),以产生一个干净的拓扑结构,代价是稍微大一点的文件.由于TopoJSON也使用增量编码坐标,因此您很少支付所有数字的全价!

  • 由于JSON数字是基数10,因此您应该使用10的幂的网格大小来最有效地使用编码.另外,见最后一段; 除非您的输入已知在拓扑上有效,否则您可能希望使用-q 1e5或1e6来生成更清晰的拓扑.最后因为您的浏览器在渲染时使用抗锯齿,它可以使用子像素位置,因此使用比像素网格更精细的网格大小是有益的. (6认同)
  • *"经验法则是,网格的大小至少应为**两倍**与整个地图的最大预期显示大小一样大.例如,如果您在**中显示世界地图960×500像素**空间,那么默认**10,000×10,000(-q 1e4)**是一个合理的选择."*在那里,我希望在960×500像素上有一个简单的"两倍"因子,所以1820× 1000应该就够了,我会选择`-q 1820`.我错了什么? (2认同)