【问题标题】:Topojson: quantization VS simplificationTopojson:量化 VS 简化
【发布时间】:2013-09-19 16:18:53
【问题描述】:

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

【问题讨论】:

    标签: json d3.js topojson


    【解决方案1】:

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

    假设您有一个包含 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 .

    现在说我们将这些实数转换为整数:经度和纬度都被简化为整数 xy 其中 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 之间)。

    相比之下,简化通过删除点来删除信息,应用一种尝试测量每个点的视觉显着性并删除最不引人注意的点的启发式方法。有很多不同的简化方法,但是我的Line Simplification article中描述了TopoJSON参考实现使用的Visvalingam方法,这里不再赘述。

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

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

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

    【讨论】:

    • “经验法则是,您的网格大小至少应该是整个地图的最大预期显示大小的 两倍。例如,如果您在 960×500 像素 空间中显示世界地图,那么默认的 10,000×10,000 (-q 1e4) 是一个合理的选择。” i> 在那里,我希望 960×500 像素有一个简单的“两倍”因子,所以 1820×1000 应该足够了,我会选择-q 1820。我怎么了?
    • 由于 JSON 数字以 10 为底,因此您应该使用 10 次方的网格大小以最有效地利用编码。另外,请参见最后一段;除非您的输入已知在拓扑上有效,否则您可能希望使用 -q 1e5 或 1e6 来生成更清晰的拓扑。最后,因为您的浏览器在渲染时使用了抗锯齿,它可以使用子像素位置,因此使用比像素网格(稍微)更细的网格大小是有益的。
    • @mbostock,您建议 A) 世界、B) 48 个州美国大小的形状、C) 加利福尼亚形状的设置是什么?你在某个地方提出了一些建议吗?找到合适的简化设置的方法似乎是反复试验。
    【解决方案2】:

    两者是相关的,但目的和结果不同。

    我相信 量化 会根据参数(您将其调整为视图的预期分辨率)折叠附近的点 - 分辨率高于将绘制地图的像素没有意义。但它并不排除分析路径以确定表示形状所需的最佳点数。

    简化是一种分析多边形并以最佳方式减少点数以使多边形的整体变形最小化的算法。基本上,它可用于显着减少点数(从而减少文件大小),而不会显着影响路径的质量。

    作为一个平行案例研究,考虑一条由 10 个点组成的直线。量化将根据您使用的值减少点数(折叠附近或重合点)。简化会分析线,实现十个点中的8个可以在不显着改变多边形整体形状的情况下去除,并将线减少到两个点(因为去除线上的点不会导致路径变形)。

    另请参阅:

    两者应结合使用:量化以将地图缩小为合适大小的网格,简化以优化路径。

    【讨论】:

    • 当你被大师击败时一定会喜欢它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多