def write(self, f): # TODO: separated image files (not in localBrowsingMode) if len(self._list) == 0: return f.write(u'\n// Base64 encoded images\n') for index, image in enumerate(self._list): imageType = image[0] if imageType == self.IMAGE_FILE: image_path = image[1] exists = os.path.exists(image_path) if exists and os.path.isfile(image_path): size = QImageReader(image_path).size() args = (index, size.width(), size.height(), gdal2threejs.base64image(image_path)) else: f.write(u"project.images[%d] = {data:null};\n" % index) if exists: err_msg = u"Not image file path" else: err_msg = u"Image file not found" logMessage(u"{0}: {1}".format(err_msg, image_path)) continue elif imageType == self.MAP_IMAGE: width, height, extent, transp_background = image[1] args = ( index, width, height, self.renderedImage( width, height, extent, transp_background)) elif imageType == self.LAYER_IMAGE: layerids, width, height, extent, transp_background = image[1] args = ( index, width, height, self.renderedImage( width, height, extent, transp_background, layerids)) else: # imageType == self.CANVAS_IMAGE: transp_background = image[1] size = self.exportSettings.mapSettings.outputSize() args = (index, size.width(), size.height(), self.mapCanvasImage(transp_background)) f.write( u'project.images[%d] = {width:%d,height:%d,data:"%s"};\n' % args)
def mapCanvasImage(self, transp_background=False): """ returns base64 encoded map canvas image """ if transp_background: size = self.context.mapSettings.outputSize() return self.renderedImage(size.width(), size.height(), self.context.baseExtent, transp_background) canvas = self.context.canvas if QGis.QGIS_VERSION_INT >= 20400: return tools.base64image(canvas.map().contentImage()) temp_dir = QDir.tempPath() texfilename = os.path.join(temp_dir, "tex%s.png" % (self.context.timestamp)) canvas.saveAsImage(texfilename) texData = gdal2threejs.base64image(texfilename) tools.removeTemporaryFiles([texfilename, texfilename + "w"]) return texData
def mapCanvasImage(self, transp_background=False): """ returns base64 encoded map canvas image """ canvas = self.exportSettings.canvas if canvas is None or transp_background: size = self.exportSettings.mapSettings.outputSize() return self.renderedImage(size.width(), size.height(), self.exportSettings.baseExtent, transp_background) if QGis.QGIS_VERSION_INT >= 20400: return tools.base64image(canvas.map().contentImage()) temp_dir = QDir.tempPath() texfilename = os.path.join( temp_dir, "tex%s.png" % (self.exportSettings.timestamp)) canvas.saveAsImage(texfilename) texData = gdal2threejs.base64image(texfilename) tools.removeTemporaryFiles([texfilename, texfilename + "w"]) return texData
def write(self, f): #TODO: separated image files (not in localBrowsingMode) if len(self._list) == 0: return f.write(u'\n// Base64 encoded images\n') for index, image in enumerate(self._list): imageType = image[0] if imageType == self.IMAGE_FILE: image_path = image[1] exists = os.path.exists(image_path) if exists and os.path.isfile(image_path): size = QImageReader(image_path).size() args = (index, size.width(), size.height(), gdal2threejs.base64image(image_path)) else: f.write(u"project.images[%d] = {data:null};\n" % index) if exists: err_msg = u"Not image file path" else: err_msg = u"Image file not found" logMessage(u"{0}: {1}".format(err_msg, image_path)) continue elif imageType == self.MAP_IMAGE: width, height, extent, transp_background = image[1] args = (index, width, height, self.renderedImage(width, height, extent, transp_background)) elif imageType == self.LAYER_IMAGE: layerids, width, height, extent, transp_background = image[1] args = (index, width, height, self.renderedImage(width, height, extent, transp_background, layerids)) else: #imageType == self.CANVAS_IMAGE: transp_background = image[1] size = self.context.mapSettings.outputSize() args = (index, size.width(), size.height(), self.mapCanvasImage(transp_background)) f.write(u'project.images[%d] = {width:%d,height:%d,data:"%s"};\n' % args)
def writeSimpleDEM(writer, properties, progress=None): context = writer.context mapTo3d = context.mapTo3d canvas = context.canvas extent = canvas.extent() temp_dir = QDir.tempPath() timestamp = writer.timestamp htmlfilename = writer.htmlfilename if progress is None: progress = dummyProgress prop = DEMPropertyReader(properties) dem_width = prop.width() dem_height = prop.height() # warp dem # calculate extent. output dem should be handled as points. xres = extent.width() / (dem_width - 1) yres = extent.height() / (dem_height - 1) geotransform = [extent.xMinimum() - xres / 2, xres, 0, extent.yMaximum() + yres / 2, 0, -yres] wkt = str(context.crs.toWkt()) layerName = "" demLayerId = properties["comboBox_DEMLayer"] if demLayerId: layer = QgsMapLayerRegistry().instance().mapLayer(demLayerId) layerName = layer.name() warp_dem = tools.MemoryWarpRaster(layer.source().encode("UTF-8")) else: warp_dem = tools.FlatRaster() # warp dem dem_values = warp_dem.read(dem_width, dem_height, wkt, geotransform) # calculate statistics stats = {"max": max(dem_values), "min": min(dem_values)} # shift and scale if mapTo3d.verticalShift != 0: dem_values = map(lambda x: x + mapTo3d.verticalShift, dem_values) if mapTo3d.multiplierZ != 1: dem_values = map(lambda x: x * mapTo3d.multiplierZ, dem_values) if debug_mode: qDebug("Warped DEM: %d x %d, extent %s" % (dem_width, dem_height, str(geotransform))) surroundings = properties.get("checkBox_Surroundings", False) if surroundings: roughenEdges(dem_width, dem_height, dem_values, properties["spinBox_Roughening"]) # layer dict lyr = {"type": "dem", "name": layerName, "stats": stats} lyr["q"] = 1 #queryable dem = {"width": dem_width, "height": dem_height} dem["plane"] = {"width": mapTo3d.planeWidth, "height": mapTo3d.planeHeight, "offsetX": 0, "offsetY": 0} lyr["dem"] = [dem] # DEM transparency demTransparency = prop.properties["spinBox_demtransp"] # display type texData = texSrc = None if properties.get("radioButton_MapCanvas", False): # save map canvas image #TODO: prepare material(texture) in Material manager (result is tex -> material index) if 1: #context.localBrowsingMode: texfilename = os.path.join(temp_dir, "tex%s.png" % (timestamp)) canvas.saveAsImage(texfilename) texData = gdal2threejs.base64image(texfilename) tools.removeTemporaryFiles([texfilename, texfilename + "w"]) else: #TODO: multiple DEMs output not in localBrowsingMode texfilename = os.path.splitext(htmlfilename)[0] + ".png" canvas.saveAsImage(texfilename) texSrc = os.path.split(texfilename)[1] tools.removeTemporaryFiles([texfilename + "w"]) elif properties.get("radioButton_ImageFile", False): filename = properties.get("lineEdit_ImageFile", "") if os.path.exists(filename): texData = gdal2threejs.base64image(filename) else: texData = "" # QgsMessageLog.logMessage(u'Image file not found: {0}'.format(filename), "Qgis2threejs") elif properties.get("radioButton_SolidColor", False): dem["m"] = writer.materialManager.getMeshLambertIndex(properties["lineEdit_Color"], demTransparency) elif properties.get("radioButton_Wireframe", False): dem["m"] = writer.materialManager.getWireframeIndex(properties["lineEdit_Color"], demTransparency) if texData is not None or texSrc is not None: tex = {} if texSrc is not None: tex["src"] = texSrc if demTransparency > 0: demOpacity = 1.0 - float(demTransparency) / 100 tex["o"] = demOpacity tex["t"] = demOpacity < 1 # dem["t"] = tex if not surroundings and properties.get("checkBox_Sides", False): side = {} sidesTransparency = prop.properties["spinBox_sidetransp"] if sidesTransparency > 0: sidesOpacity = str(1.0 - float(sidesTransparency) / 100) side["o"] = sidesOpacity dem["s"] = side if not surroundings and properties.get("checkBox_Frame", False): dem["frame"] = True # write layer and central dem lyrIdx = writer.writeLayer(lyr) writer.write("lyr[{0}].dem[0].data = [{1}];\n".format(lyrIdx, ",".join(map(gdal2threejs.formatValue, dem_values)))) if texData is not None: writer.write('lyr[{0}].dem[0].t.data = "{1}";\n'.format(lyrIdx, texData)) # write surrounding dems if surroundings: writeSurroundingDEM(writer, lyrIdx, stats, properties, progress) # overwrite stats writer.write("lyr[{0}].stats = {1};\n".format(lyrIdx, writer.obj2js(stats)))
def runSimple(htmlfilename, context, progress=None): mapTo3d = context.mapTo3d canvas = context.canvas extent = canvas.extent() demlayer = QgsMapLayerRegistry().instance().mapLayer(context.demlayerid) if progress is None: progress = dummyProgress temp_dir = QDir.tempPath() timestamp = datetime.datetime.today().strftime("%Y%m%d%H%M%S") if htmlfilename == "": htmlfilename = tools.temporaryOutputDir() + "/%s.html" % timestamp out_dir, filename = os.path.split(htmlfilename) if not QDir(out_dir).exists(): QDir().mkpath(out_dir) filetitle = os.path.splitext(filename)[0] # save map canvas image if context.localBrowsingMode: texfilename = os.path.join(temp_dir, "tex%s.png" % (timestamp)) canvas.saveAsImage(texfilename) tex = gdal2threejs.base64image(texfilename) tools.removeTemporaryFiles([texfilename, texfilename + "w"]) else: texfilename = os.path.splitext(htmlfilename)[0] + ".png" canvas.saveAsImage(texfilename) tex = os.path.split(texfilename)[1] tools.removeTemporaryFiles([texfilename + "w"]) progress(20) # warp dem # calculate extent. output dem should be handled as points. xres = extent.width() / (context.dem_width - 1) yres = extent.height() / (context.dem_height - 1) geotransform = [extent.xMinimum() - xres / 2, xres, 0, extent.yMaximum() + yres / 2, 0, -yres] wkt = str(context.crs.toWkt()) warp_dem = tools.MemoryWarpRaster(demlayer.source().encode("UTF-8")) dem_values = warp_dem.read(context.dem_width, context.dem_height, wkt, geotransform) if mapTo3d.multiplierZ != 1: dem_values = map(lambda x: x * mapTo3d.multiplierZ, dem_values) if debug_mode: qDebug("Warped DEM: %d x %d, extent %s" % (context.dem_width, context.dem_height, str(geotransform))) # create JavaScript writer object context.setWarpDem(warp_dem) writer = JSWriter(htmlfilename, context) writer.openFile() # write dem data offsetX = offsetY = 0 opt = "{width:%f,height:%f,offsetX:%f,offsetY:%f}" % (mapTo3d.planeWidth, mapTo3d.planeHeight, offsetX, offsetY) writer.write('dem[0] = {width:%d,height:%d,plane:%s,data:[%s]};\n' % (context.dem_width, context.dem_height, opt, ",".join(map(gdal2threejs.formatValue, dem_values)))) writer.write('tex[0] = "%s";\n' % tex) progress(50) # write vector data writeVectors(writer) progress(80) # copy files from template tools.copyThreejsFiles(out_dir) # generate html file with codecs.open(tools.pluginDir() + "/template.html", "r", "UTF-8") as f: html = f.read() with codecs.open(htmlfilename, "w", "UTF-8") as f: f.write(html.replace("${title}", filetitle).replace("${scripts}", writer.scripts())) return htmlfilename
def runSimple(htmlfilename, context, progress=None): mapTo3d = context.mapTo3d canvas = context.canvas extent = canvas.extent() demlayer = QgsMapLayerRegistry().instance().mapLayer(context.demlayerid) if progress is None: progress = dummyProgress temp_dir = QDir.tempPath() timestamp = datetime.datetime.today().strftime("%Y%m%d%H%M%S") if htmlfilename == "": htmlfilename = tools.temporaryOutputDir() + "/%s.html" % timestamp out_dir, filename = os.path.split(htmlfilename) if not QDir(out_dir).exists(): QDir().mkpath(out_dir) filetitle = os.path.splitext(filename)[0] # save map canvas image if context.localBrowsingMode: texfilename = os.path.join(temp_dir, "tex%s.png" % (timestamp)) canvas.saveAsImage(texfilename) tex = gdal2threejs.base64image(texfilename) tools.removeTemporaryFiles([texfilename, texfilename + "w"]) else: texfilename = os.path.splitext(htmlfilename)[0] + ".png" canvas.saveAsImage(texfilename) tex = os.path.split(texfilename)[1] tools.removeTemporaryFiles([texfilename + "w"]) progress(20) # warp dem # calculate extent. output dem should be handled as points. xres = extent.width() / (context.dem_width - 1) yres = extent.height() / (context.dem_height - 1) geotransform = [ extent.xMinimum() - xres / 2, xres, 0, extent.yMaximum() + yres / 2, 0, -yres ] wkt = str(context.crs.toWkt()) warp_dem = tools.MemoryWarpRaster(demlayer.source().encode("UTF-8")) dem_values = warp_dem.read(context.dem_width, context.dem_height, wkt, geotransform) if mapTo3d.multiplierZ != 1: dem_values = map(lambda x: x * mapTo3d.multiplierZ, dem_values) if debug_mode: qDebug("Warped DEM: %d x %d, extent %s" % (context.dem_width, context.dem_height, str(geotransform))) # create JavaScript writer object context.setWarpDem(warp_dem) writer = JSWriter(htmlfilename, context) writer.openFile() # write dem data offsetX = offsetY = 0 opt = "{width:%f,height:%f,offsetX:%f,offsetY:%f}" % ( mapTo3d.planeWidth, mapTo3d.planeHeight, offsetX, offsetY) writer.write('dem[0] = {width:%d,height:%d,plane:%s,data:[%s]};\n' % (context.dem_width, context.dem_height, opt, ",".join( map(gdal2threejs.formatValue, dem_values)))) writer.write('tex[0] = "%s";\n' % tex) progress(50) # write vector data writeVectors(writer) progress(80) # copy files from template tools.copyThreejsFiles(out_dir) # generate html file with codecs.open(tools.pluginDir() + "/template.html", "r", "UTF-8") as f: html = f.read() with codecs.open(htmlfilename, "w", "UTF-8") as f: f.write( html.replace("${title}", filetitle).replace("${scripts}", writer.scripts())) return htmlfilename