diff --git a/timeseriesviewer/main.py b/timeseriesviewer/main.py index b9b2e4b624fb7132b29e60769ab27487fb694d14..889ba61134201d94b7b8445fc5ce3a50066ccb99 100644 --- a/timeseriesviewer/main.py +++ b/timeseriesviewer/main.py @@ -48,24 +48,18 @@ from timeseriesviewer.utils import * from timeseriesviewer import jp, mkdir, DIR_SITE_PACKAGES, messageLog from timeseriesviewer.timeseries import * from timeseriesviewer.profilevisualization import SpectralTemporalVisualization +from timeseriesviewer.speclib.spectrallibraries import SpectralLibrary, createQgsField import numpy as np import pyqtgraph as pg DEBUG = False -from timeseriesviewer.speclib.spectrallibraries import createQgsField, createStandardFields -import timeseriesviewer.speclib.spectrallibraries - -fields = [f for f in createStandardFields()] -fields.insert(1, createQgsField('date', '')) -fields.insert(2, createQgsField('sensorname', '')) -standardFields = QgsFields() -for field in fields: - standardFields.append(field) -timeseriesviewer.speclib.spectrallibraries.createStandardFields = lambda: standardFields - -#ensure that required non-standard modules are available +EXTRA_SPECLIB_FIELDS = [ + QgsField('date', QVariant.String, 'varchar'), + QgsField('doy', QVariant.Int, 'int'), + QgsField('sensor', QVariant.String, 'varchar') +] class TimeSeriesViewerUI(QMainWindow, @@ -359,6 +353,13 @@ class TimeSeriesViewer(QgisInterface, QObject): self.ui.dockSpectralLibrary.SLW.sigLoadFromMapRequest.connect(self.ui.actionIdentifySpectralProfile.trigger) self.ui.dockSpectralLibrary.SLW.setMapInteraction(True) + #add time-specific fields + sl = self.spectralLibrary() + assert isinstance(sl, SpectralLibrary) + sl.startEditing() + for field in EXTRA_SPECLIB_FIELDS: + sl.addAttribute(field) + assert sl.commitChanges() self.mMapLayerStore.addMapLayer(self.ui.dockSpectralLibrary.speclib()) self.mMapLayerStore.addMapLayer(self.spectralTemporalVis.temporalProfileLayer()) @@ -372,6 +373,13 @@ class TimeSeriesViewer(QgisInterface, QObject): #reg.setDefaultActionForLayer(self.spectralTemporalVis.temporalProfileLayer(), moveToFeatureCenter) + def spectralLibrary(self)->SpectralLibrary: + """ + Returns the SpectraLibrary of the SpectralLibrary dock + :return: SpectraLibrary + """ + return self.ui.dockSpectralLibrary.SLW.speclib() + def mapCanvases(self)->list: """ @@ -449,17 +457,21 @@ class TimeSeriesViewer(QgisInterface, QObject): self.cntSpectralProfile = 0 profiles = SpectralProfile.fromMapCanvas(mapCanvas, spatialPoint) + #add metadata if isinstance(tsd, TimeSeriesDatum): + profiles2 = [] + sl = self.spectralLibrary() for p in profiles: + self.cntSpectralProfile += 1 assert isinstance(p, SpectralProfile) - p.setName('Profile {} {}'.format(self.cntSpectralProfile, tsd.date)) - p.setMetadata(u'date', u'{}'.format(tsd.date), addMissingFields=True) - p.setMetadata(u'sensorname', u'{}'.format(tsd.sensor.name()) , addMissingFields=True) - p.setMetadata(u'sensorid', u'{}'.format(tsd.sensor.id()), addMissingFields=True) - - self.cntSpectralProfile += 1 - self.ui.dockSpectralLibrary.SLW.setCurrentSpectra(profiles) + p2 = p.copyFieldSubset(fields=sl.fields()) + p2.setName('Profile {} {}'.format(self.cntSpectralProfile, tsd.date)) + p2.setAttribute('date', '{}'.format(tsd.date)) + p2.setAttribute('doy', int(tsd.doy)) + p2.setAttribute('sensor', tsd.sensor.name()) + profiles2.append(p2) + self.ui.dockSpectralLibrary.SLW.setCurrentSpectra(profiles2) elif mapToolKey == MapTools.CursorLocation: diff --git a/timeseriesviewer/speclib/envi.py b/timeseriesviewer/speclib/envi.py index a6fe463dc4fdb812073c4835271739be6795f8b1..e0c6172e08b79c10efa017a51ff6dd321636cf86 100644 --- a/timeseriesviewer/speclib/envi.py +++ b/timeseriesviewer/speclib/envi.py @@ -301,8 +301,7 @@ class EnviSpectralLibraryIO(AbstractSpectralLibraryIO): for csvField in CSV_FIELDS: assert isinstance(csvField, QgsField) - if csvField.name() not in speclibFields.names() and \ - csvField.name() not in CSV_PROFILE_NAME_COLUMN_NAMES: + if csvField.name() not in [speclibFields.names(), CSV_GEOMETRY_COLUMN] + CSV_PROFILE_NAME_COLUMN_NAMES: speclibFields.append(csvField) CSVLine2ESLProfile = {} @@ -332,14 +331,15 @@ class EnviSpectralLibraryIO(AbstractSpectralLibraryIO): if CSV_METADATA is not None: #find which column index from CSV table matches which QgsFeature attribute index - for csvField in CSV_FIELDS: + for fieldIndex, csvField in enumerate(CSV_FIELDS): assert isinstance(csvField, QgsField) fieldName = csvField.name() #is this a geometry field? + if fieldName == CSV_GEOMETRY_COLUMN: # copy CSV values to profile geometry attribute for iCSV, iProfile in CSVLine2ESLProfile.items(): - value = CSV_DATA[iCSV][aCSV] + value = CSV_DATA[iCSV][fieldIndex] if isinstance(value, str): g = QgsGeometry.fromWkt(value) if g.wkbType() == QgsWkbTypes.Point: