Ejemplo n.º 1
0
  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
Ejemplo n.º 2
0
  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()
Ejemplo n.º 3
0
  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))
Ejemplo n.º 4
0
  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))
Ejemplo n.º 5
0
  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()