Skip to content

Commit 83f3561

Browse files
author
Marcel Dancak
committed
MBTilesWriter can write tiles in any order, proper transforming of extents
1 parent efdd52c commit 83f3561

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

python/plugins/processing/algs/qgis/TilesXYZ.py

+15-12
Original file line numberDiff line numberDiff line change
@@ -163,29 +163,33 @@ def __init__(self, filename, tile_params, extent, min_zoom, max_zoom):
163163
ds = None
164164
self._zoom = None
165165

166-
def _initZoomLayer(self, first_tile):
166+
def _initZoomLayer(self, zoom):
167+
west_edge, south_edge, east_edge, north_edge = self.extent
168+
first_tile = Tile(*deg2num(north_edge, west_edge, zoom), zoom)
169+
last_tile = Tile(*deg2num(south_edge, east_edge, zoom), zoom)
170+
167171
first_tile_extent = first_tile.extent()
168-
sqlite_driver = ogr.GetDriverByName('SQLite')
169-
ds = sqlite_driver.Open(self.filename, 1)
172+
last_tile_extent = last_tile.extent()
170173
zoom_extent = [
171174
first_tile_extent[0],
172-
# extend with height of 1 tile, but do not exceed -89.98 to stay in valid range (gdal)
173-
max(-89.98, self.extent[1] - (first_tile_extent[3] - first_tile_extent[1])),
174-
# extend with width of 1 tile, do not exceed 180
175-
min(180, self.extent[2] + (first_tile_extent[2] - first_tile_extent[0])),
175+
last_tile_extent[1],
176+
last_tile_extent[2],
176177
first_tile_extent[3]
177178
]
179+
180+
sqlite_driver = ogr.GetDriverByName('SQLite')
181+
ds = sqlite_driver.Open(self.filename, 1)
178182
bounds = ','.join(map(str, zoom_extent))
179183
ds.ExecuteSQL("UPDATE metadata SET value='{}' WHERE name='bounds'".format(bounds))
180184
ds = None
181185

182186
self._zoomDs = gdal.OpenEx(self.filename, 1, open_options=['ZOOM_LEVEL=%s' % first_tile.z])
183187
self._first_tile = first_tile
184-
self._zoom = first_tile.z
188+
self._zoom = zoom
185189

186190
def writeTile(self, tile, image):
187191
if tile.z != self._zoom:
188-
self._initZoomLayer(tile)
192+
self._initZoomLayer(tile.z)
189193

190194
data = QByteArray()
191195
buff = QBuffer(data)
@@ -288,7 +292,7 @@ def processAlgorithm(self, parameters, context, feedback):
288292
settings.setLayers(layers)
289293
settings.setOutputDpi(dpi)
290294

291-
wgs_extent = src_to_wgs.transform(extent)
295+
wgs_extent = src_to_wgs.transformBoundingBox(extent)
292296
wgs_extent = [wgs_extent.xMinimum(), wgs_extent.yMinimum(), wgs_extent.xMaximum(), wgs_extent.yMaximum()]
293297

294298
metatiles_by_zoom = {}
@@ -319,8 +323,7 @@ def processAlgorithm(self, parameters, context, feedback):
319323
for i, metatile in enumerate(metatiles_by_zoom[zoom]):
320324
size = QSize(tile_width * metatile.rows(), tile_height * metatile.columns())
321325
extent = QgsRectangle(*metatile.extent())
322-
# TODO: transformation of bounding points?
323-
settings.setExtent(wgs_to_dest.transform(extent))
326+
settings.setExtent(wgs_to_dest.transformBoundingBox(extent))
324327
settings.setOutputSize(size)
325328

326329
label_area = QgsRectangle(settings.extent())

0 commit comments

Comments
 (0)