MBTiles 模式
mbtiles 工具在原始 MBTiles 规范的基础上构建,为 tiles 数据指定了三种不同类型的模式:flat、flat-with-hash 和 normalized。mbtiles 工具可以在这些模式之间进行转换,还可以生成任何模式的两个文件之间的差异,以及将多个模式文件合并为一个文件。
flat
Flat 模式最接近原始 MBTiles 规范。它将所有瓦片存储在单个表中。当瓦片集不包含重复瓦片时,此模式最有效。
CREATE TABLE tiles (
zoom_level INTEGER,
tile_column INTEGER,
tile_row INTEGER,
tile_data BLOB
);
CREATE UNIQUE INDEX tile_index ON tiles (
zoom_level, tile_column, tile_row
);
flat-with-hash
与 flat 模式类似,但还包括一个 tile_hash 列,其中包含 tile_data 列的哈希值。当瓦片集没有重复瓦片,但您仍希望能够单独验证每个瓦片的内容时,请使用此模式。
CREATE TABLE tiles_with_hash (
zoom_level INTEGER NOT NULL,
tile_column INTEGER NOT NULL,
tile_row INTEGER NOT NULL,
tile_data BLOB,
tile_hash TEXT
);
CREATE UNIQUE INDEX tiles_with_hash_index ON tiles_with_hash (
zoom_level, tile_column, tile_row
);
CREATE VIEW tiles AS
SELECT
zoom_level,
tile_column,
tile_row,
tile_data
FROM tiles_with_hash;
normalized
Normalized 模式在瓦片集包含重复瓦片时最有效。它将所有瓦片 blob 存储在 images 表中,并将瓦片 Z、X、Y 坐标存储在 map 表中。map 表包含一个 tile_id 列,它是 images 表的外键。tile_id 列是 tile_data 列的哈希值,这使得可以像在 flat-with-hash 模式中一样验证每个单独的瓦片,同时通过仅存储每个唯一瓦片一次来优化存储。
CREATE TABLE map (
zoom_level INTEGER,
tile_column INTEGER,
tile_row INTEGER,
tile_id TEXT
);
CREATE TABLE images (
tile_id TEXT,
tile_data BLOB
);
CREATE UNIQUE INDEX map_index ON map (
zoom_level, tile_column, tile_row
);
CREATE UNIQUE INDEX images_id ON images (
tile_id
);
CREATE VIEW tiles AS
SELECT
map.zoom_level,
map.tile_column,
map.tile_row,
images.tile_data
FROM
map INNER JOIN images
ON map.tile_id = images.tile_id;
CREATE VIEW tiles_with_hash AS
SELECT
map.zoom_level,
map.tile_column,
map.tile_row,
images.tile_data,
images.tile_id AS tile_hash
FROM
map INNER JOIN images
ON map.tile_id = images.tile_id;
可选地,具有 normalized 模式的 .mbtiles 文件可以包含 tiles_with_hash 视图。由 mbtiles 工具创建的所有 normalized 文件都将包含此视图。
FROM
map INNER JOIN images
ON map.tile_id = images.tile_id;
CREATE VIEW tiles_with_hash AS
SELECT
map.zoom_level,
map.tile_column,
map.tile_row,
images.tile_data,
images.tile_id AS tile_hash
FROM
map INNER JOIN images
ON map.tile_id = images.tile_id;