import sys import sqlite3 import os import json # print help? if len(sys.argv) == 1 or sys.argv[1] in ['-h', '--help', 'help', '/?']: print "Usage: python extract.py mbtiles_file_name" quit() mbtiles_file = sys.argv[1] # make sure file exist try: with open(mbtiles_file) as f: pass except IOError as e: print "File '%s' doesn't exists" % mbtiles_file quit() # open sqlite3 database conn = sqlite3.connect(mbtiles_file) # get tile format from metadata table format_row = conn.execute('SELECT value FROM metadata WHERE name = ?', ['format']).fetchone() if format_row: format = format_row[0] else: format = 'png' # default is png # get map name (root dir for extracted tiles) dir_root = mbtiles_file[:mbtiles_file.rfind('.')] if not os.path.exists(dir_root): os.makedirs(dir_root) # dump all metadata as json metadata_dict = { } for row in conn.execute('SELECT name, value FROM metadata'): metadata_dict[row[0]] = row[1] f = open(dir_root + '/metadata.json', 'w+') json.dump(metadata_dict, f) # fetch all tile rows for row in conn.execute('SELECT zoom_level, tile_row, tile_column, tile_data FROM tiles ORDER BY zoom_level, tile_row, tile_column'): # create directory if it doesn't already exist dir_name = dir_root + '/' + str(row[0]) if not os.path.exists(dir_name): os.makedirs(dir_name) # tile_name = str(row[1]) + '_' + str(row[2]) + tile_name = '%d_%d.%s' % (row[1], row[2], format) # dump tile data (png or jpg image) f = open(dir_name + '/' + tile_name, 'w+') f.write(row[3])