From 4a24852980cc6bd3aec3b544e10b2186a54757ab Mon Sep 17 00:00:00 2001 From: Fredrik Lindberg Date: Thu, 8 Feb 2018 13:37:51 +0100 Subject: [PATCH] 1.2 : LONG TERM RELEASE. Response on issue #26. Bugfix in SUEWS interfaces. --- .../image_morph_param_dialog_base.ui | 246 ++++---- .../landcoverfraction_grid_dialog_base.ui | 53 +- LucyQF/LQF_dialog_base.ui | 568 +++++++++--------- LucyQF/LQF_dialog_base_old.ui | 502 ++++++++++++++++ LucyQF/PythonLUCY/LUCYParams.py | 2 + SOLWEIG/WriteMetadataSOLWEIG.py | 123 ++++ SOLWEIG/solweig.py | 41 +- SUEWS/suews.py | 8 +- SUEWSAnalyzer/suews_analyzer.py | 3 +- SUEWSAnalyzer/suews_analyzer_dialog_base.ui | 30 +- SUEWSPrepare/suews_prepare.py | 2 +- SUEWSPrepare/tabs/main_tab.ui | 36 +- SkyViewFactorCalculator/Skyviewfactor4d.py | 326 +++++----- SkyViewFactorCalculator/svfvegworker.py | 6 +- SkyViewFactorCalculator/svfworker.py | 2 +- SuewsSimple/suews_simple.py | 12 +- SuewsSimple/suews_simple_dialog_base.ui | 9 +- UMEP_about.ui | 2 +- metadata.txt | 3 +- 19 files changed, 1309 insertions(+), 665 deletions(-) create mode 100644 LucyQF/LQF_dialog_base_old.ui create mode 100644 SOLWEIG/WriteMetadataSOLWEIG.py diff --git a/ImageMorphParam/image_morph_param_dialog_base.ui b/ImageMorphParam/image_morph_param_dialog_base.ui index b143244..0886e32 100644 --- a/ImageMorphParam/image_morph_param_dialog_base.ui +++ b/ImageMorphParam/image_morph_param_dialog_base.ui @@ -6,8 +6,8 @@ 0 0 - 644 - 453 + 584 + 473 @@ -26,7 +26,7 @@ QFrame::Sunken - + @@ -40,7 +40,7 @@ - + @@ -54,27 +54,7 @@ - - - - Vector polygon grid: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - ID field: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - + @@ -88,17 +68,7 @@ - - - - Raster DSM (3D objects + ground): - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - + @@ -112,17 +82,24 @@ - - - - Raster DEM (only ground): + + + + false - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 175 + 30 + + + Qt::LeftToRight + + - + false @@ -135,40 +112,53 @@ - - - - false + + + + Raster DEM (only ground): - - - 175 - 30 - + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - Qt::LeftToRight + + + + + + Raster DSM (3D objects + ground): + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - Tick this in if a 3D-object DSM without ground heights is available. 3D objects (e.g. buildings) should be metres above ground. + + + + ID field: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + - Raster DSM (only buildings or vegetation) exist + Vector polygon grid: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + - <html><head/><body><p>Tick this in if you would like to add the isotropic results to the attribute table for your polygon vector grid. </p></body></html> + Tick this in if a 3D-object DSM without ground heights is available. 3D objects (e.g. buildings) should be metres above ground. - Add result to polygon grid + Raster DSM (only buildings or vegetation) exist @@ -262,7 +252,33 @@ - + + + + 0 + + + Qt::AlignCenter + + + true + + + false + + + + + + + <html><head/><body><p>Tick this in if you would like to add the isotropic results to the attribute table for your polygon vector grid. </p></body></html> + + + Add result to polygon grid attribute table + + + + true @@ -272,24 +288,54 @@ - + Run - - + + + + true + - Output folder: + Close + + + + + + + Select + + + + + + + Tick this in if NoData pixels should be ignored and calculation of grid should be performed eventhough NoData pixels exists within that grid. Nodata pixels are set to the average pixel values of the DEM. + + + Ignore NoData pixels + + + + + + + + + + Roughness calculation method: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + Options to choose methods for roughness calculations regarding zero-plane displacement height (zd) and roughness length (z0) are available. @@ -326,69 +372,23 @@ - - + + - Roughness calculation method: + File prefix: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - true - - - Close - - - - + - - - - Tick this in if NoData pixels should be ignored and calculation of grid should be performed eventhough NoData pixels exists within that grid. Nodata pixels are set to the average pixel values of the DEM. - - - Ignore NoData pixels - - - - - - - Select - - - - - - - - - - 0 - - - Qt::AlignCenter - - - true - - - false - - - - - + + - File prefix: + Output folder: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter diff --git a/LandCoverFractionGrid/landcoverfraction_grid_dialog_base.ui b/LandCoverFractionGrid/landcoverfraction_grid_dialog_base.ui index 19f5e9a..62c258a 100644 --- a/LandCoverFractionGrid/landcoverfraction_grid_dialog_base.ui +++ b/LandCoverFractionGrid/landcoverfraction_grid_dialog_base.ui @@ -6,7 +6,7 @@ 0 0 - 548 + 515 430 @@ -182,16 +182,6 @@ - - - - <html><head/><body><p>Tick this in if you would like to add the isotropic results to the attribute table for your polygon vector grid.</p></body></html> - - - Add result to polygon grid - - - @@ -204,14 +194,14 @@ QFrame::Raised - + Run - + true @@ -221,24 +211,24 @@ - + Help - + Select - + - + 0 @@ -251,14 +241,20 @@ - - + + + + + + + <html><head/><body><p>Tick this in if you would like to add the isotropic results to the attribute table for your polygon vector grid.</p></body></html> + - Output folder: + Add result to polygon grid attribute table - + Qt::Horizontal @@ -271,7 +267,7 @@ - + Tick this in if NoData pixels should be ignored and calculation of grid should be performed eventhough NoData pixels exists within that grid. Nodata pixels are set to the average pixel values of the DEM. @@ -281,7 +277,7 @@ - + File prefix: @@ -291,8 +287,15 @@ - - + + + + Output folder: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + diff --git a/LucyQF/LQF_dialog_base.ui b/LucyQF/LQF_dialog_base.ui index 00af6c1..c72730c 100644 --- a/LucyQF/LQF_dialog_base.ui +++ b/LucyQF/LQF_dialog_base.ui @@ -6,114 +6,325 @@ 0 0 - 440 - 616 + 388 + 652 LQF - - - - - 10 - 75 - true - - + + + + + + Execute LQF + + + Run model + + + + + + + + + 0 + + + + + + + + + Load previously-generated LQF results + + + Load results + + + + + + + Basic plots for LQF outputs + + + Visualise... + + + + + + + Help + + + Help + + + + + + + Close window + + + Close + + + + + + + - LQF Anthropogenic Heat Flux model v0.55 + Note: QGIS will be unresponsive while model calculations are performed + + + Qt::AlignCenter + + + true - + Configuration and raw input data - + - - - - - Model parameters file - - - + + + Model parameters file + + + + + + + false + + + + + + + + + + Choose LQF model parameters (configuration) file + + + ... + + + + + + + Data sources file + + + + + + + false + + + + + + + + + + Choose LQF data sources file + + + ... + + + + + + + Output path + + + + + + + false + + + + + + + + + + Choose directory into which model outputs will be saved + + + ... + + + + + + + + + + Dates to model + + + + - - - false - + - + Start date - - - Choose LQF model parameters (configuration) file + + + + 2015 + 1 + 1 + - - ... + + + 23 + 59 + 59 + 3000 + 12 + 31 + - - - - - - Data sources file + + + 0 + 0 + 0 + 1900 + 1 + 1 + + + + QDateTimeEdit::YearSection + + + yyyy-MM-dd + + + true - - - false - + - + End date - - - Choose LQF data sources file + + + + 2015 + 1 + 2 + - - ... + + + 23 + 59 + 59 + 3000 + 12 + 31 + - - - - - - Output path + + + 0 + 0 + 0 + 1900 + 1 + 1 + + + + + 3000 + 12 + 31 + + + + + 1900 + 1 + 1 + + + + yyyy-MM-dd + + + true - - + + false - - + + Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) + + + Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) + + + Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) - - - - Choose directory into which model outputs will be saved + + + + Date list + + + + - ... + Date range + + + true @@ -122,7 +333,7 @@ - + Processed input data @@ -266,235 +477,6 @@ - - - - Dates to model - - - - - - - - Start date - - - - - - - - 2015 - 1 - 1 - - - - - 23 - 59 - 59 - 3000 - 12 - 31 - - - - - 0 - 0 - 0 - 1900 - 1 - 1 - - - - QDateTimeEdit::YearSection - - - yyyy-MM-dd - - - true - - - - - - - End date - - - - - - - - 2015 - 1 - 2 - - - - - 23 - 59 - 59 - 3000 - 12 - 31 - - - - - 0 - 0 - 0 - 1900 - 1 - 1 - - - - - 3000 - 12 - 31 - - - - - 1900 - 1 - 1 - - - - yyyy-MM-dd - - - true - - - - - - - false - - - Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) - - - Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) - - - Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) - - - - - - - Date list - - - - - - - Date range - - - true - - - - - - - - - - - - - - Execute LQF - - - Run model - - - - - - - - - 0 - - - - - - - - - Load previously-generated LQF results - - - Load results - - - - - - - Basic plots for LQF outputs - - - Visualise... - - - - - - - Help - - - Help - - - - - - - Close window - - - Close - - - - - - - - - Note: QGIS will be unresponsive while model calculations are performed - - - Qt::AlignCenter - - - true - - - diff --git a/LucyQF/LQF_dialog_base_old.ui b/LucyQF/LQF_dialog_base_old.ui new file mode 100644 index 0000000..00af6c1 --- /dev/null +++ b/LucyQF/LQF_dialog_base_old.ui @@ -0,0 +1,502 @@ + + + LQFDialogBase + + + + 0 + 0 + 440 + 616 + + + + LQF + + + + + + + 10 + 75 + true + + + + LQF Anthropogenic Heat Flux model v0.55 + + + + + + + Configuration and raw input data + + + + + + + + Model parameters file + + + + + + + false + + + + + + + + + + Choose LQF model parameters (configuration) file + + + ... + + + + + + + Data sources file + + + + + + + false + + + + + + + + + + Choose LQF data sources file + + + ... + + + + + + + Output path + + + + + + + false + + + + + + + + + + Choose directory into which model outputs will be saved + + + ... + + + + + + + + + + + + Processed input data + + + + + + Extra spatial disaggregation of input data (optional) + + + + + + Disaggregate further using land cover fractions. New resolution is the same as that of the land cover data. + + + Qt::AlignCenter + + + true + + + + + + + + + Corresponding polygon grid + + + + + + + false + + + + + + + + + + Choose polygon grid (ESRI shapefile) corresponding to land covers + + + ... + + + + + + + Choose land cover fractions file + + + ... + + + + + + + false + + + + + + + + + + Land cover fractions (from UMEP) + + + + + + + Field in the polygon grid file that contains a unique identifier for each area + + + + + + + Grid cell ID field + + + + + + + + + + + + + + Available at: + + + + + + + false + + + + + + + + + + Browse for processed input data that is already available + + + ... + + + + + + + + + Prepares the input data and any land cover fractions for use in LQF + + + Prepare input data using Data sources + + + + + + + + + + Dates to model + + + + + + + + Start date + + + + + + + + 2015 + 1 + 1 + + + + + 23 + 59 + 59 + 3000 + 12 + 31 + + + + + 0 + 0 + 0 + 1900 + 1 + 1 + + + + QDateTimeEdit::YearSection + + + yyyy-MM-dd + + + true + + + + + + + End date + + + + + + + + 2015 + 1 + 2 + + + + + 23 + 59 + 59 + 3000 + 12 + 31 + + + + + 0 + 0 + 0 + 1900 + 1 + 1 + + + + + 3000 + 12 + 31 + + + + + 1900 + 1 + 1 + + + + yyyy-MM-dd + + + true + + + + + + + false + + + Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) + + + Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) + + + Comma-separated list of dates (e.g. 2015-01-01, 2016-01-01) + + + + + + + Date list + + + + + + + Date range + + + true + + + + + + + + + + + + + + Execute LQF + + + Run model + + + + + + + + + 0 + + + + + + + + + Load previously-generated LQF results + + + Load results + + + + + + + Basic plots for LQF outputs + + + Visualise... + + + + + + + Help + + + Help + + + + + + + Close window + + + Close + + + + + + + + + Note: QGIS will be unresponsive while model calculations are performed + + + Qt::AlignCenter + + + true + + + + + + + + diff --git a/LucyQF/PythonLUCY/LUCYParams.py b/LucyQF/PythonLUCY/LUCYParams.py index 7b33046..09e2735 100644 --- a/LucyQF/PythonLUCY/LUCYParams.py +++ b/LucyQF/PythonLUCY/LUCYParams.py @@ -3,6 +3,8 @@ from datetime import datetime as dt from string import lower import string + + class LUCYParams: def __init__(self, file): ''' diff --git a/SOLWEIG/WriteMetadataSOLWEIG.py b/SOLWEIG/WriteMetadataSOLWEIG.py new file mode 100644 index 0000000..43976f4 --- /dev/null +++ b/SOLWEIG/WriteMetadataSOLWEIG.py @@ -0,0 +1,123 @@ +# This file prints out run information used for each specific run +from time import strftime +from osgeo import osr + + +def writeRunInfo(folderPath, filepath_dsm, gdal_dsm, usevegdem, filePath_cdsm, trunkfile, filePath_tdsm, lat, lon, UTC, + landcover, filePath_lc, metfileexist, filePath_metfile, metdata, plugin_dir, absK, absL, albedo_b, + albedo_g, ewall, eground, onlyglobal, trunkratio, trans, rows, cols, pos, elvis, cyl): + + with open(folderPath + '/RunInfoSOLWEIG.txt', 'w') as file: + file.write('This file provides run settings for the SOLWEIG run initiated at: ' + + strftime("%a, %d %b %Y %H:%M:%S")) + file.write('\n') + file.write('Version: ' + 'SOLWEIG v2015a') + file.write('\n') + file.write('\n') + file.write('SURFACE DATA') + file.write('\n') + file.write('Digital surface model (DSM): ' + filepath_dsm) + file.write('\n') + file.write('Model domain: rows = ' + str(rows) + ', columns = ' + str(cols)) + file.write('\n') + # get CRS + prj = gdal_dsm.GetProjection() + srs = osr.SpatialReference(wkt=prj) + if srs.IsProjected: + file.write('Projected referece system: ' + srs.GetAttrValue('projcs')) + file.write('\n') + file.write('Geographical coordinate system: ' + srs.GetAttrValue('geogcs')) + file.write('\n') + file.write('Latitude: ' + str(lat)) + file.write('\n') + file.write('Longitude: ' + str(lon)) + file.write('\n') + file.write('UTC: ' + str(UTC)) + file.write('\n') + if usevegdem == 1: + file.write('Transmissivity of light through vegetation: ' + str(trans)) + file.write('\n') + file.write('Digital vegetation canopy model (CDSM): ' + filePath_cdsm) + file.write('\n') + if trunkfile == 1: + file.write('Digital vegetation zrunk zone model (TDSM): ' + filePath_tdsm) + file.write('\n') + else: + file.write('Trunkzone estimated from CDSM') + file.write('\n') + file.write('Trunkzone as percent of canopy height: ' + str(trunkratio)) + file.write('\n') + else: + file.write('Vegetation scheme inactive') + file.write('\n') + if landcover == 1: + file.write('Landcover scheme active. Parameters taken from: ' + plugin_dir + "/landcoverclasses_2016a.txt") + file.write('\n') + file.write('Landcover grid: ' + filePath_lc) + file.write('\n') + else: + file.write('Landcover scheme inactive') + file.write('\n') + file.write('\n') + file.write('METEOROLOGICAL FORCING DATA') + file.write('\n') + if metfileexist == 1: + file.write('Meteorological file: ' + filePath_metfile) + file.write('\n') + if onlyglobal == 1: + file.write('Diffuse and direct shortwave radiation estimated from global radiation') + file.write('\n') + else: + file.write('Meteorological file not used') + file.write('Year: ' + str(metdata[0, 0])) + file.write('\n') + file.write('Day of Year: ' + str(metdata[0, 1])) + file.write('\n') + file.write('Hour: ' + str(metdata[0, 2])) + file.write('\n') + file.write('Minute: ' + str(metdata[0, 3])) + file.write('\n') + file.write('Ait temperature: ' + str(metdata[0, 11])) + file.write('\n') + file.write('Relative humidity: ' + str(metdata[0, 10])) + file.write('\n') + file.write('Global radiation: ' + str(metdata[0, 14])) + file.write('\n') + file.write('Diffuse radiation: ' + str(metdata[0, 21])) + file.write('\n') + file.write('Direct radiation: ' + str(metdata[0, 22])) + file.write('\n') + file.write('\n') + file.write('HUMAN EXPOSURE PARAMETERS') + file.write('\n') + file.write('Absorption, shortwave radiation: ' + str(absK)) + file.write('\n') + file.write('Absorption, longwave radiation: ' + str(absL)) + file.write('\n') + if pos == 0: + file.write('Posture of human body: Standing') + else: + file.write('Posture of human body: Sitting') + file.write('\n') + file.write('ENVIRONMENTAL PARAMETERS') + file.write('\n') + file.write('Albedo of walls: ' + str(albedo_b)) + file.write('\n') + file.write('Albedo of ground (not used if land cover scheme is active): ' + str(albedo_g)) + file.write('\n') + file.write('Emissivity (walls): ' + str(ewall)) + file.write('\n') + file.write('Emissivity of ground (not used if land cover scheme is active): ' + str(eground)) + file.write('\n') + file.write('\n') + file.write('ADDITIONAL SETTINGS') + file.write('\n') + if elvis == 1: + file.write('Sky emissivity adjusted according to Jonsson et al. (2005)') + file.write('\n') + if cyl == 1: + file.write('Human considered as a cylinder') + else: + file.write('Human considered as a standing cube') + file.write('\n') + file.close() diff --git a/SOLWEIG/solweig.py b/SOLWEIG/solweig.py index 767e7e4..5532711 100644 --- a/SOLWEIG/solweig.py +++ b/SOLWEIG/solweig.py @@ -35,6 +35,7 @@ import webbrowser from osgeo.gdalconst import * from solweigworker import Worker +import WriteMetadataSOLWEIG # from SOLWEIGpython import Solweig_v2015_metdata_noload as metload from ..Utilities.SEBESOLWEIGCommonFiles import Solweig_v2015_metdata_noload as metload @@ -150,6 +151,7 @@ def __init__(self, iface): self.folderPath = None self.folderPathSVF = None + self.folderPathMet = None self.usevegdem = 0 self.landcover = 0 self.vegdsm = None @@ -372,6 +374,8 @@ def start_progress(self): "Go home for the weekend or consider to tile your grid") # Vegetation DSMs # + trunkfile = 0 + trunkratio = 0 if self.dlg.checkBoxUseVeg.isChecked(): self.usevegdem = 1 self.trans = self.dlg.spinBoxTrans.value() / 100.0 @@ -385,8 +389,8 @@ def start_progress(self): # load raster gdal.AllRegister() provider = self.vegdsm.dataProvider() - filePathOld = str(provider.dataSourceUri()) - dataSet = gdal.Open(filePathOld) + filePath_cdsm = str(provider.dataSourceUri()) + dataSet = gdal.Open(filePath_cdsm) self.vegdsm = dataSet.ReadAsArray().astype(np.float) vegsizex = self.vegdsm.shape[0] @@ -407,10 +411,12 @@ def start_progress(self): # load raster gdal.AllRegister() provider = self.vegdsm2.dataProvider() - filePathOld = str(provider.dataSourceUri()) - dataSet = gdal.Open(filePathOld) + filePath_tdsm = str(provider.dataSourceUri()) + dataSet = gdal.Open(filePath_tdsm) self.vegdsm2 = dataSet.ReadAsArray().astype(np.float) + trunkfile = 1 else: + filePath_tdsm = None trunkratio = self.dlg.spinBoxTrunkHeight.value() / 100.0 self.vegdsm2 = self.vegdsm * trunkratio if self.dlg.checkBoxSaveTrunk.isChecked(): @@ -434,6 +440,8 @@ def start_progress(self): self.vegdsm = np.zeros([rows, cols]) self.vegdsm2 = np.zeros([rows, cols]) self.usevegdem = 0 + filePath_cdsm = None + filePath_tdsm = None # Land cover # if self.dlg.checkBoxLandCover.isChecked(): @@ -449,8 +457,8 @@ def start_progress(self): # load raster gdal.AllRegister() provider = self.lcgrid.dataProvider() - filePathOld = str(provider.dataSourceUri()) - dataSet = gdal.Open(filePathOld) + filePath_lc = str(provider.dataSourceUri()) + dataSet = gdal.Open(filePath_lc) self.lcgrid = dataSet.ReadAsArray().astype(np.float) lcsizex = self.lcgrid.shape[0] @@ -460,8 +468,8 @@ def start_progress(self): QMessageBox.critical(self.dlg, "Error in land cover grid", "All grids must be of same extent and resolution") return - #else: - # self.lcgrid = np.zeros([rows, cols]) + else: + filePath_lc = None # DEM # if not self.dlg.checkBoxDEM.isChecked(): @@ -610,7 +618,11 @@ def start_progress(self): Twater = [] if self.dlg.CheckBoxMetData.isChecked(): self.read_metdata() + metfileexist = 1 + PathMet = self.folderPathMet[0] else: + metfileexist = 0 + PathMet = None self.metdata = np.zeros((1, 24)) - 999. date = self.dlg.calendarWidget.selectedDate() @@ -862,6 +874,12 @@ def start_progress(self): #self.iface.messageBar().pushMessage("__len__", str(buildings.shape[0])) #self.iface.messageBar().pushMessage("__len__", str(self.lcgrid.shape[0])) + WriteMetadataSOLWEIG.writeRunInfo(self.folderPath[0], filepath_dsm, self.gdal_dsm, self.usevegdem, + filePath_cdsm, trunkfile, filePath_tdsm, lat, lon, UTC, self.landcover, + filePath_lc, metfileexist, PathMet, self.metdata, self.plugin_dir, + absK, absL, albedo_b, albedo_g, ewall, eground, onlyglobal, trunkratio, + self.trans, rows, cols, pos, elvis, cyl) + # If metfile starts at night CI = 1. # self.iface.messageBar().pushMessage("Ta", self.folderPath[0] + '/Tmrt_' + str(int(YYYY[0, i])) + '_' + str(int(DOY[0, i])) + '_' + str(int(hours[0, i])) + str(int(minu[0, i])) + '.tif') @@ -1050,12 +1068,15 @@ def workerFinished(self, ret): # rlayer.setCacheImage(None) # rlayer.triggerRepaint() - self.iface.messageBar().pushMessage("SOLWEIG", "Model calculations successful.") - # + QMessageBox.information(self.dlg,"SOLWEIG", "Model calculations successful!\r\n" + "Setting for this calculation is found in RunInfoSOLWEIG.txt located in " + "the output folder specified.") + self.dlg.runButton.setText('Run') self.dlg.runButton.clicked.disconnect() self.dlg.runButton.clicked.connect(self.start_progress) self.dlg.pushButtonClose.setEnabled(True) + self.dlg.progressBar.setValue(0) else: # notify the user that something went wrong self.iface.messageBar().pushMessage( diff --git a/SUEWS/suews.py b/SUEWS/suews.py index d5fc344..d6f3e0f 100644 --- a/SUEWS/suews.py +++ b/SUEWS/suews.py @@ -172,9 +172,9 @@ def run(self): "\r\n" "Do you want to contiune with the download?", QMessageBox.Ok | QMessageBox.Cancel) == QMessageBox.Ok: - testfile = urllib.URLopener() + # testfile = urllib.URLopener() if sys.platform == 'win32': - testfile.retrieve('http://www.urban-climate.net/umep/repo/nib/win/SUEWS_V2017b.exe', + urllib.urlretrieve('http://www.urban-climate.net/umep/repo/nib/win/SUEWS_V2017b.exe', self.model_dir + os.sep + 'SUEWS_V2017b.exe') # testfile2 = urllib.URLopener() # testfile2.retrieve('http://www.urban-climate.net/umep/repo/nib/win/cyggcc_s-seh-1.dll', @@ -189,10 +189,10 @@ def run(self): # testfile5.retrieve('http://www.urban-climate.net/umep/repo/nib/win/cygwin1.dll', # self.model_dir + os.sep + 'cygwin1.dll') if sys.platform == 'linux2': - testfile.retrieve('http://www.urban-climate.net/umep/repo/nib/linux/SUEWS_V2017b', + urllib.urlretrieve('http://www.urban-climate.net/umep/repo/nib/linux/SUEWS_V2017b', self.model_dir + os.sep + 'SUEWS_V2017b') if sys.platform == 'darwin': - testfile.retrieve('http://www.urban-climate.net/umep/repo/nib/mac/SUEWS_V2017b', + urllib.urlretrieve('http://www.urban-climate.net/umep/repo/nib/mac/SUEWS_V2017b', self.model_dir + os.sep + 'SUEWS_V2017b') else: diff --git a/SUEWSAnalyzer/suews_analyzer.py b/SUEWSAnalyzer/suews_analyzer.py index 2ea0e99..8272244 100644 --- a/SUEWSAnalyzer/suews_analyzer.py +++ b/SUEWSAnalyzer/suews_analyzer.py @@ -278,8 +278,7 @@ def get_runcontrol(self): f.close() self.idgrid = gridcodemetmat[1:, :] - dataunit = self.fileoutputpath + '/' + self.fileCode + '_YYYY_' + str( - self.resout) + '_OutputFormat.txt' + dataunit = self.fileoutputpath + '/' + self.fileCode + '_OutputFormat.txt' f = open(dataunit) lin = f.readlines() self.lineunit = lin[3].split(";") diff --git a/SUEWSAnalyzer/suews_analyzer_dialog_base.ui b/SUEWSAnalyzer/suews_analyzer_dialog_base.ui index 4cc7ba1..bb7d2f1 100644 --- a/SUEWSAnalyzer/suews_analyzer_dialog_base.ui +++ b/SUEWSAnalyzer/suews_analyzer_dialog_base.ui @@ -822,21 +822,6 @@ p, li { white-space: pre-wrap; } - - - - true - - - Select a listed variable to process. If no variable is available, then no data if found in the Model output folder - - - - Not Specified - - - - @@ -1049,6 +1034,21 @@ p, li { white-space: pre-wrap; } + + + + true + + + Select a listed variable to process. If no variable is available, then no data if found in the Model output folder + + + + Not Specified + + + + diff --git a/SUEWSPrepare/suews_prepare.py b/SUEWSPrepare/suews_prepare.py index b735bb0..3ab433d 100644 --- a/SUEWSPrepare/suews_prepare.py +++ b/SUEWSPrepare/suews_prepare.py @@ -701,7 +701,7 @@ def setup_maintab(self, widget): self.layerComboManagerPolygrid = QgsMapLayerComboBox(widget.widgetPolygonLayer) self.layerComboManagerPolygrid.setCurrentIndex(-1) self.layerComboManagerPolygrid.setFilters(QgsMapLayerProxyModel.PolygonLayer) - # self.layerComboManagerPolygrid.setFixedWidth(175) + self.layerComboManagerPolygrid.setFixedWidth(175) self.layerComboManagerPolyField = QgsFieldComboBox(widget.widgetPolyField) self.layerComboManagerPolyField.setFilters(QgsFieldProxyModel.Numeric) self.layerComboManagerPolygrid.layerChanged.connect(self.layerComboManagerPolyField.setLayer) diff --git a/SUEWSPrepare/tabs/main_tab.ui b/SUEWSPrepare/tabs/main_tab.ui index 2d22960..1b77957 100644 --- a/SUEWSPrepare/tabs/main_tab.ui +++ b/SUEWSPrepare/tabs/main_tab.ui @@ -6,7 +6,7 @@ 0 0 - 832 + 838 679 @@ -48,21 +48,17 @@ p, li { white-space: pre-wrap; } - - - - - 125 - 30 - + + + + ID field: - - Qt::LeftToRight + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + Vector polygon grid: @@ -72,14 +68,18 @@ p, li { white-space: pre-wrap; } - - - - ID field: + + + + + 125 + 30 + - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + Qt::LeftToRight + diff --git a/SkyViewFactorCalculator/Skyviewfactor4d.py b/SkyViewFactorCalculator/Skyviewfactor4d.py index 34159de..145f399 100644 --- a/SkyViewFactorCalculator/Skyviewfactor4d.py +++ b/SkyViewFactorCalculator/Skyviewfactor4d.py @@ -8,169 +8,169 @@ #from svf_calculator_dialog import SkyViewFactorCalculatorDialog #import svf_calculator -def Skyviewfactor4d(a, scale, dlg): - - #%This m.file calculates Skyview factors on a DEM for the four cardinal points - #%This new version is NOT using 1000 randow shadow casting, but implies - #%the theory of annulus weights (e.g. Steyn, 1980). The number of shadow - #%castings is reduced to 653. - #%20130208 - changed to use cell input - - dlg.progressBar.setRange(0, 655) - sizex = a.shape[0] - sizey = a.shape[1] - svf = np.zeros((sizex, sizey)) - svfE = svf - svfS = svf - svfW = svf - svfN = svf - noa = 19. - #% No. of angle steps minus 1 - step = 89./noa - iangle = np.array(np.hstack((np.arange(step/2., 89., step), 90.))) - annulino = np.array(np.hstack((np.round(np.arange(0., 89., step)), 90.))) - angleresult = svf_angles_100121() - aziinterval = angleresult["aziinterval"] - iazimuth = angleresult["iazimuth"] - aziintervalaniso = np.ceil((aziinterval/2.)) - index = 1. - - for i in np.arange(0, iangle.shape[0]-1): - for j in np.arange(0, (aziinterval[int(i)])): - altitude = iangle[int(i)] - azimuth = iazimuth[int(index)-1] - - dlg.progressBar.setValue(index) - sh = shadow.shadowingfunctionglobalradiation(a, azimuth, altitude, scale, dlg, 1) - for k in np.arange(annulino[int(i)]+1, (annulino[int(i+1.)])+1): - #% changed to include 90 - - weight = annulus_weight(k, aziinterval[i])*sh - svf = svf + weight - if azimuth >= 0 and azimuth < 180: - weight = annulus_weight(k, aziintervalaniso[i])*sh - svfE = svfE + weight - if azimuth >= 90 and azimuth < 270: - weight = annulus_weight(k, aziintervalaniso[i])*sh - svfS = svfS + weight - if azimuth >= 180 and azimuth < 360: - weight = annulus_weight(k, aziintervalaniso[i])*sh - svfW = svfW + weight - if azimuth >= 270 or azimuth < 90: - weight = annulus_weight(k, aziintervalaniso[i])*sh - svfN = svfN + weight - index += 1 - - svfS = svfS+3.0459e-004 - svfW = svfW+3.0459e-004 - #% Last azimuth is 90. Hence, manual add of last annuli for svfS and SVFW - #%Forcing svf not be greater than 1 (some MATLAB crazyness) - svf[(svf > 1.)] = 1. - svfE[(svfE > 1.)] = 1. - svfS[(svfS > 1.)] = 1. - svfW[(svfW > 1.)] = 1. - svfN[(svfN > 1.)] = 1. - - svfresult = {'svf': svf, 'svfE': svfE, 'svfS': svfS, 'svfW': svfW, 'svfN': svfN} - - return svfresult - - -def Skyviewfactor4d_veg(a, scale, vegdem, vegdem2, dlg): - - #%This m.file calculates Skyview factors on a VegetationDEM for the four cardinal points. - #%It also calculates separate SVFs for vegetation units shadowed by buildings - #%Created by Fredrik Lindberg 20080-30 - #%% Set up - dlg.progressBar.setRange(0, 655) - sizex = a.shape[0] - sizey = a.shape[1] - svfveg = np.zeros((sizex, sizey)) - svfEveg = svfveg - svfSveg = svfveg - svfWveg = svfveg - svfNveg = svfveg - svfaveg = svfveg - svfEaveg = svfveg - svfSaveg = svfveg - svfWaveg = svfveg - svfNaveg = svfveg - - #% amaxvalue - vegmax = vegdem.max() - amaxvalue = a.max() - amaxvalue = np.maximum(amaxvalue,vegmax) - - #% Elevation vegdems if buildingDEM inclused ground heights - vegdem = vegdem+a - vegdem[vegdem == a] = 0 - vegdem2 = vegdem2+a - vegdem2[vegdem2 == a] = 0 - #% Bush separation - bush = np.logical_not((vegdem2*vegdem))*vegdem - - noa = 19. - #% No. of anglesteps minus 1 - step = 89./noa - iangle = np.array(np.hstack((np.arange(step/2., 89., step), 90.))) - annulino = np.array(np.hstack((np.round(np.arange(0., 89., step)), 90.))) - angleresult = svf_angles_100121() - aziinterval = angleresult["aziinterval"] - iazimuth = angleresult["iazimuth"] - aziintervalaniso = np.ceil((aziinterval/2.)) - index = 1. - #%% Main core - for i in np.arange(0, iangle.shape[0]-1): - for j in np.arange(0, (aziinterval[int(i)])): - dlg.progressBar.setValue(index) - # print index - altitude = iangle[int(i)] - azimuth = iazimuth[int(index)-1] - shadowresult = shadow.shadowingfunction_20(a, vegdem, vegdem2, azimuth, altitude, scale, amaxvalue, bush, dlg, 1) - vegsh = shadowresult["vegsh"] - vbshvegsh = shadowresult["vbshvegsh"] - for k in np.arange(annulino[int(i)]+1, (annulino[int(i+1.)])+1): - #% changed to include 90 - weight = annulus_weight(k, aziinterval[i]) - svfveg = svfveg + weight * vegsh - svfaveg = svfaveg + weight * vbshvegsh - if azimuth >= 0 and azimuth < 180: - svfEveg = svfEveg + weight * vegsh - svfEaveg = svfEaveg + weight * vbshvegsh - if azimuth >= 90 and azimuth < 270: - svfSveg = svfSveg + weight * vegsh - svfSaveg = svfSaveg + weight * vbshvegsh - if azimuth >= 180 and azimuth < 360: - svfWveg = svfWveg + weight * vegsh - svfWaveg = svfWaveg + weight * vbshvegsh - if azimuth >= 270 or azimuth < 90: - svfNveg = svfNveg + weight * vegsh - svfNaveg = svfNaveg + weight * vbshvegsh - index += 1 - - #% Last azimuth is 90. Hence, manual add of last annuli for svfS and SVFW - last = np.zeros((sizex, sizey)) - last[(vegdem2 == 0.)] = 3.0459e-004 - svfSveg = svfSveg+last - svfWveg = svfWveg+last - svfSaveg = svfSaveg+last - svfWaveg = svfWaveg+last - #%Forcing svf not be greater than 1 (some MATLAB crazyness) - svfveg[(svfveg > 1.)] = 1. - svfEveg[(svfEveg > 1.)] = 1. - svfSveg[(svfSveg > 1.)] = 1. - svfWveg[(svfWveg > 1.)] = 1. - svfNveg[(svfNveg > 1.)] = 1. - svfaveg[(svfaveg > 1.)] = 1. - svfEaveg[(svfEaveg > 1.)] = 1. - svfSaveg[(svfSaveg > 1.)] = 1. - svfWaveg[(svfWaveg > 1.)] = 1. - svfNaveg[(svfNaveg > 1.)] = 1. - - svfvegresult = {'svfveg': svfveg, 'svfEveg': svfEveg, 'svfSveg': svfSveg, 'svfWveg': svfWveg, 'svfNveg': svfNveg, - 'svfaveg': svfaveg, 'svfEaveg': svfEaveg, 'svfSaveg': svfSaveg, 'svfWaveg': svfWaveg, 'svfNaveg': svfNaveg} - - return svfvegresult +# def Skyviewfactor4d(a, scale, dlg): +# +# #%This m.file calculates Skyview factors on a DEM for the four cardinal points +# #%This new version is NOT using 1000 randow shadow casting, but implies +# #%the theory of annulus weights (e.g. Steyn, 1980). The number of shadow +# #%castings is reduced to 653. +# #%20130208 - changed to use cell input +# +# dlg.progressBar.setRange(0, 655) +# sizex = a.shape[0] +# sizey = a.shape[1] +# svf = np.zeros((sizex, sizey)) +# svfE = svf +# svfS = svf +# svfW = svf +# svfN = svf +# noa = 19. +# #% No. of angle steps minus 1 +# step = 89./noa +# iangle = np.array(np.hstack((np.arange(step/2., 89., step), 90.))) +# annulino = np.array(np.hstack((np.round(np.arange(0., 89., step)), 90.))) +# angleresult = svf_angles_100121() +# aziinterval = angleresult["aziinterval"] +# iazimuth = angleresult["iazimuth"] +# aziintervalaniso = np.ceil((aziinterval/2.)) +# index = 1. +# +# for i in np.arange(0, iangle.shape[0]-1): +# for j in np.arange(0, (aziinterval[int(i)])): +# altitude = iangle[int(i)] +# azimuth = iazimuth[int(index)-1] +# +# dlg.progressBar.setValue(index) +# sh = shadow.shadowingfunctionglobalradiation(a, azimuth, altitude, scale, dlg, 1) +# for k in np.arange(annulino[int(i)]+1, (annulino[int(i+1.)])+1): +# #% changed to include 90 +# +# weight = annulus_weight(k, aziinterval[i])*sh +# svf = svf + weight +# if azimuth >= 0 and azimuth < 180: +# weight = annulus_weight(k, aziintervalaniso[i])*sh +# svfE = svfE + weight +# if azimuth >= 90 and azimuth < 270: +# weight = annulus_weight(k, aziintervalaniso[i])*sh +# svfS = svfS + weight +# if azimuth >= 180 and azimuth < 360: +# weight = annulus_weight(k, aziintervalaniso[i])*sh +# svfW = svfW + weight +# if azimuth >= 270 or azimuth < 90: +# weight = annulus_weight(k, aziintervalaniso[i])*sh +# svfN = svfN + weight +# index += 1 +# +# svfS = svfS+3.0459e-004 +# svfW = svfW+3.0459e-004 +# #% Last azimuth is 90. Hence, manual add of last annuli for svfS and SVFW +# #%Forcing svf not be greater than 1 (some MATLAB crazyness) +# svf[(svf > 1.)] = 1. +# svfE[(svfE > 1.)] = 1. +# svfS[(svfS > 1.)] = 1. +# svfW[(svfW > 1.)] = 1. +# svfN[(svfN > 1.)] = 1. +# +# svfresult = {'svf': svf, 'svfE': svfE, 'svfS': svfS, 'svfW': svfW, 'svfN': svfN} +# +# return svfresult +# +# +# def Skyviewfactor4d_veg(a, scale, vegdem, vegdem2, dlg): +# +# #%This m.file calculates Skyview factors on a VegetationDEM for the four cardinal points. +# #%It also calculates separate SVFs for vegetation units shadowed by buildings +# #%Created by Fredrik Lindberg 20080-30 +# #%% Set up +# dlg.progressBar.setRange(0, 655) +# sizex = a.shape[0] +# sizey = a.shape[1] +# svfveg = np.zeros((sizex, sizey)) +# svfEveg = svfveg +# svfSveg = svfveg +# svfWveg = svfveg +# svfNveg = svfveg +# svfaveg = svfveg +# svfEaveg = svfveg +# svfSaveg = svfveg +# svfWaveg = svfveg +# svfNaveg = svfveg +# +# #% amaxvalue +# vegmax = vegdem.max() +# amaxvalue = a.max() +# amaxvalue = np.maximum(amaxvalue,vegmax) +# +# #% Elevation vegdems if buildingDEM inclused ground heights +# vegdem = vegdem+a +# vegdem[vegdem == a] = 0 +# vegdem2 = vegdem2+a +# vegdem2[vegdem2 == a] = 0 +# #% Bush separation +# bush = np.logical_not((vegdem2*vegdem))*vegdem +# +# noa = 19. +# #% No. of anglesteps minus 1 +# step = 89./noa +# iangle = np.array(np.hstack((np.arange(step/2., 89., step), 90.))) +# annulino = np.array(np.hstack((np.round(np.arange(0., 89., step)), 90.))) +# angleresult = svf_angles_100121() +# aziinterval = angleresult["aziinterval"] +# iazimuth = angleresult["iazimuth"] +# aziintervalaniso = np.ceil((aziinterval/2.)) +# index = 1. +# #%% Main core +# for i in np.arange(0, iangle.shape[0]-1): +# for j in np.arange(0, (aziinterval[int(i)])): +# dlg.progressBar.setValue(index) +# # print index +# altitude = iangle[int(i)] +# azimuth = iazimuth[int(index)-1] +# shadowresult = shadow.shadowingfunction_20(a, vegdem, vegdem2, azimuth, altitude, scale, amaxvalue, bush, dlg, 1) +# vegsh = shadowresult["vegsh"] +# vbshvegsh = shadowresult["vbshvegsh"] +# for k in np.arange(annulino[int(i)]+1, (annulino[int(i+1.)])+1): +# #% changed to include 90 +# weight = annulus_weight(k, aziinterval[i]) +# svfveg = svfveg + weight * vegsh +# svfaveg = svfaveg + weight * vbshvegsh +# if azimuth >= 0 and azimuth < 180: +# svfEveg = svfEveg + weight * vegsh +# svfEaveg = svfEaveg + weight * vbshvegsh +# if azimuth >= 90 and azimuth < 270: +# svfSveg = svfSveg + weight * vegsh +# svfSaveg = svfSaveg + weight * vbshvegsh +# if azimuth >= 180 and azimuth < 360: +# svfWveg = svfWveg + weight * vegsh +# svfWaveg = svfWaveg + weight * vbshvegsh +# if azimuth >= 270 or azimuth < 90: +# svfNveg = svfNveg + weight * vegsh +# svfNaveg = svfNaveg + weight * vbshvegsh +# index += 1 +# +# #% Last azimuth is 90. Hence, manual add of last annuli for svfS and SVFW +# last = np.zeros((sizex, sizey)) +# last[(vegdem2 == 0.)] = 3.0459e-004 +# svfSveg = svfSveg+last +# svfWveg = svfWveg+last +# svfSaveg = svfSaveg+last +# svfWaveg = svfWaveg+last +# #%Forcing svf not be greater than 1 (some MATLAB crazyness) +# svfveg[(svfveg > 1.)] = 1. +# svfEveg[(svfEveg > 1.)] = 1. +# svfSveg[(svfSveg > 1.)] = 1. +# svfWveg[(svfWveg > 1.)] = 1. +# svfNveg[(svfNveg > 1.)] = 1. +# svfaveg[(svfaveg > 1.)] = 1. +# svfEaveg[(svfEaveg > 1.)] = 1. +# svfSaveg[(svfSaveg > 1.)] = 1. +# svfWaveg[(svfWaveg > 1.)] = 1. +# svfNaveg[(svfNaveg > 1.)] = 1. +# +# svfvegresult = {'svfveg': svfveg, 'svfEveg': svfEveg, 'svfSveg': svfSveg, 'svfWveg': svfWveg, 'svfNveg': svfNveg, +# 'svfaveg': svfaveg, 'svfEaveg': svfEaveg, 'svfSaveg': svfSaveg, 'svfWaveg': svfWaveg, 'svfNaveg': svfNaveg} +# +# return svfvegresult def svf_angles_100121(): diff --git a/SkyViewFactorCalculator/svfvegworker.py b/SkyViewFactorCalculator/svfvegworker.py index b95f5fa..ffb219f 100644 --- a/SkyViewFactorCalculator/svfvegworker.py +++ b/SkyViewFactorCalculator/svfvegworker.py @@ -3,10 +3,10 @@ import traceback import numpy as np from ..Utilities import shadowingfunctions as shadow -import Skyviewfactor4d as svf +#import Skyviewfactor4d as svf #import shadowingfunctions as shadow -from osgeo import gdal -from osgeo.gdalconst import * +#from osgeo import gdal +#from osgeo.gdalconst import * import sys import linecache diff --git a/SkyViewFactorCalculator/svfworker.py b/SkyViewFactorCalculator/svfworker.py index 50ab31e..6f86685 100644 --- a/SkyViewFactorCalculator/svfworker.py +++ b/SkyViewFactorCalculator/svfworker.py @@ -2,7 +2,7 @@ import traceback import numpy as np from ..Utilities import shadowingfunctions as shadow -import Skyviewfactor4d as svf +#import Skyviewfactor4d as svf #import shadowingfunctions as shadow #from osgeo import gdal #from osgeo.gdalconst import * diff --git a/SuewsSimple/suews_simple.py b/SuewsSimple/suews_simple.py index bdfd5fb..6fb8fa0 100644 --- a/SuewsSimple/suews_simple.py +++ b/SuewsSimple/suews_simple.py @@ -182,6 +182,7 @@ def unload(self): del self.toolbar def run(self): + # print self.model_dir if not (os.path.isfile(self.model_dir + os.sep + 'SUEWS_V2017b') or os.path.isfile(self.model_dir + os.sep + 'SUEWS_V2017b.exe')): # QMessageBox.information(self.iface.mainWindow(), if QMessageBox.question(self.iface.mainWindow(), "OS specific binaries missing", @@ -198,9 +199,12 @@ def run(self): "\r\n" "\r\n" "Do you want to contiune with the download?", QMessageBox.Ok | QMessageBox.Cancel) == QMessageBox.Ok: - testfile = urllib.URLopener() + # testfile = urllib.URLopener() if sys.platform == 'win32': - testfile.retrieve('http://www.urban-climate.net/umep/repo/nib/win/SUEWS_V2017b.exe', self.model_dir + os.sep + 'SUEWS_V2017b.exe') + # print self.model_dir + os.sep + 'SUEWS_V2017b.exe' + # testfile.retrieve('http://www.urban-climate.net/umep/repo/nib/win/SUEWS_V2017b.exe', self.model_dir + os.sep + 'SUEWS_V2017b.exe') + urllib.urlretrieve('http://www.urban-climate.net/umep/repo/nib/win/SUEWS_V2017b.exe', + self.model_dir + os.sep + 'SUEWS_V2017b.exe') # testfile2 = urllib.URLopener() # testfile2.retrieve('http://www.urban-climate.net/umep/repo/nib/win/cyggcc_s-seh-1.dll', self.model_dir + os.sep + 'cyggcc_s-seh-1.dll') # testfile3 = urllib.URLopener() @@ -210,9 +214,9 @@ def run(self): # testfile5 = urllib.URLopener() # testfile5.retrieve('http://www.urban-climate.net/umep/repo/nib/win/cygwin1.dll', self.model_dir + os.sep + 'cygwin1.dll') if sys.platform == 'linux2': - testfile.retrieve('http://www.urban-climate.net/umep/repo/nib/linux/SUEWS_V2017b', self.model_dir + os.sep + 'SUEWS_V2017b') + urllib.urlretrieve('http://www.urban-climate.net/umep/repo/nib/linux/SUEWS_V2017b', self.model_dir + os.sep + 'SUEWS_V2017b') if sys.platform == 'darwin': - testfile.retrieve('http://www.urban-climate.net/umep/repo/nib/mac/SUEWS_V2017b', self.model_dir + os.sep + 'SUEWS_V2017b') + urllib.urlretrieve('http://www.urban-climate.net/umep/repo/nib/mac/SUEWS_V2017b', self.model_dir + os.sep + 'SUEWS_V2017b') else: QMessageBox.critical(self.iface.mainWindow(), "Binaries not downloaded", "This plugin will not be able to start before binaries are downloaded") return diff --git a/SuewsSimple/suews_simple_dialog_base.ui b/SuewsSimple/suews_simple_dialog_base.ui index 2edb2ab..4657a4d 100644 --- a/SuewsSimple/suews_simple_dialog_base.ui +++ b/SuewsSimple/suews_simple_dialog_base.ui @@ -264,7 +264,14 @@ p, li { white-space: pre-wrap; } - + + + Full path length should not be longer than 100 characters. Also avoid special characters such as space, /, % etc. + + + + + diff --git a/UMEP_about.ui b/UMEP_about.ui index 21dd278..40d9369 100644 --- a/UMEP_about.ui +++ b/UMEP_about.ui @@ -31,7 +31,7 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">UMEP - Universal Multi-scale Environmental Predictor </span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Version: 1.1.1, 4 December 2017</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Version: 1.2, 8 February 2018</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">UMEP is a plugin designed for urban climate in general and climate sensitive planning applications in particular. The plugin consist of a pre-processor, a processor and a post-processor. This plugin is a collaboration between University of Gothenburg, University of Helsinki and University of Reading.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">UMEP plugin - License GNU GPL 2</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Authors - Fredrik Lindberg, Sue Grimmond, Leena Järvi, Helen Ward, Niklas Krave, Christoph William Kent, Andy Gabey, Shiho Onomura, Frans Olofson, Bei Huang, Ting Sun and Nils Wallenberg</span></p> diff --git a/metadata.txt b/metadata.txt index 99f4bf5..ceca709 100644 --- a/metadata.txt +++ b/metadata.txt @@ -11,7 +11,7 @@ name=UMEP qgisMinimumVersion=2.0 description=Urban Multi-scale Environmental Predictor -version=1.1.1 +version=1.2 author=Fredrik Lindberg - Sue Grimmond - Niklas Krave - Leena Jarvi - Helen Ward - Shiho Onomura - Christoph Kent - Andy Gabey - Frans Olofson - Ting Sun - Bei Huang - Nils Wallenberg email=fredrikl@gvc.gu.se @@ -26,6 +26,7 @@ repository=https://bitbucket.org/fredrik_ucg/umep # Uncomment the following line and add your changelog: changelog= + 1.2 : LONG TERM RELEASE. Response on issue #26. Bugfix in SUEWS interfaces. 1.1.1 : Bug fix in SUEWSPrepare. 1.1 : LONG TERM RELEASE. Improvements in the Metdataprocessor. 1.0.1 : Bug fix in Metdataprocessor to cope with hourly data and DSMGenerator to cope with non metric CRS.