MBTiles 验证
原始 MBTiles 规范不对 MBTiles 中瓦片数据的内容提供任何保证。mbtiles validate 假设了一些额外的约定并使用它们来确保瓦片数据的内容有效,执行多个验证步骤。如果文件无效,该命令将打印错误消息并以非零退出代码退出。
mbtiles validate src_file.mbtiles
SQLite 完整性检查
validate 命令将在文件上运行 PRAGMA integrity_check,如果结果不是 ok 将失败。
--integrity-check 标志可用于禁用此检查,或使用 full 值使其更彻底。默认为 quick。
模式检查
validate 命令将验证 tiles 表/视图是否存在,以及它是否具有预期的列和索引。
它还将验证 metadata 表/视图是否存在,以及它是否具有预期的列和索引。
按瓦片验证
如果 .mbtiles 文件使用 flat_with_hash 或 normalized 模式,validate 命令将验证 tile_data 列的 MD5 哈希是否与 tile_hash 或 tile_id 列匹配(取决于模式)。
由 tilelive-copy 等工具生成的典型规范化模式在 tile_id 列中使用 MD5 哈希。Martin 的 mbtiles 工具可以使用此哈希来验证每个瓦片的内容。
我们还定义了一个新的 flat-with-hash 模式,它将哈希和瓦片数据存储在同一个表中,允许在没有多表布局的情况下进行按瓦片验证。
按瓦片验证不适用于 flat 模式,将被跳过。
聚合内容验证
按瓦片验证将捕获单个瓦片损坏,但不会检测整体数据存储损坏,例如缺少瓦片、不应存在的瓦片或具有不正确 z/x/y 值的瓦片。为此,mbtiles 工具定义了一个名为 agg_tiles_hash 的新元数据值。
该值通过对 tiles 表/视图中所有行的组合值进行哈希计算,按 z、x、y 排序。该值使用以下 SQL 表达式计算,该表达式使用来自 sqlite-hashes crate 的自定义 md5_concat_hex 函数:
md5_concat_hex(
CAST(zoom_level AS TEXT),
CAST(tile_column AS TEXT),
CAST(tile_row AS TEXT),
tile_data)
如果没有行或全部为 NULL,则使用空字符串的哈希值。请注意,SQLite 允许在任何列中存储任何值类型,因此如果 tile_data 意外包含非 blob/text/null 值,验证将失败。
mbtiles 工具将在复制或验证 mbtiles 文件时计算 agg_tiles_hash 值。使用 --agg-hash update 强制更新该值,即使它不正确或不存在。