MBTiles 差异
mbtiles diff
复制命令也可用于比较两个 mbtiles 文件并生成增量(diff)文件。差异文件可以在其他地方应用到 src_file.mbtiles,以避免复制/传输整个修改后的数据集。增量文件将包含两个文件之间不同的所有瓦片(修改、插入和删除为 NULL 值),包括瓦片和元数据表。
有一个例外:agg_tiles_hash 元数据值将被重命名为 agg_tiles_hash_after_apply,并为差异文件本身生成新的 agg_tiles_hash。这样做是为了避免在将差异文件应用于原始文件时产生混淆,因为应用差异后 agg_tiles_hash 值将不同。apply-patch 命令将在应用差异时自动将 agg_tiles_hash_after_apply 值重命名为 agg_tiles_hash。
# 此命令将比较 `file1.mbtiles` 和 `file2.mbtiles`,
# 并生成一个新的差异文件 `diff.mbtiles`。
mbtiles diff file1.mbtiles file2.mbtiles diff.mbtiles
# 如果将 diff.mbtiles 应用到 file1.mbtiles,将产生 file2.mbtiles
mbtiles apply-patch file1.mbtiles diff.mbtiles file2a.mbtiles
# file2.mbtiles 和 file2a.mbtiles 现在应该相同
# 验证两个文件并查看它们的哈希值是否相同
mbtiles validate file2.mbtiles
[INFO ] The agg_tiles_hashes=E95C1081447FB25674DCC1EB97F60C26 has been verified for file2.mbtiles
mbtiles validate file2a.mbtiles
[INFO ] The agg_tiles_hashes=E95C1081447FB25674DCC1EB97F60C26 has been verified for file2a.mbtiles
mbtiles apply-patch
将使用上述 mbtiles diff 命令生成的差异文件应用到 MBTiles 文件。差异文件可以应用到先前下载的 src_file.mbtiles,以避免再次复制/传输整个修改后的数据集。src_file.mbtiles 将被就地修改。也可以在将源文件复制到新目标文件时应用差异文件,使用 mbtiles copy --apply-patch 命令。
请注意,应用差异时,agg_tiles_hash_after_apply 元数据值将被重命名为 agg_tiles_hash。
这样做是为了避免在将差异文件应用于原始文件时产生混淆,因为应用差异后 agg_tiles_hash 值将不同。
mbtiles apply-patch src_file.mbtiles diff_file.mbtiles
使用 SQLite 应用差异
应用差异的另一种方法是直接使用 sqlite3 命令行工具。此 SQL 将从 src_file.mbtiles 中删除在 diff_file.mbtiles 中设置为 NULL 的所有瓦片,然后将 diff_file.mbtiles 中的所有新瓦片插入或更新到 src_file.mbtiles 中,其中两个文件都是 flat 类型。差异文件的名称作为查询参数传递给 sqlite3 命令行工具,然后在 SQL 语句中使用。请注意,这不会更新 agg_tiles_hash 元数据值,因此应用差异后它将不正确。
sqlite3 src_file.mbtiles \
-bail \
-cmd ".parameter set @diffDbFilename diff_file.mbtiles "\
"ATTACH DATABASE @diffDbFilename AS diffDb; "\
"DELETE FROM tiles "\
" WHERE (zoom_level, tile_column, tile_row) IN ( "\
" SELECT zoom_level, tile_column, tile_row "\
" FROM diffDb.tiles "\
" WHERE tile_data ISNULL); "\
"INSERT OR REPLACE INTO tiles (zoom_level, tile_column, tile_row, tile_data) "\
" SELECT * FROM diffDb.tiles WHERE tile_data NOTNULL;"