Skip to content
Snippets Groups Projects
timeseries.py 69.2 KiB
Newer Older
  • Learn to ignore specific revisions
  •         if columnName == self.cnDate and role == Qt.CheckStateRole:
    
                TSD.setVisibility(value != Qt.Unchecked)
                return True
            else:
                return False
    
            return False
    
        def flags(self, index):
            if index.isValid():
    
                columnName = self.mColumnNames[index.column()]
    
                flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable
    
                if columnName == self.cnDate: # allow check state
    
                    flags = flags | Qt.ItemIsUserCheckable
    
                return flags
    
            return None
    
        def headerData(self, col, orientation, role):
            if Qt is None:
                return None
            if orientation == Qt.Horizontal and role == Qt.DisplayRole:
    
                return self.mColumnNames[col]
    
            elif orientation == Qt.Vertical and role == Qt.DisplayRole:
                return col
            return None
    
    def getSpatialPropertiesFromDataset(ds):
        assert isinstance(ds, gdal.Dataset)
    
        nb = ds.RasterCount
        nl = ds.RasterYSize
        ns = ds.RasterXSize
        proj = ds.GetGeoTransform()
        px_x = float(abs(proj[1]))
        px_y = float(abs(proj[5]))
    
        crs = QgsCoordinateReferenceSystem(ds.GetProjection())
    
        return nb, nl, ns, crs, px_x, px_y
    
    
    
    
    
    
    
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    def extractWavelengths(ds):
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        # see http://www.harrisgeospatial.com/docs/ENVIHeaderFiles.html for supported wavelength units
    
        regWLkey = re.compile('.*wavelength[_ ]*$', re.I)
        regWLUkey = re.compile('.*wavelength[_ ]*units?$', re.I)
        regNumeric = re.compile(r"([-+]?\d*\.\d+|[-+]?\d+)", re.I)
        regWLU = re.compile('((micro|nano|centi)meters)|(um|nm|mm|cm|m|GHz|MHz)', re.I)
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
        if isinstance(ds, QgsRasterLayer):
            lyr = ds
            md = [l.split('=') for l in str(lyr.metadata()).splitlines() if 'wavelength' in l.lower()]
            #see http://www.harrisgeospatial.com/docs/ENVIHeaderFiles.html for supported wavelength units
            for kv in md:
                key, value = kv
                key = key.lower()
                if key == 'center wavelength':
                    tmp = re.findall(r'\d*\.\d+|\d+', value) #find floats
                    if len(tmp) == 0:
                        tmp = re.findall(r'\d+', value) #find integers
                    if len(tmp) == lyr.bandCount():
                        wl = [float(w) for w in tmp]
    
                if key == 'wavelength units':
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
                        wlu = match.group()
    
                    names = ['nanometers','micrometers','millimeters','centimeters','decimenters']
                    si   = ['nm','um','mm','cm','dm']
    
                    if wlu in names:
                        wlu = si[names.index(wlu)]
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        elif isinstance(ds, gdal.Dataset):
    
            for domain in ds.GetMetadataDomainList():
                md = ds.GetMetadata_Dict(domain)
                for key, value in md.items():
                    if wl is None and regWLkey.search(key):
                        numbers = regNumeric.findall(value)
                        if len(numbers) == ds.RasterCount:
                            wl = [float(n) for n in numbers]
    
                    if wlu is None and regWLUkey.search(key):
                        match = regWLU.search(value)
                        if match:
                            wlu = match.group().lower()
                        names = ['nanometers', 'micrometers', 'millimeters', 'centimeters', 'decimeters']
                        si = ['nm', 'um', 'mm', 'cm', 'dm']
                        if wlu in names:
                            wlu = si[names.index(wlu)]
    
    
    class TimeSeriesDockUI(QgsDockWidget, loadUI('timeseriesdock.ui')):
        """
        QgsDockWidget that shows the TimeSeries
        """
        def __init__(self, parent=None):
            super(TimeSeriesDockUI, self).__init__(parent)
            self.setupUi(self)
    
            #self.progressBar.setMinimum(0)
            #self.setProgressInfo(0, 100, 'Add images to fill time series')
            #self.progressBar.setValue(0)
            #self.progressInfo.setText(None)
            self.frameFilters.setVisible(False)
    
            self.mTimeSeries = None
            self.mSelectionModel = None
    
    
        def initActions(self, parent):
    
            from eotimeseriesviewer.main import TimeSeriesViewerUI
            assert isinstance(parent, TimeSeriesViewerUI)
            self.btnAddTSD.setDefaultAction(parent.actionAddTSD)
            self.btnRemoveTSD.setDefaultAction(parent.actionRemoveTSD)
            self.btnLoadTS.setDefaultAction(parent.actionLoadTS)
            self.btnSaveTS.setDefaultAction(parent.actionSaveTS)
            self.btnClearTS.setDefaultAction(parent.actionClearTS)
    
    
        def showTSD(self, tsd:TimeSeriesDatum):
            assert isinstance(self.timeSeriesTreeView, TimeSeriesTreeView)
            assert isinstance(self.mTSProxyModel, QSortFilterProxyModel)
    
            tsd.setVisibility(True)
    
            assert isinstance(self.mTimeSeries, TimeSeries)
            idxSrc = self.mTimeSeries.tsdToIdx(tsd)
    
            if isinstance(idxSrc, QModelIndex):
                idx2 = self.mTSProxyModel.mapFromSource(idxSrc)
                if isinstance(idx2, QModelIndex):
                    self.timeSeriesTreeView.setCurrentIndex(idx2)
                    self.timeSeriesTreeView.scrollTo(idx2, QAbstractItemView.PositionAtCenter)
    
        def updateSummary(self):
    
    
            if isinstance(self.mTimeSeries, TimeSeries):
                if len(self.mTimeSeries) == 0:
                    info = 'Empty Timeseries. Please add source images.'
                else:
                    nDates = self.mTimeSeries.rowCount()
                    nSensors = len(self.mTimeSeries.sensors())
                    nImages = len(list(self.mTimeSeries.sources()))
    
                    info = '{} dates, {} sensors, {} source images'.format(nDates, nSensors, nImages)
            else:
                info = ''
            self.summary.setText(info)
    
        def onSelectionChanged(self, *args):
            """
            Slot to react on user-driven changes of the selected TimeSeriesDatum rows.
            """
    
            self.btnRemoveTSD.setEnabled(
                isinstance(self.mSelectionModel, QItemSelectionModel) and
                len(self.mSelectionModel.selectedRows()) > 0)
    
        def selectedTimeSeriesDates(self)->list:
            """
            Returns the TimeSeriesDatum selected by a user.
            :return: [list-of-TimeSeriesDatum]
            """
            if isinstance(self.mSelectionModel, QItemSelectionModel):
                return [self.mTSProxyModel.data(idx, Qt.UserRole) for idx in self.mSelectionModel.selectedRows()]
            return []
    
        def setTimeSeries(self, TS:TimeSeries):
            """
            Sets the TimeSeries to be shown in the TimeSeriesDockUI
            :param TS: TimeSeries
            """
            from eotimeseriesviewer.timeseries import TimeSeries
            if isinstance(TS, TimeSeries):
                self.mTimeSeries = TS
                self.mTSProxyModel = QSortFilterProxyModel(self)
                self.mTSProxyModel.setSourceModel(self.mTimeSeries)
                self.mSelectionModel = QItemSelectionModel(self.mTSProxyModel)
                self.mSelectionModel.selectionChanged.connect(self.onSelectionChanged)
    
    
                self.timeSeriesTreeView.setModel(self.mTSProxyModel)
                self.timeSeriesTreeView.setSelectionModel(self.mSelectionModel)
    
                for c in range(self.mTSProxyModel.columnCount()):
                    self.timeSeriesTreeView.header().setSectionResizeMode(c, QHeaderView.ResizeToContents)
                self.mTimeSeries.rowsInserted.connect(self.updateSummary)
                #self.mTimeSeries.dataChanged.connect(self.updateSummary)
                self.mTimeSeries.rowsRemoved.connect(self.updateSummary)
                #TS.sigLoadingProgress.connect(self.setProgressInfo)
    
            self.onSelectionChanged()
    
    
    
    
    
    
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    if __name__ == '__main__':
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
        print(convertMetricUnit(100, 'cm', 'm'))
        print(convertMetricUnit(1, 'm', 'um'))