我通过 QGIS 创建了 2 个 Mbtile:1)一个 Mbtile 是从缩放 0 到 10,是整个世界的地图,2)另一个是从缩放 0 到 17,是一个国家的详细地图。
我想合并两个Mbtile,并使详细国家的Mbtile与整个世界的Mbtile重叠。合并结果也是从缩放 0 到缩放 17(缩放 10 时整个世界将消失,但国家将保留到缩放 17)。
我应该使用什么程序/方法?可以通过QGIS合并它们吗?
您可以使用tile-join,它有一堆标志,因此您可以自定义输出。
我使用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)
您可以在这里找到更详细的描述,但简而言之: 您可以使用SQLiteStudio。
通过“添加数据库”将您的第一个 .mbtiles 文件放入其中,或者将其拖到 SQLiteStudio 中。 (最好取大一点的,这样可以减少合并时间)
打开创建的DB控制台,执行以下命令:
ATTACH 'filename.mbtiles' as db;
INSERT INTO tiles SELECT * FROM db.tiles;
其中
filename.mbtiles
是第二个 .mbtiles 文件的绝对路径。
如果出现错误
UNIQUE constraint failed...
,请使用INSERT OR REPLACE
或INSERT OR IGNORE
(选择一个更合适)而不是简单的INSERT INTO
。