def __getBins(self): bins = dict() n = 0 for k, v in self.inputs["factors"].iteritems(): lst = [] for b in xrange(v.getBandsCount()): lst.append(None) if v.isCountinues(b+1): if v.getBandsCount()>1: name = u"%s (band %s)" % (utils.getLayerById(k).name(), unicode(b+1)) else: name = u"%s" % (utils.getLayerById(k).name(), ) items = self.tblReclass.findItems(name, Qt.MatchExactly) idx = self.tblReclass.indexFromItem(items[0]) reclassList = self.tblReclass.item(idx.row(), 4).text() try: lst[b] = [int(j) for j in reclassList.split(" ")] except ValueError: QMessageBox.warning(self.plugin, self.tr("Wrong ranges"), self.tr("Ranges are not correctly specified. Please specify them and try again (use space as separator)") ) return {} bins[n] = lst n += 1 return bins
def manageGui(self): if not utils.checkFactors(self.inputs): QMessageBox.warning(self.plugin, self.tr("Missed input data"), self.tr("Factors rasters is not set. Please specify them and try again") ) return if not utils.checkChangeMap(self.inputs): QMessageBox.warning(self.plugin, self.tr("Missed input data"), self.tr("Change map raster is not set. Please create it try again") ) return self.tblReclass.clearContents() self.delegate = spinboxdelegate.SpinBoxDelegate(self.tblReclass.model(), minRange=2, maxRange=dataprovider.MAX_CATEGORIES) row = 0 for k, v in self.inputs["factors"].iteritems(): v.denormalize() # Denormalize the factor's bands if they are normalized for b in xrange(1, v.getBandsCount()+1): if v.isCountinues(b): self.tblReclass.insertRow(row) if v.getBandsCount()>1: name = u"%s (band %s)" % (utils.getLayerById(k).name(), unicode(b)) else: name = u"%s" % (utils.getLayerById(k).name(), ) stat = v.getBandStat(b) for n, item_data in enumerate([name, (u"%f" % (stat["min"], )), (u"%f" % (stat["max"])), u"" , u"" ]): item = QTableWidgetItem(item_data) if n < 3: item.setFlags(item.flags() ^ Qt.ItemIsEditable) self.tblReclass.setItem(row, n, item) row += 1 rowCount = row self.tblReclass.setItemDelegateForColumn(3, self.delegate) for row in range(rowCount): # Set 2 bins as default value self.tblReclass.setItem(row, 3, QTableWidgetItem(u'2')) self.tblReclass.resizeRowsToContents() self.tblReclass.resizeColumnsToContents()
def addFactor(self): layerName = self.lstLayers.selectedItems()[0].text() if len(self.lstFactors.findItems(layerName, Qt.MatchExactly)) > 0: return item = QListWidgetItem(self.lstLayers.selectedItems()[0]) layerId = unicode(item.data(Qt.UserRole).toString()) self.lstFactors.insertItem(self.lstFactors.count() + 1, item) if "factors" in self.inputs: self.inputs["factors"][layerId] = Raster(unicode(utils.getLayerById(layerId).source())) else: d = dict() d[layerId] = Raster(unicode(utils.getLayerById(layerId).source())) self.inputs["factors"] = d self.inputs["bandCount"] = self.__bandCount() self.__logMessage(self.tr("Added factor layer %1").arg(layerName))
def setFinalRaster(self): layerName = self.lstLayers.selectedItems()[0].text() self.finalRasterId = self.lstLayers.selectedItems()[0].data(Qt.UserRole) self.leFinalRasterName.setText(layerName) rx = QRegExp("(19|2\d)\d\d") pos = rx.indexIn(layerName) year = rx.cap() self.leFinalYear.setText(year) self.inputs["final"] = Raster(unicode(utils.getLayerById(self.finalRasterId).source())) self.__logMessage(self.tr("Set final layer to %1").arg(layerName))
def __prepareTable(self): bandCount = self.inputs["bandCount"] self.tblMatrix.clear() self.tblMatrix.setRowCount(bandCount) self.tblMatrix.setColumnCount(bandCount) self.tblWeights.clear() self.tblWeights.setRowCount(1) self.tblWeights.setColumnCount(bandCount) labels = [] for k, v in self.inputs["factors"].iteritems(): for b in xrange(v.getBandsCount()): if v.getBandsCount()>1: name = self.tr("%s (band %s)") % (utils.getLayerById(k).name(), unicode(b+1)) else: name = u"%s" % (utils.getLayerById(k).name(), ) labels.append(name) self.tblMatrix.setVerticalHeaderLabels(labels) self.tblMatrix.setHorizontalHeaderLabels(labels) self.tblWeights.setHorizontalHeaderLabels(labels) self.tblWeights.setVerticalHeaderLabels([self.tr("Weights")]) self.delegate = spinboxdelegate.SpinBoxDelegate(self.tblMatrix.model()) for row in xrange(bandCount): for col in xrange(bandCount): item = QTableWidgetItem() if row == col: item.setText("1") item.setFlags(item.flags() ^ Qt.ItemIsEditable) self.tblMatrix.setItem(row, col, item) self.tblMatrix.setItemDelegateForRow(row, self.delegate) self.tblMatrix.resizeRowsToContents() self.tblMatrix.resizeColumnsToContents() self.tblWeights.resizeRowsToContents()