def unload(self): AlgorithmProvider.unload(self) if SextanteUtils.isWindows() or SextanteUtils.isMac(): SextanteConfig.removeSetting(GrassUtils.GRASS_FOLDER) SextanteConfig.removeSetting(GrassUtils.GRASS_WIN_SHELL) SextanteConfig.removeSetting(GrassUtils.GRASS_LOG_COMMANDS) SextanteConfig.removeSetting(GrassUtils.GRASS_LOG_CONSOLE)
def executeGrass(commands, progress): if SextanteUtils.isWindows(): GrassUtils.createGrassScript(commands) command = ["cmd.exe", "/C ", GrassUtils.grassScriptFilename()] else: gisrc = SextanteUtils.userFolder() + os.sep + "sextante.gisrc" os.putenv("GISRC", gisrc) os.putenv("GRASS_MESSAGE_FORMAT", "gui") os.putenv("GRASS_BATCH_JOB", GrassUtils.grassBatchJobFilename()) GrassUtils.createGrassBatchJobFileFromGrassCommands(commands) os.chmod(GrassUtils.grassBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) if SextanteUtils.isMac(): command = GrassUtils.grassPath() + os.sep + "grass.sh " + GrassUtils.grassMapsetFolder() + "/user" else: command = "grass64 " + GrassUtils.grassMapsetFolder() + "/user" loglines = [] loglines.append("GRASS execution console output") proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "GRASS_INFO_PERCENT" in line: try: progress.setPercentage(int(line[len("GRASS_INFO_PERCENT")+ 2:])) except: pass else: loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(GrassUtils.GRASS_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
def otbPath(): folder = SextanteConfig.getSetting(OTBUtils.OTB_FOLDER) if folder == None: folder = "" #try to configure the path automatically if SextanteUtils.isMac(): testfolder = os.path.join(str(QgsApplication.prefixPath()), "bin") if os.path.exists(os.path.join(testfolder, "otbcli")): folder = testfolder else: testfolder = "/usr/local/bin" if os.path.exists(os.path.join(testfolder, "otbcli")): folder = testfolder elif SextanteUtils.isWindows(): testfolder = os.path.dirname(str(QgsApplication.prefixPath())) testfolder = os.path.dirname(testfolder) testfolder = os.path.join(testfolder, "bin") path = os.path.join(testfolder, "otbcli.bat") if os.path.exists(path): folder = testfolder else: testfolder = "/usr/bin" if os.path.exists(os.path.join(testfolder, "otbcli")): folder = testfolder return folder
def otbLibPath(): folder = SextanteConfig.getSetting(OTBUtils.OTB_LIB_FOLDER) if folder == None: folder = "" #try to configure the path automatically if SextanteUtils.isMac(): testfolder = os.path.join(str(QgsApplication.prefixPath()), "lib/otb/applications") if os.path.exists(testfolder): folder = testfolder else: testfolder = "/usr/local/lib/otb/applications" if os.path.exists(testfolder): folder = testfolder elif SextanteUtils.isWindows(): testfolder = os.path.dirname(str(QgsApplication.prefixPath())) testfolder = os.path.join(testfolder, "orfeotoolbox") testfolder = os.path.join(testfolder, "applications") if os.path.exists(testfolder): folder = testfolder else: testfolder = "/usr/lib/otb/applications" if os.path.exists(testfolder): folder = testfolder return folder
def executeGrass(commands, progress): if SextanteUtils.isWindows(): GrassUtils.createGrassScript(commands) command = ["cmd.exe", "/C ", GrassUtils.grassScriptFilename()] else: gisrc = SextanteUtils.userFolder() + os.sep + "sextante.gisrc" os.putenv("GISRC", gisrc) os.putenv("GRASS_MESSAGE_FORMAT", "gui") os.putenv("GRASS_BATCH_JOB", GrassUtils.grassBatchJobFilename()) GrassUtils.createGrassBatchJobFileFromGrassCommands(commands) os.chmod(GrassUtils.grassBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) if SextanteUtils.isMac(): command = GrassUtils.grassPath() + os.sep + "grass.sh " + GrassUtils.grassMapsetFolder() + "/user" else: command = "grass64 " + GrassUtils.grassMapsetFolder() + "/user" loglines = [] loglines.append("GRASS execution console output") proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "GRASS_INFO_PERCENT" in line: try: progress.setPercentage(int(line[len("GRASS_INFO_PERCENT")+ 2:])) except: pass else: loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(GrassUtils.GRASS_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines) shutil.rmtree(GrassUtils.grassMapsetFolder(), True)
def checkBeforeOpeningParametersDialog(self): if SextanteUtils.isWindows(): path = RUtils.RFolder() if path == "": return "R folder is not configured.\nPlease configure it before running R scripts." R_INSTALLED = "R_INSTALLED" settings = QSettings() if settings.contains(R_INSTALLED): return if SextanteUtils.isWindows(): if SextanteConfig.getSetting(RUtils.R_USE64): execDir = "x64" else: execDir = "i386" command = [RUtils.RFolder() + os.sep + "bin" + os.sep + execDir + os.sep + "R.exe --version"] else: command = ["R --version"] proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "R version" in line: settings.setValue(R_INSTALLED, True) return return "It seems that R is not correctly installed in your system.\nPlease install it before running R Scripts."
def processAlgorithm(self, progress): #TODO:check correct num of bands input = self.getParameterValue(SplitRGBBands.INPUT) temp = SextanteUtils.getTempFilename() r = self.getOutputValue(SplitRGBBands.R) g = self.getOutputValue(SplitRGBBands.G) b = self.getOutputValue(SplitRGBBands.B) commands = [] if SextanteUtils.isWindows(): commands.append("io_gdal 0 -GRIDS \"" + temp + "\" -FILES \"" + input + "\"") commands.append("io_gdal 1 -GRIDS \"" + temp + "_0001.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + r + "\"") commands.append("io_gdal 1 -GRIDS \"" + temp + "_0002.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + g + "\"") commands.append("io_gdal 1 -GRIDS \"" + temp + "_0003.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + b + "\"") else: commands.append("libio_gdal 0 -GRIDS \"" + temp + "\" -FILES \"" + input + "\"") commands.append("libio_gdal 1 -GRIDS \"" + temp + "_0001.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + r + "\"") commands.append("libio_gdal 1 -GRIDS \"" + temp + "_0002.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + g + "\"") commands.append("libio_gdal 1 -GRIDS \"" + temp + "_0003.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + b + "\"") SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) SagaUtils.executeSaga(progress)
def exportRasterLayer(self, layer): destFilename = SextanteUtils.getTempFilenameInTempFolder(os.path.basename(layer)[0:5] + ".sgrd") self.exportedLayers[layer] = destFilename if SextanteUtils.isWindows() or SextanteUtils.isMac(): return 'io_gdal 0 -GRIDS "' + destFilename + '" -FILES "' + layer + '"' else: return 'libio_gdal 0 -GRIDS "' + destFilename + '" -FILES "' + layer + '"'
def exportRasterLayer(self, layer): destFilename = SextanteUtils.getTempFilename("sgrd") self.exportedLayers[layer]= destFilename if SextanteUtils.isWindows(): return "io_gdal 0 -GRIDS \"" + destFilename + "\" -FILES \"" + layer+"\"" else: return "libio_gdal 0 -GRIDS \"" + destFilename + "\" -FILES \"" + layer + "\""
def checkBeforeOpeningParametersDialog(self): if SextanteUtils.isWindows(): path = RUtils.RFolder() if path == "": return "R folder is not configured.\nPlease configure it before running R scripts." R_INSTALLED = "R_INSTALLED" settings = QSettings() if settings.contains(R_INSTALLED): return if SextanteUtils.isWindows(): if SextanteConfig.getSetting(RUtils.R_USE64): execDir = "x64" else: execDir = "i386" command = [ RUtils.RFolder() + os.sep + "bin" + os.sep + execDir + os.sep + "R.exe --version" ] else: command = ["R --version"] proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "R version" in line: settings.setValue(R_INSTALLED, True) return return "It seems that R is not correctly installed in your system.\nPlease install it before running R Scripts."
def checkRIsInstalled(ignoreRegistrySettings=False): if SextanteUtils.isWindows(): path = RUtils.RFolder() if path == "": return "R folder is not configured.\nPlease configure it before running R scripts." R_INSTALLED = "R_INSTALLED" settings = QSettings() if not ignoreRegistrySettings: if settings.contains(R_INSTALLED): return if SextanteUtils.isWindows(): if SextanteConfig.getSetting(RUtils.R_USE64): execDir = "x64" else: execDir = "i386" command = [RUtils.RFolder() + os.sep + "bin" + os.sep + execDir + os.sep + "R.exe", "--version"] else: command = ["R --version"] proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "R version" in line: settings.setValue(R_INSTALLED, True) return html = ("<p>This algorithm requires R to be run." "Unfortunately, it seems that R is not installed in your system, or it is not correctly configured to be used from QGIS</p>" '<p><a href= "http://docs.qgis.org/2.0/html/en/docs/user_manual/sextante/3rdParty.html">Click here</a>' 'to know more about how to install and configure R to be used with SEXTANTE</p>') return html
def initializeSettings(self): AlgorithmProvider.initializeSettings(self) if SextanteUtils.isWindows() or SextanteUtils.isMac(): SextanteConfig.addSetting( Setting(self.getDescription(), GrassUtils.GRASS_FOLDER, "GRASS folder", GrassUtils.grassPath())) SextanteConfig.addSetting( Setting(self.getDescription(), GrassUtils.GRASS_WIN_SHELL, "Msys folder", GrassUtils.grassWinShell())) SextanteConfig.addSetting( Setting(self.getDescription(), GrassUtils.GRASS_LOG_COMMANDS, "Log execution commands", False)) SextanteConfig.addSetting( Setting(self.getDescription(), GrassUtils.GRASS_LOG_CONSOLE, "Log console output", False)) #SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_AUTO_REGION, "Use min covering region", True)) SextanteConfig.addSetting( Setting(self.getDescription(), GrassUtils.GRASS_LATLON, "Coordinates are lat/lon", False)) #======================================================================= # SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_REGION_XMIN, "GRASS Region min x", 0)) # SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_REGION_YMIN, "GRASS Region min y", 0)) # SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_REGION_XMAX, "GRASS Region max x", 1000)) # SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_REGION_YMAX, "GRASS Region max y", 1000)) # SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_REGION_CELLSIZE, "GRASS Region cellsize", 100)) #======================================================================= SextanteConfig.addSetting( Setting(self.getDescription(), GrassUtils.GRASS_HELP_FOLDER, "GRASS help folder", GrassUtils.grassHelpPath()))
def initializeSettings(self): AlgorithmProvider.initializeSettings(self) if SextanteUtils.isWindows() or SextanteUtils.isMac(): SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_FOLDER, "GRASS folder", GrassUtils.grassPath())) SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_WIN_SHELL, "Msys folder", GrassUtils.grassWinShell())) SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_LOG_COMMANDS, "Log execution commands", False)) SextanteConfig.addSetting(Setting(self.getDescription(), GrassUtils.GRASS_LOG_CONSOLE, "Log console output", False))
def processAlgorithm(self, progress): #TODO:check correct num of bands input = self.getParameterValue(SplitRGBBands.INPUT) temp = SextanteUtils.getTempFilename(None).replace('.',''); basename = os.path.basename(temp) validChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" safeBasename = ''.join(c for c in basename if c in validChars) temp = os.path.join(os.path.dirname(temp), safeBasename) r = self.getOutputValue(SplitRGBBands.R) g = self.getOutputValue(SplitRGBBands.G) b = self.getOutputValue(SplitRGBBands.B) commands = [] if SextanteUtils.isWindows(): commands.append("io_gdal 0 -GRIDS \"" + temp + "\" -FILES \"" + input+"\"") commands.append("io_gdal 1 -GRIDS \"" + temp + "_0001.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + r + "\""); commands.append("io_gdal 1 -GRIDS \"" + temp + "_0002.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + g + "\""); commands.append("io_gdal 1 -GRIDS \"" + temp + "_0003.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + b + "\""); else: commands.append("libio_gdal 0 -GRIDS \"" + temp + "\" -FILES \"" + input + "\"") commands.append("libio_gdal 1 -GRIDS \"" + temp + "_0001.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + r + "\""); commands.append("libio_gdal 1 -GRIDS \"" + temp + "_0002.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + g + "\""); commands.append("libio_gdal 1 -GRIDS \"" + temp + "_0003.sgrd\" -FORMAT 1 -TYPE 0 -FILE \"" + b + "\""); SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) SagaUtils.executeSaga(progress);
def exportRasterLayer(self, layer): destFilename = SextanteUtils.getTempFilename("sgrd") self.exportedLayers[layer] = destFilename if SextanteUtils.isWindows(): return "io_gdal 0 -GRIDS \"" + destFilename + "\" -FILES \"" + layer + "\"" else: return "libio_gdal 0 -GRIDS \"" + destFilename + "\" -FILES \"" + layer + "\""
def exportRasterLayer(self, layer): destFilename = SextanteUtils.getTempFilenameInTempFolder( os.path.basename(layer)[0:5] + ".sgrd") self.exportedLayers[layer] = destFilename if SextanteUtils.isWindows() or SextanteUtils.isMac(): return "io_gdal 0 -GRIDS \"" + destFilename + "\" -FILES \"" + layer + "\"" else: return "libio_gdal 0 -GRIDS \"" + destFilename + "\" -FILES \"" + layer + "\""
def sagaBatchJobFilename(): if SextanteUtils.isWindows(): filename = "saga_batch_job.bat" else: filename = "saga_batch_job.sh" batchfile = SextanteUtils.userFolder() + os.sep + filename return batchfile
def sagaBatchJobFilename(): if SextanteUtils.isWindows(): filename = "saga_batch_job.bat"; else: filename = "saga_batch_job.sh"; batchfile = SextanteUtils.userFolder() + os.sep + filename return batchfile
def test_SagaRasterAlgorithmWithUnsupportedOutputFormat(self): outputs=sextante.runalg("saga:convergenceindex",raster(),0,0,SextanteUtils.getTempFilename("img")) output=outputs['RESULT'] self.assertTrue(os.path.isfile(output)) dataset=gdal.Open(output, GA_ReadOnly) strhash=hash(str(dataset.ReadAsArray(0).tolist())) self.assertEqual(strhash, 485390137)
def unload(self): self.toolbox.setVisible(False) self.menu.deleteLater() #delete temporary output files folder = SextanteUtils.tempFolder() if QDir(folder).exists(): shutil.rmtree(folder, True)
def createGrassScript(commands): folder = GrassUtils.grassPath() shell = GrassUtils.grassWinShell() script = GrassUtils.grassScriptFilename() gisrc = SextanteUtils.userFolder() + os.sep + "sextante.gisrc" #temporary gisrc file output = open(gisrc, "w") location = "temp_location" gisdbase = GrassUtils.grassDataFolder() #gisdbase = os.path.join(os.path.expanduser("~"), "sextante", "tempdata", "grassdata") output.write("GISDBASE: " + gisdbase + "\n") output.write("LOCATION_NAME: " + location + "\n") output.write("MAPSET: PERMANENT \n") output.write("GRASS_GUI: text\n") output.close() output = open(script, "w") output.write("set HOME=" + os.path.expanduser("~") + "\n") output.write("set GISRC=" + gisrc + "\n") output.write("set GRASS_SH=" + shell + "\\bin\\sh.exe\n") output.write("set PATH=" + shell + os.sep + "bin;" + shell + os.sep + "lib;" + "%PATH%\n") output.write("set WINGISBASE=" + folder + "\n") output.write("set GISBASE=" + folder + "\n") output.write("set GRASS_PROJSHARE=" + folder + os.sep + "share" + os.sep + "proj" + "\n") output.write("set GRASS_MESSAGE_FORMAT=gui\n") #Replacement code for etc/Init.bat output.write( "if \"%GRASS_ADDON_PATH%\"==\"\" set PATH=%WINGISBASE%\\bin;%WINGISBASE%\\lib;%PATH%\n" ) output.write( "if not \"%GRASS_ADDON_PATH%\"==\"\" set PATH=%WINGISBASE%\\bin;%WINGISBASE%\\lib;%GRASS_ADDON_PATH%;%PATH%\n" ) output.write("\n") output.write("set GRASS_VERSION=" + GrassUtils.getGrassVersion() + "\n") output.write("if not \"%LANG%\"==\"\" goto langset\n") output.write( "FOR /F \"usebackq delims==\" %%i IN (`\"%WINGISBASE%\\etc\\winlocale\"`) DO @set LANG=%%i\n" ) output.write(":langset\n") output.write("\n") output.write("set PATHEXT=%PATHEXT%;.PY\n") output.write( "set PYTHONPATH=%PYTHONPATH%;%WINGISBASE%\\etc\\python;%WINGISBASE%\\etc\\wxpython\\n" ) output.write("\n") output.write("g.gisenv.exe set=\"MAPSET=PERMANENT\"\n") output.write("g.gisenv.exe set=\"LOCATION=" + location + "\"\n") output.write("g.gisenv.exe set=\"LOCATION_NAME=" + location + "\"\n") output.write("g.gisenv.exe set=\"GISDBASE=" + gisdbase + "\"\n") output.write("g.gisenv.exe set=\"GRASS_GUI=text\"\n") for command in commands: output.write(command + "\n") output.write("\n") output.write("exit\n") output.close()
def exportVectorLayer(layer): '''Takes a QgsVectorLayer and returns the filename to refer to it, which allows external apps which support only file-based layers to use it. It performs the necessary export in case the input layer is not in a standard format suitable for most applications, it is a remote one or db-based (non-file based) one, or if there is a selection and it should be used, exporting just the selected features. Currently, the output is restricted to shapefiles, so anything that is not in a shapefile will get exported''' settings = QSettings() systemEncoding = settings.value( "/UI/encoding", "System" ).toString() output = SextanteUtils.getTempFilename("shp") provider = layer.dataProvider() allAttrs = provider.attributeIndexes() provider.select( allAttrs ) useSelection = SextanteConfig.getSetting(SextanteConfig.USE_SELECTED) if useSelection and layer.selectedFeatureCount() != 0: writer = QgsVectorFileWriter( output, systemEncoding,provider.fields(), provider.geometryType(), provider.crs() ) selection = layer.selectedFeatures() for feat in selection: writer.addFeature(feat) del writer return output else: if (not unicode(layer.source()).endswith("shp")): writer = QgsVectorFileWriter( output, systemEncoding,provider.fields(), provider.geometryType(), provider.crs() ) feat = QgsFeature() while provider.nextFeature(feat): writer.addFeature(feat) del writer return output else: return unicode(layer.source())
def test_gdalogrsieveWithUnsupportedOutputFormat(self): outputs=sextante.runalg("gdalogr:sieve",raster(),2,0, SextanteUtils.getTempFilename("img")) output=outputs['dst_filename'] self.assertTrue(os.path.isfile(output)) dataset=gdal.Open(output, GA_ReadOnly) strhash=hash(str(dataset.ReadAsArray(0).tolist())) self.assertEqual(strhash,-1353696889)
def checkSagaIsInstalled(ignoreRegistrySettings=False): if SextanteUtils.isWindows(): path = SagaUtils.sagaPath() if path == "": return "SAGA folder is not configured.\nPlease configure it before running SAGA algorithms." cmdpath = os.path.join(path, "saga_cmd.exe") if not os.path.exists(cmdpath): return ( "The specified SAGA folder does not contain a valid SAGA executable.\n" + "Please, go to the SEXTANTE settings dialog, and check that the SAGA\n" + "folder is correctly configured") settings = QSettings() SAGA_INSTALLED = "/SextanteQGIS/SagaInstalled" if not ignoreRegistrySettings: if settings.contains(SAGA_INSTALLED): return try: from sextante import runalg result = runalg("saga:thiessenpolygons", points(), None) if not os.path.exists(result['POLYGONS']): return "It seems that SAGA is not correctly installed in your system.\nPlease install it before running SAGA algorithms." except: s = traceback.format_exc() return "Error while checking SAGA installation. SAGA might not be correctly configured.\n" + s settings.setValue(SAGA_INSTALLED, True)
def checkGrassIsInstalled(ignoreRegistrySettings=False): if SextanteUtils.isWindows(): path = GrassUtils.grassPath() if path == "": return "GRASS folder is not configured.\nPlease configure it before running SAGA algorithms." cmdpath = os.path.join(path, "bin","r.out.gdal.exe") if not os.path.exists(cmdpath): return ("The specified GRASS folder does not contain a valid set of GRASS modules.\n" + "Please, go to the SEXTANTE settings dialog, and check that the GRASS\n" + "folder is correctly configured") settings = QSettings() GRASS_INSTALLED = "/SextanteQGIS/GrassInstalled" if not ignoreRegistrySettings: if settings.contains(GRASS_INSTALLED): return try: from sextante import runalg result = runalg("grass:v.voronoi", points(),False,False,"270778.60198,270855.745301,4458921.97814,4458983.8488",-1,0.0001, 0, None) if not os.path.exists(result['output']): return "It seems that GRASS is not correctly installed and configured in your system.\nPlease install it before running GRASS algorithms." except: s = traceback.format_exc() return "Error while checking GRASS installation. GRASS might not be correctly configured.\n" + s; settings.setValue(GRASS_INSTALLED, True)
def modelsFolder(): folder = SextanteConfig.getSetting(ModelerUtils.MODELS_FOLDER) if folder == None: folder = unicode(os.path.join(SextanteUtils.userFolder(), "models")) mkdir(folder) return os.path.abspath(folder)
def exportTable(table): '''Takes a QgsVectorLayer and returns the filename to refer to its attributes table, which allows external apps which support only file-based layers to use it. It performs the necessary export in case the input layer is not in a standard format suitable for most applications, it isa remote one or db-based (non-file based) one Currently, the output is restricted to dbf. It also export to a new file if the original one contains non-ascii characters''' settings = QSettings() systemEncoding = settings.value("/UI/encoding", "System") output = SextanteUtils.getTempFilename("dbf") provider = table.dataProvider() isASCII = True try: unicode(table.source()).decode("ascii") except UnicodeEncodeError: isASCII = False isDbf = unicode(table.source()).endswith("dbf") or unicode( table.source()).endswith("shp") if (not isDbf or not isASCII): writer = QgsVectorFileWriter(output, systemEncoding, provider.fields(), QGis.WKBNoGeometry, layer.crs()) for feat in table.getFeatures(): writer.addFeature(feat) del writer return output else: filename = unicode(table.source()) if unicode(table.source()).endswith("shp"): return filename[:-3] + "dbf" else: return filename
def executeSaga(progress): if SextanteUtils.isWindows(): command = ["cmd.exe", "/C ", SagaUtils.sagaBatchJobFilename()] else: os.chmod(SagaUtils.sagaBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) command = [SagaUtils.sagaBatchJobFilename()] loglines = [] loglines.append("SAGA execution console output") proc = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, ).stdout for line in iter(proc.readline, ""): if "%" in line: s = "".join([x for x in line if x.isdigit()]) try: progress.setPercentage(int(s)) except: pass else: line = line.strip() if line != "/" and line != "-" and line != "\\" and line != "|": loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(SagaUtils.SAGA_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
def executeRAlgorithm(alg, progress): RUtils.verboseCommands = alg.getVerboseCommands() RUtils.createRScriptFromRCommands(alg.getFullSetOfRCommands()) if SextanteUtils.isWindows(): command = [ RUtils.RFolder() + os.sep + "bin" + os.sep + "R.exe", "CMD", "BATCH", "--vanilla", RUtils.getRScriptFilename(), RUtils.getConsoleOutputFilename() ] else: os.chmod(RUtils.getRScriptFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) command = "R CMD BATCH --vanilla " + RUtils.getRScriptFilename( ) + " " + RUtils.getConsoleOutputFilename() proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) proc.wait() RUtils.createConsoleOutput() loglines = [] loglines.append("R execution console output") loglines += RUtils.allConsoleResults for line in loglines: progress.setConsoleInfo(line) SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
def WpsDescriptionFolder(): folder = SextanteConfig.getSetting( WpsAlgorithmProvider.WPS_DESCRIPTIONS) if folder == None: folder = unicode(os.path.join(SextanteUtils.userFolder(), "wps")) mkdir(folder) return os.path.abspath(folder)
def exportTable( table): '''Takes a QgsVectorLayer and returns the filename to refer to its attributes table, which allows external apps which support only file-based layers to use it. It performs the necessary export in case the input layer is not in a standard format suitable for most applications, it isa remote one or db-based (non-file based) one Currently, the output is restricted to dbf. It also export to a new file if the original one contains non-ascii characters''' settings = QSettings() systemEncoding = settings.value( "/UI/encoding", "System" ) output = SextanteUtils.getTempFilename("dbf") provider = table.dataProvider() isASCII=True try: unicode(table.source()).decode("ascii") except UnicodeEncodeError: isASCII=False isDbf = unicode(table.source()).endswith("dbf") or unicode(table.source()).endswith("shp") if (not isDbf or not isASCII): writer = QgsVectorFileWriter( output, systemEncoding, provider.fields(), QGis.WKBNoGeometry, layer.crs() ) for feat in table.getFeatures(): writer.addFeature(feat) del writer return output else: filename = unicode(table.source()) if unicode(table.source()).endswith("shp"): return filename[:-3] + "dbf" else: return filename
def exportVectorLayer(layer): '''Takes a QgsVectorLayer and returns the filename to refer to it, which allows external apps which support only file-based layers to use it. It performs the necessary export in case the input layer is not in a standard format suitable for most applications, it is a remote one or db-based (non-file based) one, or if there is a selection and it should be used, exporting just the selected features. Currently, the output is restricted to shapefiles, so anything that is not in a shapefile will get exported. It also export to a new file if the original one contains non-ascii characters''' settings = QSettings() systemEncoding = settings.value( "/UI/encoding", "System" ).toString() output = SextanteUtils.getTempFilename("shp") provider = layer.dataProvider() useSelection = SextanteConfig.getSetting(SextanteConfig.USE_SELECTED) if useSelection and layer.selectedFeatureCount() != 0: writer = QgsVectorFileWriter(output, systemEncoding, layer.pendingFields(), provider.geometryType(), layer.crs()) selection = layer.selectedFeatures() for feat in selection: writer.addFeature(feat) del writer return output else: isASCII=True try: unicode(layer.source()).decode("ascii") except UnicodeEncodeError: isASCII=False if (not unicode(layer.source()).endswith("shp") or not isASCII): writer = QgsVectorFileWriter( output, systemEncoding, layer.pendingFields(), provider.geometryType(), layer.crs() ) for feat in layer.getFeatures(): writer.addFeature(feat) del writer return output else: return unicode(layer.source())
def test_gdalogrogr2ogrWrongExtension(self): outputs = sextante.runalg("gdalogr:ogr2ogr", union(), 3, "", SextanteUtils.getTempFilename("wrongext")) output = outputs['OUTPUT_LAYER'] layer = QGisLayers.getObjectFromUri(output, True) fields = layer.pendingFields() expectednames = [ 'id', 'poly_num_a', 'poly_st_a', 'id_2', 'poly_num_b', 'poly_st_b' ] expectedtypes = [ 'Integer', 'Real', 'String', 'Integer', 'Real', 'String' ] names = [str(f.name()) for f in fields] types = [str(f.typeName()) for f in fields] self.assertEqual(expectednames, names) self.assertEqual(expectedtypes, types) features = sextante.getfeatures(layer) self.assertEqual(8, len(features)) feature = features.next() attrs = feature.attributes() expectedvalues = ["1", "1.1", "string a", "2", "1", "string a"] values = [str(attr) for attr in attrs] self.assertEqual(expectedvalues, values) wkt = 'POLYGON((270807.08580285 4458940.1594565,270798.42294527 4458914.62661676,270780.81854858 4458914.21983449,270763.52289518 4458920.715993,270760.3449542 4458926.6570575,270763.78234766 4458958.22561242,270794.30290024 4458942.16424502,270807.08580285 4458940.1594565))' self.assertEqual(wkt, str(feature.geometry().exportToWkt()))
def executeSaga(progress): if SextanteUtils.isWindows(): command = ["cmd.exe", "/C ", SagaUtils.sagaBatchJobFilename()] else: os.chmod(SagaUtils.sagaBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) command = [SagaUtils.sagaBatchJobFilename()] loglines = [] loglines.append("SAGA execution console output") proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True).stdout for line in iter(proc.readline, ""): if "%" in line: s = "".join([x for x in line if x.isdigit()]) try: progress.setPercentage(int(s)) except: pass else: line = line.strip() if line != "/" and line != "-" and line != "\\" and line != "|": loglines.append(line) progress.setConsoleInfo(line) if SextanteConfig.getSetting(SagaUtils.SAGA_LOG_CONSOLE): SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)
def initializeSettings(self): AlgorithmProvider.initializeSettings(self) if SextanteUtils.isWindows(): SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_FOLDER, "SAGA folder", SagaUtils.sagaPath()) ) SextanteConfig.addSetting( Setting( self.getDescription(), SagaUtils.SAGA_AUTO_RESAMPLING, "Use min covering grid system for resampling", True, ) ) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_LOG_COMMANDS, "Log execution commands", False) ) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_LOG_CONSOLE, "Log console output", False) ) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_XMIN, "Resampling region min x", 0) ) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_YMIN, "Resampling region min y", 0) ) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_XMAX, "Resampling region max x", 1000) ) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_YMAX, "Resampling region max y", 1000) ) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_CELLSIZE, "Resampling region cellsize", 1) )
def scriptsFolder(): folder = SextanteConfig.getSetting(ScriptUtils.SCRIPTS_FOLDER) if folder == None: folder = SextanteUtils.userFolder() + os.sep + "scripts" mkdir(folder) return folder
def test_SagaVectorAlgorithWithUnsupportedInputAndOutputFormat(self): '''this tests both the exporting to shp and then the format change in the output layer''' layer = sextante.getobject(polygonsGeoJson()); feature = layer.getFeatures().next() selected = [feature.id()] layer.setSelectedFeatures(selected) outputs=sextante.runalg("saga:polygoncentroids",polygonsGeoJson(),True, SextanteUtils.getTempFilename("geojson")) layer.setSelectedFeatures([]) output=outputs['CENTROIDS'] layer=QGisLayers.getObjectFromUri(output, True) fields=layer.pendingFields() expectednames=['ID','POLY_NUM_A','POLY_ST_A'] expectedtypes=['Real','Real','String'] names=[str(f.name()) for f in fields] types=[str(f.typeName()) for f in fields] self.assertEqual(expectednames, names) self.assertEqual(expectedtypes, types) features=sextante.getfeatures(layer) self.assertEqual(1, len(features)) feature=features.next() attrs=feature.attributes() expectedvalues=["0","1.1","string a"] values=[str(attr.toString()) for attr in attrs] self.assertEqual(expectedvalues, values) wkt='POINT(270787.49991451 4458955.46775295)' self.assertEqual(wkt, str(feature.geometry().exportToWkt()))
def modelsFolder(): folder = SextanteConfig.getSetting(ModelerUtils.MODELS_FOLDER) if folder == None: folder = SextanteUtils.userFolder() + os.sep + "models" mkdir(folder) return folder
def initializeSettings(self): AlgorithmProvider.initializeSettings(self) if SextanteUtils.isWindows(): SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_FOLDER, "SAGA folder", SagaUtils.sagaPath())) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_AUTO_RESAMPLING, "Use min covering grid system for resampling", True)) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_LOG_COMMANDS, "Log execution commands", False)) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_LOG_CONSOLE, "Log console output", False)) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_XMIN, "Resampling region min x", 0)) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_YMIN, "Resampling region min y", 0)) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_XMAX, "Resampling region max x", 1000)) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_YMAX, "Resampling region max y", 1000)) SextanteConfig.addSetting( Setting(self.getDescription(), SagaUtils.SAGA_RESAMPLING_REGION_CELLSIZE, "Resampling region cellsize", 1))
def RScriptsFolder(): folder = SextanteConfig.getSetting(RUtils.RSCRIPTS_FOLDER) if folder == None: folder = unicode(os.path.join(SextanteUtils.userFolder(), "rscripts")) mkdir(folder) return os.path.abspath(folder)
def test_SagaVectorAlgorithWithUnsupportedInputAndOutputFormat(self): '''this tests both the exporting to shp and then the format change in the output layer''' layer = sextante.getobject(polygonsGeoJson()) feature = layer.getFeatures().next() selected = [feature.id()] layer.setSelectedFeatures(selected) outputs = sextante.runalg("saga:polygoncentroids", polygonsGeoJson(), True, SextanteUtils.getTempFilename("geojson")) layer.setSelectedFeatures([]) output = outputs['CENTROIDS'] layer = QGisLayers.getObjectFromUri(output, True) fields = layer.pendingFields() expectednames = ['ID', 'POLY_NUM_A', 'POLY_ST_A'] expectedtypes = ['Real', 'Real', 'String'] names = [str(f.name()) for f in fields] types = [str(f.typeName()) for f in fields] self.assertEqual(expectednames, names) self.assertEqual(expectedtypes, types) features = sextante.getfeatures(layer) self.assertEqual(1, len(features)) feature = features.next() attrs = feature.attributes() expectedvalues = ["0", "1.1", "string a"] values = [str(attr.toString()) for attr in attrs] self.assertEqual(expectedvalues, values) wkt = 'POINT(270787.49991451 4458955.46775295)' self.assertEqual(wkt, str(feature.geometry().exportToWkt()))
def checkGrassIsInstalled(ignoreRegistrySettings=False): if SextanteUtils.isWindows(): path = GrassUtils.grassPath() if path == "": return "GRASS folder is not configured.\nPlease configure it before running SAGA algorithms." cmdpath = os.path.join(path, "bin","r.out.gdal.exe") if not os.path.exists(cmdpath): return ("The specified GRASS folder does not contain a valid set of GRASS modules.\n" + "Please, go to the SEXTANTE settings dialog, and check that the GRASS\n" + "folder is correctly configured") settings = QSettings() GRASS_INSTALLED = "/SextanteQGIS/GrassInstalled" if not ignoreRegistrySettings: if settings.contains(GRASS_INSTALLED): return try: from sextante import runalg result = runalg("grass:v.voronoi", points(),False,False,"270778.60198,270855.745301,4458921.97814,4458983.8488",-1,0.0001,None) if not os.path.exists(result['output']): return "It seems that GRASS is not correctly installed and configured in your system.\nPlease install it before running GRASS algorithms." except: s = traceback.format_exc() return "Error while checking GRASS installation. GRASS might not be correctly configured.\n" + s; settings.setValue(GRASS_INSTALLED, True)
def checkSagaIsInstalled(ignoreRegistrySettings=False): if SextanteUtils.isWindows(): path = SagaUtils.sagaPath() if path == "": return "SAGA folder is not configured.\nPlease configure it before running SAGA algorithms." cmdpath = os.path.join(path, "saga_cmd.exe") if not os.path.exists(cmdpath): return ("The specified SAGA folder does not contain a valid SAGA executable.\n" + "Please, go to the SEXTANTE settings dialog, and check that the SAGA\n" + "folder is correctly configured") settings = QSettings() if not ignoreRegistrySettings: SAGA_INSTALLED = "/SextanteQGIS/SagaInstalled" if settings.contains(SAGA_INSTALLED): return try: from sextante.core.Sextante import runalg result = runalg("saga:thiessenpolygons", points(), None) if not os.path.exists(result['POLYGONS']): return "It seems that SAGA is not correctly installed in your system.\nPlease install it before running SAGA algorithms." except: s = traceback.format_exc() return "Error while checking SAGA installation. SAGA might not be correctly configured.\n" + s; settings.setValue(SAGA_INSTALLED, True)
def scriptsFolder(): folder = SextanteConfig.getSetting(ScriptUtils.SCRIPTS_FOLDER) if folder == None: #folder = os.path.join(os.path.dirname(__file__), "scripts") folder = SextanteUtils.userFolder() + os.sep + "scripts" mkdir(folder) return folder
def resampleRasterLayer(self, layer): '''this is supposed to be run after having exported all raster layers''' if layer in self.exportedLayers.keys(): inputFilename = self.exportedLayers[layer] else: inputFilename = layer destFilename = SextanteUtils.getTempFilename("sgrd") self.exportedLayers[layer] = destFilename if SextanteUtils.isWindows() or SextanteUtils.isMac(): s = "grid_tools \"Resampling\" -INPUT \"" + inputFilename + "\" -TARGET 0 -SCALE_UP_METHOD 4 -SCALE_DOWN_METHOD 4 -USER_XMIN " +\ str(self.xmin) + " -USER_XMAX " + str(self.xmax) + " -USER_YMIN " + str(self.ymin) + " -USER_YMAX " + str(self.ymax) +\ " -USER_SIZE " + str(self.cellsize) + " -USER_GRID \"" + destFilename + "\"" else: s = "libgrid_tools \"Resampling\" -INPUT \"" + inputFilename + "\" -TARGET 0 -SCALE_UP_METHOD 4 -SCALE_DOWN_METHOD 4 -USER_XMIN " +\ str(self.xmin) + " -USER_XMAX " + str(self.xmax) + " -USER_YMIN " + str(self.ymin) + " -USER_YMAX " + str(self.ymax) +\ " -USER_SIZE " + str(self.cellsize) + " -USER_GRID \"" + destFilename + "\"" return s
def resampleRasterLayer(self,layer): '''this is supposed to be run after having exported all raster layers''' if layer in self.exportedLayers.keys(): inputFilename = self.exportedLayers[layer] else: inputFilename = layer destFilename = SextanteUtils.getTempFilename("sgrd") self.exportedLayers[layer]= destFilename if SextanteUtils.isWindows(): s = "grid_tools \"Resampling\" -INPUT \"" + inputFilename + "\" -TARGET 0 -SCALE_UP_METHOD 4 -SCALE_DOWN_METHOD 4 -USER_XMIN " +\ str(self.xmin) + " -USER_XMAX " + str(self.xmax) + " -USER_YMIN " + str(self.ymin) + " -USER_YMAX " + str(self.ymax) +\ " -USER_SIZE " + str(self.cellsize) + " -USER_GRID \"" + destFilename + "\"" else: s = "libgrid_tools \"Resampling\" -INPUT \"" + inputFilename + "\" -TARGET 0 -SCALE_UP_METHOD 4 -SCALE_DOWN_METHOD 4 -USER_XMIN " +\ str(self.xmin) + " -USER_XMAX " + str(self.xmax) + " -USER_YMIN " + str(self.ymin) + " -USER_YMAX " + str(self.ymax) +\ " -USER_SIZE " + str(self.cellsize) + " -USER_GRID \"" + destFilename + "\"" return s
def getValueAsCommandLineParameter(self): if self.value == None: return str(None) else: if not SextanteUtils.isWindows(): return "\"" + unicode(self.value) + "\"" else: return "\"" + unicode(self.value).replace("\\", "\\\\") + "\""
def prepareGrassExecution(commands): if SextanteUtils.isWindows(): GrassUtils.createGrassScript(commands) command = ["cmd.exe", "/C ", GrassUtils.grassScriptFilename()] else: gisrc = SextanteUtils.userFolder() + os.sep + "sextante.gisrc" os.putenv("GISRC", gisrc) os.putenv("GRASS_MESSAGE_FORMAT", "gui") os.putenv("GRASS_BATCH_JOB", GrassUtils.grassBatchJobFilename()) GrassUtils.createGrassBatchJobFileFromGrassCommands(commands) os.chmod(GrassUtils.grassBatchJobFilename(), stat.S_IEXEC | stat.S_IREAD | stat.S_IWRITE) if SextanteUtils.isMac(): command = GrassUtils.grassPath() + os.sep + "grass.sh " + GrassUtils.grassMapsetFolder() + "/PERMANENT" else: command = "grass64 " + GrassUtils.grassMapsetFolder() + "/PERMANENT" return command
def createSagaBatchJobFileFromSagaCommands(commands): fout = open(SagaUtils.sagaBatchJobFilename(), "w") if SextanteUtils.isWindows(): fout.write("set SAGA=" + SagaUtils.sagaPath() + "\n"); fout.write("set SAGA_MLB=" + SagaUtils.sagaPath() + os.sep + "modules" + "\n"); fout.write("PATH=PATH;%SAGA%;%SAGA_MLB%\n"); elif SextanteUtils.isMac(): fout.write("export SAGA_MLB=" + SagaUtils.sagaPath() + "/../lib/saga\n"); fout.write("export PATH=" + SagaUtils.sagaPath() + ":$PATH\n"); else: pass for command in commands: fout.write("saga_cmd " + command.encode("utf8") + "\n") fout.write("exit") fout.close()
def getValueAsCommandLineParameter(self): if self.value == None: return str(None) else: if not SextanteUtils.isWindows(): return '"' + str(self.value) + '"' else: return '"' + str(self.value).replace("\\", "\\\\") + '"'