объединение двух файлов mbtiles

Мне не удалось найти способ объединить два файла *.mbtiles вместе (первый содержит уровень масштабирования от 0 до 16, а второй - уровень масштабирования 17). Я работал с разными менеджерами sqlite, но независимо от того, как я экспортировал и импортировал базу данных2 в базу данных1, у меня не было успеха - двоичное поле всегда было настолько сильно повреждено, что не могло вернуть изображение.png.

Кто-нибудь знает простую процедуру объединения двух файлов mbtiles вместе?


person vvidmar    schedule 19.07.2013    source источник


Ответы (2)


Если два файла имеют одинаковые метаданные и если таблицы tiles на самом деле являются таблицами, а не представлениями, вы можете просто добавить данные одной таблицы к другой:

/* open database1 as main database, then: */
ATTACH 'database2' AS db2;
INSERT INTO tiles SELECT * FROM db2.tiles;
person CL.    schedule 19.07.2013
comment
Ошибка: невозможно изменить плитки, потому что это представление - person toutpt; 11.06.2014
comment
@toutpt Чтобы задать вопрос, используйте кнопку «Задать вопрос». (И включите схему базы данных.) - person CL.; 11.06.2014
comment
@КЛ. У меня такой вопрос, зачем спрашивать то же самое, чтобы создать дубликат? Я пытаюсь использовать этот ответ, и он выдает ошибку, поэтому я сообщаю об ошибке как комментарий. - person toutpt; 11.06.2014
comment
У вас другая проблема, и ее нельзя решить с помощью информации, содержащейся в этом вопросе. - person CL.; 11.06.2014
comment
@user914425 user914425 Комментарий — неподходящее место, чтобы задавать несвязанный вопрос. - person CL.; 22.07.2015

В моем случае у меня есть ошибка с @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;
person toutpt    schedule 11.06.2014