def drawTilesOnTheFly(self, renderContext, tiles, sdx=1.0, sdy=1.0): if not hasGdal: msg = self.tr("Reprojection requires python-gdal") self.showBarMessage(msg, QgsMessageBar.INFO, 2) return transform = renderContext.coordinateTransform() if not transform: return # create an image that has the same resolution as the tiles image = tiles.image() if self.grayscaleRender: QgsImageOperation.convertToGrayscale(image) if self.brigthness != LayerDefaultSettings.BRIGTNESS or self.contrast != LayerDefaultSettings.CONTRAST: QgsImageOperation.adjustBrightnessContrast(image, self.brigthness, self.contrast) # tile extent extent = tiles.extent() geotransform = [extent.xMinimum(), extent.width() / image.width(), 0, extent.yMaximum(), 0, -extent.height() / image.height()] driver = gdal.GetDriverByName("MEM") tile_ds = driver.Create("", image.width(), image.height(), 1, gdal.GDT_UInt32) tile_ds.SetProjection(str(transform.sourceCrs().toWkt())) tile_ds.SetGeoTransform(geotransform) # QImage to raster ba = image.bits().asstring(image.numBytes()) tile_ds.GetRasterBand(1).WriteRaster(0, 0, image.width(), image.height(), ba) # canvas extent m2p = renderContext.mapToPixel() viewport = renderContext.painter().viewport() width = viewport.width() height = viewport.height() extent = QgsRectangle(m2p.toMapCoordinatesF(0, 0), m2p.toMapCoordinatesF(width, height)) geotransform = [extent.xMinimum(), extent.width() / width, 0, extent.yMaximum(), 0, -extent.height() / height] canvas_ds = driver.Create("", width, height, 1, gdal.GDT_UInt32) canvas_ds.SetProjection(str(transform.destCRS().toWkt())) canvas_ds.SetGeoTransform(geotransform) # reproject image gdal.ReprojectImage(tile_ds, canvas_ds) # raster to QImage ba = canvas_ds.GetRasterBand(1).ReadRaster(0, 0, width, height) reprojected_image = QImage(ba, width, height, QImage.Format_ARGB32_Premultiplied) # draw the image on the map canvas rect = QRectF(QPointF(0, 0), QPointF(viewport.width() * sdx, viewport.height() * sdy)) renderContext.painter().drawImage(rect, reprojected_image)
def drawTiles(self, renderContext, tiles, sdx=1.0, sdy=1.0): # create an image that has the same resolution as the tiles image = tiles.image() if self.grayscaleRender: QgsImageOperation.convertToGrayscale(image) if self.brigthness != LayerDefaultSettings.BRIGTNESS or self.contrast != LayerDefaultSettings.CONTRAST: QgsImageOperation.adjustBrightnessContrast(image, self.brigthness, self.contrast) # tile extent to pixel map2pixel = renderContext.mapToPixel() extent = tiles.extent() topLeft = map2pixel.transform(extent.xMinimum(), extent.yMaximum()) bottomRight = map2pixel.transform(extent.xMaximum(), extent.yMinimum()) rect = QRectF(QPointF(topLeft.x() * sdx, topLeft.y() * sdy), QPointF(bottomRight.x() * sdx, bottomRight.y() * sdy)) # draw the image on the map canvas renderContext.painter().drawImage(rect, image) self.log("Tiles extent: " + str(extent)) self.log("Draw into canvas rect: " + str(rect))
def render_tiles(self, renderContext, tiles, sdx=1.0, sdy=1.0): # create an compose_image that has the same resolution as the tiles image = tiles.compose_image() QgsImageOperation.adjustBrightnessContrast(image, self.brightness, self.contrast) QgsImageOperation.adjustHueSaturation(image, self.saturation) # tile extent to pixel map2pixel = renderContext.mapToPixel() extent = tiles.extent() topLeft = map2pixel.transform(extent.xMinimum(), extent.yMaximum()) bottomRight = map2pixel.transform(extent.xMaximum(), extent.yMinimum()) rect = QRectF(QPointF(topLeft.x() * sdx, topLeft.y() * sdy), QPointF(bottomRight.x() * sdx, bottomRight.y() * sdy)) # draw the compose_image on the map canvas renderContext.painter().drawImage(rect, image) self.log("TilesCollection extent: " + str(extent)) self.log("Draw into canvas rect: " + str(rect))
def drawTilesOnTheFly(self, renderContext, tiles, sdx=1.0, sdy=1.0): if not hasGdal: msg = self.tr("Reprojection requires python-gdal") self.emitShowBarMessage(msg, QGisMessageBarLevel.Info, 2) return transform = renderContext.coordinateTransform() if not transform: return # create an image that has the same resolution as the tiles image = tiles.image() if self.grayscaleRender: QgsImageOperation.convertToGrayscale(image) if self.brigthness != LayerDefaultSettings.BRIGTNESS or self.contrast != LayerDefaultSettings.CONTRAST: QgsImageOperation.adjustBrightnessContrast(image, self.brigthness, self.contrast) # tile extent extent = tiles.extent() geotransform = [ extent.xMinimum(), extent.width() / image.width(), 0, extent.yMaximum(), 0, -extent.height() / image.height() ] driver = gdal.GetDriverByName("MEM") tile_ds = driver.Create("", image.width(), image.height(), 1, gdal.GDT_UInt32) tile_ds.SetProjection(str(transform.sourceCrs().toWkt())) tile_ds.SetGeoTransform(geotransform) # QImage to raster ba = image.bits().asstring(image.numBytes()) tile_ds.GetRasterBand(1).WriteRaster(0, 0, image.width(), image.height(), ba) # canvas extent m2p = renderContext.mapToPixel() viewport = renderContext.painter().viewport() width = viewport.width() height = viewport.height() extent = QgsRectangle(m2p.toMapCoordinatesF(0, 0), m2p.toMapCoordinatesF(width, height)) geotransform = [ extent.xMinimum(), extent.width() / width, 0, extent.yMaximum(), 0, -extent.height() / height ] canvas_ds = driver.Create("", width, height, 1, gdal.GDT_UInt32) canvas_ds.SetProjection(str(transform.destCRS().toWkt())) canvas_ds.SetGeoTransform(geotransform) # reproject image gdal.ReprojectImage(tile_ds, canvas_ds) # raster to QImage ba = canvas_ds.GetRasterBand(1).ReadRaster(0, 0, width, height) reprojected_image = QImage(ba, width, height, QImage.Format_ARGB32_Premultiplied) # draw the image on the map canvas rect = QRectF(QPointF(0, 0), QPointF(viewport.width() * sdx, viewport.height() * sdy)) renderContext.painter().drawImage(rect, reprojected_image)