Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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;