如何合并两个 Mbtile?

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

我通过 QGIS 创建了 2 个 Mbtile:1)一个 Mbtile 是从缩放 0 到 10,是整个世界的地图,2)另一个是从缩放 0 到 17,是一个国家的详细地图。

我想合并两个Mbtile,并使详细国家的Mbtile与整个世界的Mbtile重叠。合并结果也是从缩放 0 到缩放 17(缩放 10 时整个世界将消失,但国家将保留到缩放 17)。

我应该使用什么程序/方法?可以通过QGIS合并它们吗?

merge geospatial qgis mbtiles
3个回答
1
投票

您可以使用tile-join,它有一堆标志,因此您可以自定义输出。


0
投票

我使用Python来合并MBTiles文件。请务必更新元数据表,并注明最小最大缩放比例。它们只是具有独特扩展名的 sqlite 数据库。

此示例不包括数据验证。我没有测试这个例子——因为它是从我批处理 QGIS 输出的地方剥离出来的。

使用 QGIS 的 python 接口以外的 IDE 问题较少。不需要任何特定于 QGIS 或 PyQGIS 的内容。

import sqlite3 as sqlite

def processOneSource(srcDB, dstDB):
    # create_index_sql = "CREATE UNIQUE INDEX tile_index on tiles (zoom_level, tile_column, tile_row);"
    # dstDB.connection.execute(create_index_sql)
    # the index forces an error if there is already a tile for the same zxy

    sqlite_insert_blob_query = """ INSERT INTO tiles (zoom_level, tile_column, tile_row, tile_data) VALUES (?, ?, ?, ?)"""

    tiles = srcDB.connection.execute('select zoom_level, tile_column, tile_row, tile_data from tiles;')

    for t in tiles:
        z = t[0]
        x = t[1]
        y = t[2]
        data = t[3]

        # example of how you might include exclude tiles
        if not (z == 12 or z == 13 or z == 14 or z == 15 or z == 16):
            continue

        print(str((t[0], t[1], t[2])))

        data_tuple = (t[0], t[1], t[2], t[3])
        try:
            dstDB.connection.execute(sqlite_insert_blob_query, data_tuple)
        except Exception as e:
            print(e)

    dstDB.commit()


if __name__ == '__main__':
    srcDB = sqlite.connect("path_to_yourfilename")
    dstDB = sqlite.connect("path_to_yourfilename")
    processOneSource(srcDB, dstDB)

0
投票

您可以在这里找到更详细的描述,但简而言之: 您可以使用SQLiteStudio

  1. 通过“添加数据库”将您的第一个 .mbtiles 文件放入其中,或者将其拖到 SQLiteStudio 中。 (最好取大一点的,这样可以减少合并时间)

  2. 打开创建的DB控制台,执行以下命令:

    ATTACH 'filename.mbtiles' as db;
    INSERT INTO tiles SELECT * FROM db.tiles;
    

    其中

    filename.mbtiles
    是第二个 .mbtiles 文件的绝对路径。

  3. 如果出现错误

    UNIQUE constraint failed...
    ,请使用
    INSERT OR REPLACE
    INSERT OR IGNORE
    (选择一个更合适)而不是简单的
    INSERT INTO

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