I’ve started to use TileStream as a node.js server to serve pre-rendered tiles saved in a .mbtiles file. This server can then be used as a tile layer by Leaflet to build a frontend HTML page that will show a map.
As I said in a previous blog post, MBTiles is a format created by mapbox that allows to stores millions of tiles in a SQLite database, which can be useful if you want to build an OpenStreetMap solution that will store tiles offline or store it in your own server.
There are many alternatives to TileStream, such as TileStache (in python). One benefit of TileStache is that it supports composite layers, which would allow you to serve multiple MBTiles at the same time on the same map. One reason you might want to do that would be if you have a MBTiles file that contains the map tiles of the whole OSM planet with zoom levels from 0 to 10. And then you could have a specific country in another MBTiles file that has the zoom levels 11 to 15. By combining both, you allow a seamless experience where someone could zoom up to 10 on any part of the world and then zoom up to 15 in a specific country.
While TileStream does not support this, you could instead decide to merge the two MBTiles file together, to a single file. This single file can then be served by TileStream.
As part of the MBUtil project, a patch bash shell script is provided that allows to do exactly that, available here: https://github.com/mapbox/mbutil/blob/master/patch It is as easy as executing the script, while providing the “source” and “destination” arguments to merge the two files (the destination MBtiles will become the merged file). Example:
./patch.sh Nepal013.mbtiles Nepal-1415.mbtiles
This script could also be used if you wanted to update an existing larger MBTiles file, with a newer MBTiles file (that might contain newer tiles for a specific region).
While this script will merge the two set of tiles together, it will not update the metadata of the MBTiles file. For example, if my destination file was a MBTiles file that contained the Nepal region from zoom level 14-15, and I merged it with the zoom levels 0-13, the metadata in the destination file will still mention that the minzoom and maxzoom are 14 to 15. I downloaded DB Browser for SQLite (Mac/Windows/Linux), open my merged MBTiles file, went to the metadata table, and from there it’s easy to update the minzoom to 0. (This step might not be required, this depends how strict your MBTiles implementation is, but this is a good practice to have your metadata match the actual data in the MBTiles)
After those steps, TileStream was able to serve the single merged MBTiles file across all zoom levels.
6 replies on “Merging multiple MBTiles together”
[…] Technical blog of an IT Consultant in Toronto « Merging multiple MBTiles together […]
Thank you!!! This saved my day!! After merging many mbtiles I was stuck to a single zoom level until I edited the zmin and zmax metadata.
Hey Jérôme, thanks for posting this. As I am very new to all this command line and scripting thing I am normally pretty lost with those code snippets and where to post them (CMD or Python etc.) and what exactly I have to change (path and file). I would be really thankful if you could provide more details for a dummy windows user, thanks! Cheers, Wolfram
Thank you for this post! Would you know how to run the patch on Windows?
nice script. when i try to merge very big files i get the error:
Error: near line 2: database disk image is malformed
Error: near line 4: database disk image is malformed
Error: near line 5: database disk image is malformed
Error: near line 6: database disk image is malformed
Error: near line 7: database disk image is malformed
What could be the problem?
This is really a very informative, who are working or planning to develop an offline map in the device.
On the way, I like to ask you one question. Do you know any way to extract a region as MBTiles format from entire planet MBTiles?
Please let me know if you have any solution for this.
Thanks in Advance 🙂