将两个 mbtiles 文件连接在一起

问题描述 投票:0回答:3

我还没有找到一种方法将两个 *.mbtiles 文件连接在一起(第一个包含 0-16 的缩放级别,第二个包含 17 的缩放级别)。我正在使用不同的 sqlite 管理器,但无论我如何将数据库 2 导出并导入到数据库 1 中,我都没有成功 - 二进制字段总是严重损坏,以至于无法恢复 image.png。

有谁知道将两个 mbtiles 文件连接在一起的简单程序吗?

sqlite mbtiles
3个回答
6
投票

如果两个文件具有相同的元数据,并且

tiles
表实际上是表而不是视图,则只需将一个文件的数据附加到另一个表即可:

/* open database1 as main database, then: */
ATTACH 'database2' AS db2;
INSERT INTO tiles SELECT * FROM db2.tiles;

5
投票

就我而言,@CL 有错误。解决方案:

Error: cannot modify tiles because it is a view

所以我的数据库的架构是不同的:

> .schema

CREATE TABLE grid_key (
    grid_id TEXT,
    key_name TEXT
);
CREATE TABLE grid_utfgrid (
    grid_id TEXT,
    grid_utfgrid BLOB
);
CREATE TABLE images (
    tile_data blob,
    tile_id text
);
CREATE TABLE keymap (
    key_name TEXT,
    key_json TEXT
);
CREATE TABLE map (
   zoom_level INTEGER,
   tile_column INTEGER,
   tile_row INTEGER,
   tile_id TEXT,
   grid_id TEXT
);
CREATE TABLE metadata (
    name text,
    value text
);
CREATE VIEW tiles AS
    SELECT
        map.zoom_level AS zoom_level,
        map.tile_column AS tile_column,
        map.tile_row AS tile_row,
        images.tile_data AS tile_data
    FROM map
    JOIN images ON images.tile_id = map.tile_id;
CREATE VIEW grids AS
    SELECT
        map.zoom_level AS zoom_level,
        map.tile_column AS tile_column,
        map.tile_row AS tile_row,
        grid_utfgrid.grid_utfgrid AS grid
    FROM map
    JOIN grid_utfgrid ON grid_utfgrid.grid_id = map.grid_id;
CREATE VIEW grid_data AS
    SELECT
        map.zoom_level AS zoom_level,
        map.tile_column AS tile_column,
        map.tile_row AS tile_row,
        keymap.key_name AS key_name,
        keymap.key_json AS key_json
    FROM map
    JOIN grid_key ON map.grid_id = grid_key.grid_id
    JOIN keymap ON grid_key.key_name = keymap.key_name;
CREATE UNIQUE INDEX grid_key_lookup ON grid_key (grid_id, key_name);
CREATE UNIQUE INDEX grid_utfgrid_lookup ON grid_utfgrid (grid_id);
CREATE UNIQUE INDEX images_id ON images (tile_id);
CREATE UNIQUE INDEX keymap_lookup ON keymap (key_name);
CREATE UNIQUE INDEX map_index ON map (zoom_level, tile_column, tile_row);
CREATE UNIQUE INDEX name ON metadata (name);

因此您可以这样调整解决方案:

首先按照你想要的方式更新元数据,例如:

sqlite> UPDATE metadata SET value = '7' WHERE name = 'minzoom';

然后插入瓷砖:

sqlite> INSERT OR REPLACE INTO images SELECT * from db2.images;
sqlite> INSERT OR REPLACE INTO map SELECT * from db2.map;

0
投票

已经过去很长时间了,但我希望我的 2 美分对某人有用。

我使用 SQLiteStudio 完成的。 我使用了 CL.'s 解决方案,但只是部分使用,因为我遇到了与 toutpt's.

不同的问题

首先,我认为有必要澄清一下,@CL. 的“database2”正是指要合并到打开的文件中的 .mbtiles 文件,并且在单数 qoutes 内,您应该提供文件的绝对路径。

关于这个问题,我遇到了这个问题:

UNIQUE constraint failed: tiles.zoom_level, tiles.tile_column, tiles.tile_row

当两个 .mbtile 都具有相同的缩放级别、图块列和图块行的条目,但例如同一缩放级别上的不同斑点地理数据,或者它们在地球上的某些区域上彼此相交时,就会发生这种情况。
如果您合并具有不同缩放级别的文件(例如第一个 .mbtiles 中为 0-14,第二个 .mbtiles 中为 15-17),则不应出现此错误。

这个问题的解决办法写在@toutpt的答案最后:

INSERT OR REPLACE INTO tiles SELECT FROM db2.tiles;

只要条目已存在,这将替换表中的值。
但您也可以使用以下内容:

INSERT OR IGNORE INTO tiles SELECT FROM db2.tiles;

这将忽略该错误并继续添加其他记录。 (更详细的描述是这里

© www.soinside.com 2019 - 2024. All rights reserved.