QGIS 3 – Troubleshooting sqlite3.OperationalError When Generating MBTiles

mbtilesqgis-3rasterxyz-tiles

On Windows 10 Enterprise 20H2 (Build 19042.1706) with QGIS 3.22.5-Białowieża I am getting the following error together with the log:

QGIS version: 3.22.5-Białowieża
QGIS code revision: c2723178
Qt version: 5.15.2
Python version: 3.9.5
GDAL version: 3.4.1
GEOS version: 3.10.2-CAPI-1.16.0
PROJ version: Rel. 8.2.1, January 1st, 2022
PDAL version: 2.3.0 (git-version: 9f35b7)
Algorithm started at: 2022-05-19T10:34:34
Algorithm 'Generate XYZ tiles (MBTiles)' starting…
Input parameters:
{ 'BACKGROUND_COLOR' : QColor(0, 0, 0, 0), 'DPI' : 96, 'EXTENT' : '511960.000000000,514565.000000000,5397510.000000000,5399560.000000000 [EPSG:25832]', 'METATILESIZE' : 4, 'OUTPUT_FILE' : 'R:/.../offline_basemap_lhs_stadtkarte.mbtiles', 'QUALITY' : 90, 'TILE_FORMAT' : 0, 'ZOOM_MAX' : 20, 'ZOOM_MIN' : 16 }

Using 6 CPU Threads:
Generating tiles for zoom level: 16
Generating tiles for zoom level: 17
Generating tiles for zoom level: 18
Generating tiles for zoom level: 19
Generating tiles for zoom level: 20
Traceback (most recent call last):
File "C:\PROGRA~1/QGIS32~1.5/apps/qgis-ltr/./python/plugins\processing\algs\qgis\TilesXYZ.py", line 455, in processAlgorithm
self.generate(writer, parameters, context, feedback)
File "C:\PROGRA~1/QGIS32~1.5/apps/qgis-ltr/./python/plugins\processing\algs\qgis\TilesXYZ.py", line 316, in generate
for result in threadPool.map(self.renderSingleMetatile, metatiles_by_zoom[zoom]):
File "C:\PROGRA~1\QGIS32~1.5\apps\Python39\lib\concurrent\futures\_base.py", line 608, in result_iterator
yield fs.pop().result()
File "C:\PROGRA~1\QGIS32~1.5\apps\Python39\lib\concurrent\futures\_base.py", line 445, in result
return self.__get_result()
File "C:\PROGRA~1\QGIS32~1.5\apps\Python39\lib\concurrent\futures\_base.py", line 390, in __get_result
raise self._exception
File "C:\PROGRA~1\QGIS32~1.5\apps\Python39\lib\concurrent\futures\thread.py", line 52, in run
result = self.fn(*self.args, **self.kwargs)
File "C:\PROGRA~1/QGIS32~1.5/apps/qgis-ltr/./python/plugins\processing\algs\qgis\TilesXYZ.py", line 230, in renderSingleMetatile
self.writer.write_tile(tile, tileImage)
File "C:\PROGRA~1/QGIS32~1.5/apps/qgis-ltr/./python/plugins\processing\algs\qgis\TilesXYZ.py", line 401, in write_tile
self._init_zoom_layer(tile.z)
File "C:\PROGRA~1/QGIS32~1.5/apps/qgis-ltr/./python/plugins\processing\algs\qgis\TilesXYZ.py", line 393, in _init_zoom_layer
self._execute_sqlite("UPDATE metadata SET value='{}' WHERE name='bounds'".format(bounds))
File "C:\PROGRA~1/QGIS32~1.5/apps/qgis-ltr/./python/plugins\processing\algs\qgis\TilesXYZ.py", line 373, in _execute_sqlite
conn.execute(cmd)
sqlite3.OperationalError: database is locked

Execution failed after 72.20 seconds (1 minute 12 seconds)

Loading resulting layers
Algorithm 'Generate XYZ tiles (MBTiles)' finished

It had happened after applying the "Generate XYZ tiles (MBTiles)" geoalgorithm. I could get the output even with this error.

With this tool I tried to create an offline tiled map, here are the settings:

settings

What could go wrong?

Best Answer

This error happens when one tries to override already existing .mbtiles file.

A working solution is either (1) delete the existing output and write a new file or (2) write the output to a new file with a different name.

And also as was mentioned in this comment:

The workaround I found was using QGIS 3.20.3

For more details see also : GenerateXYZ (MBTiles) multithreading problem #47738

Related Question