Newer
Older
# coding=utf-8
"""Tests QGIS plugin init."""
import os
import unittest
import example
from osgeo import gdal, ogr, osr
from eotimeseriesviewer.utils import file_search
from eotimeseriesviewer.tests import TestObjects
from eotimeseriesviewer.timeseries import *
from eotimeseriesviewer.tests import initQgisApplication
SHOW_GUI = True and os.environ.get('CI') is None
class TestInit(unittest.TestCase):
def createTestDatasets(self):
vsiDir = '/vsimem/tmp'
from eotimeseriesviewer.temporalprofiles2d import date2num
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
ns = 50
nl = 100
r1 = np.arange('2000-01-01', '2005-06-14', step=np.timedelta64(16, 'D'), dtype=np.datetime64)
r2 = np.arange('2000-01-01', '2005-06-14', step=np.timedelta64(8, 'D'), dtype=np.datetime64)
drv = gdal.GetDriverByName('ENVI')
crs = osr.SpatialReference()
crs.ImportFromEPSG(32633)
assert isinstance(drv, gdal.Driver)
datasets = []
for i, r in enumerate([r1, r2]):
p = '{}tmpstack{}.bsq'.format(vsiDir, i+1)
ds = drv.Create(p, ns, nl, len(r), eType=gdal.GDT_Float32)
assert isinstance(ds, gdal.Dataset)
ds.SetProjection(crs.ExportToWkt())
dateString = ','.join([str(d) for d in r])
dateString = '{{{}}}'.format(dateString)
ds.SetMetadataItem('wavelength', dateString, 'ENVI')
for b, date in enumerate(r):
decimalYear = date2num(date)
band = ds.GetRasterBand(b+1)
assert isinstance(band, gdal.Band)
band.Fill(decimalYear)
ds.FlushCache()
datasets.append(p)
return datasets
def createTimeSeries(self)->TimeSeries:
files = list(file_search(os.path.dirname(example.__file__), '*.tif', recursive=True))
TS = TimeSeries()
self.assertIsInstance(TS, TimeSeries)
TS.addSources(files)
self.assertTrue(len(TS) > 0)
return TS
configs = [(6, 30, 30, gdal.GDT_Byte, [1, 2, 3, 4, 5, 6], None),
(6, 10, 20, gdal.GDT_CFloat32, [1, 2, 3, 4, 5, 6], 'index'),
(6, 30, 30, gdal.GDT_UInt32, [1, 2, 3, 323, 23., 3.4], 'Micrometers'),
(6, 30, 30, gdal.GDT_Int32, None, None),
#nb:int, px_size_x:float, px_size_y:float, dt:int, wl:list, wlu:str
print(conf)
self.assertIsInstance(sensorID(*conf), str, msg='Unable to create sensorID from "{}"'.format(str(conf)))
def test_TimeSeriesTableModel(self):
TS = self.createTimeSeries()
TM = TimeSeriesTableModel(TS)
self.assertTrue(len(TS) > 0)
self.assertIsInstance(TM, TimeSeriesTableModel)
self.assertIsInstance(TM, QAbstractTableModel)
self.assertTrue(TM.rowCount(None) == len(TS))
tsd = TS[2]
idx = TM.getIndexFromDate(tsd)
self.assertIsInstance(idx, QModelIndex)
def test_timeseriesdatum(self):
file = example.Images.Img_2014_03_20_LC82270652014079LGN00_BOA
tss2 = TimeSeriesSource.create(example.Images.Img_2014_07_02_LE72270652014183CUB00_BOA)
sensor = SensorInstrument(tss.sid())
tsd = TimeSeriesDatum(None, tss.date(), sensor)
self.assertIsInstance(tsd, TimeSeriesDatum)
self.assertEqual(tsd.sensor(), sensor)
self.assertEqual(len(tsd), 0)
tsd.addSource(tss)
tsd.addSource(tss)

Benjamin Jakimow
committed
self.assertTrue(tsd.year() == 2014)
self.assertTrue(tsd.doy() == 79)
self.assertIsInstance(tsd.decimalYear(), float)
self.assertTrue(tsd.decimalYear() >= 2014 and tsd.decimalYear() < 2015)
self.assertIsInstance(tsd, QAbstractTableModel)
for r in range(len(tsd)):
for i in range(len(TimeSeriesDatum.ColumnNames)):
value = tsd.data(tsd.createIndex(r, i), role=Qt.DisplayRole)
TV = QTableView()
TV.setModel(tsd)
TV.show()
if SHOW_GUI:
QAPP.exec_()
def test_TimeSeriesSource(self):
wcs = r'dpiMode=7&identifier=BGS_EMODNET_CentralMed-MCol&url=http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?VERSION%3D1.1.0%26coverage%3DBGS_EMODNET_CentralMed-MCol'
p = r'Q:\Processing_BJ\01_Data\level2_overview\20180629_SEN2B_BOA.vrt'
if os.path.isfile(p):
tss = TimeSeriesSource.create(p)
self.assertIsInstance(tss, TimeSeriesSource)
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
if False:
webSources = [QgsRasterLayer(wcs, 'test', 'wcs')]
for src in webSources:
tss = TimeSeriesSource.create(src)
self.assertIsInstance(tss, TimeSeriesSource)
sources = [example.Images.Img_2014_03_20_LC82270652014079LGN00_BOA,
gdal.Open(example.Images.Img_2014_03_20_LC82270652014079LGN00_BOA),
QgsRasterLayer(example.Images.Img_2014_03_20_LC82270652014079LGN00_BOA)
]
ref = None
for src in sources:
tss = TimeSeriesSource.create(src)
self.assertIsInstance(tss.spatialExtent(), SpatialExtent)
self.assertIsInstance(tss, TimeSeriesSource)
if not isinstance(ref, TimeSeriesSource):
ref = tss
else:
self.assertTrue(ref == tss)
self.assertTrue(ref.sid() == tss.sid())
mdui = tss.qgsMimeDataUtilsUri()
self.assertIsInstance(mdui, QgsMimeDataUtils.Uri)
lyr, b = mdui.rasterLayer('')
self.assertTrue(b)
self.assertIsInstance(lyr, QgsRasterLayer)
self.assertTrue(lyr.isValid())

Benjamin Jakimow
committed
import pickle, json
dump = pickle.dumps(tss)
tss2 = pickle.loads(dump)
self.assertIsInstance(tss2, TimeSeriesSource)
self.assertEqual(tss, tss2)
json = tss.json()
self.assertIsInstance(json, str)
tss3 = TimeSeriesSource.fromJson(json)
self.assertIsInstance(tss3, TimeSeriesSource)
self.assertEqual(tss, tss3)

Benjamin Jakimow
committed
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
def test_datetimeprecision(self):
img1 = TestObjects.inMemoryImage()
img2 = TestObjects.inMemoryImage()
self.assertIsInstance(img1, gdal.Dataset)
self.assertIsInstance(img2, gdal.Dataset)
t0 = np.datetime64('now')
pairs = [('2018-12-23T14:40:48', '2018-12-23T14:40:47', DateTimePrecision.Minute),
('2018-12-23T14:40', '2018-12-23T14:39', DateTimePrecision.Hour),
('2018-12-23T14:40:48', '2018-12-23T14:40:47', DateTimePrecision.Day),
('2018-12-23', '2018-12-22', DateTimePrecision.Week),
('2018-12-23', '2018-12-01', DateTimePrecision.Month),
('2018-12-23', '2018-11-01', DateTimePrecision.Year),
]
for p in pairs:
t1, t2, precision = p
img1.SetMetadataItem('acquisition time', t1)
img2.SetMetadataItem('acquisition time', t2)
TS = TimeSeries()
self.assertIsInstance(TS, TimeSeries)
self.assertTrue(TS.mDateTimePrecision == DateTimePrecision.Original)
TS.addSources([img1, img2])
self.assertTrue(len(TS) == 2)
TS = TimeSeries()
TS.setDateTimePrecision(precision)
TS.addSources([img1, img2])
self.assertTrue(len(TS) == 1)
p1 = TestObjects.inMemoryImage()
p2 = TestObjects.inMemoryImage()
sources = [p1, p2]
for p in sources:
p.SetMetadataItem('acquisition_date', '2014-04-01')
s = ""
tssList = [TimeSeriesSource.create(p) for p in sources]
TS = TimeSeries()
self.assertTrue(len(TS) == 0)
TS.addSources(tssList)
self.assertTrue(len(TS) == 1)
tsd = TS[0]
self.assertIsInstance(tsd, TimeSeriesDatum)
self.assertTrue(len(tsd.sources()) == 2)
paths = TestObjects.createMultiSourceTimeSeries()
TS = TimeSeries()
TS.addSources(paths)
srcUris = TS.sourceUris()
self.assertTrue(len(srcUris) == len(paths))
self.assertTrue(len(TS) == 0.5 * len(paths))
self.assertTrue(len(TS) == 0.5 * len(srcUris))
def test_timeseries_loadasync(self):
files = list(file_search(os.path.dirname(example.__file__), '*.tif', recursive=True))
w = QgsTaskManagerWidget(QgsApplication.taskManager())
w.show()
TS = TimeSeries()
TS.addSourcesAsync(files, nWorkers=1)
while QgsApplication.taskManager().countActiveTasks() > 0 or len(TS.mTasks) > 0:
QCoreApplication.processEvents()
#self.assertTrue(len(TS) > 0)
#self.assertTrue(len(TS) == len(files))
if SHOW_GUI:
QAPP.exec_()
def test_timeseries(self):
files = list(file_search(os.path.dirname(example.__file__), '*.tif', recursive=True))
removedDates = []
addedSensors = []
removedSensors = []
sourcesChanged = []
TS = TimeSeries()
self.assertIsInstance(TS, TimeSeries)
self.assertIsInstance(TS, QAbstractItemModel)
TS.sigTimeSeriesDatesAdded.connect(lambda dates: addedDates.extend(dates))
TS.sigTimeSeriesDatesRemoved.connect(lambda dates: removedDates.extend(dates))
#TS.sigSourcesChanged.connect(lambda tsd: sourcesChanged.append(tsd))
TS.sigSensorAdded.connect(lambda sensor: addedSensors.append(sensor))
TS.sigSensorRemoved.connect(lambda sensor:removedSensors.append(sensor))
TS.addSources(files)
counts = dict()
self.assertIsInstance(tsd, TimeSeriesDatum)
sensor = tsd.sensor()
if sensor not in counts.keys():
counts[sensor] = 0
counts[sensor] = counts[sensor] + 1
self.assertEqual(len(files), len(TS))
self.assertTrue(len(TS) > 0)
self.assertEqual(TS.columnCount(), len(TS.mColumnNames))
self.assertEqual(TS.rowCount(), len(TS))
self.assertEqual(len(removedDates), 0)
self.assertTrue(len(addedSensors) == 2)
self.assertIsInstance(TS.maxSpatialExtent(), SpatialExtent)
sensor = TS.sensors()[0]
self.assertIsInstance(sensor, SensorInstrument)
self.assertTrue(sensor == TS.sensor(sensor.id()))
TS.removeSensor(sensor)
self.assertEqual(counts[sensor], len(removedDates))
extent = TS.maxSpatialExtent()
self.assertIsInstance(extent, SpatialExtent)
def test_sensors(self):
tss = TimeSeriesSource.create(example.Images.Img_2014_01_15_LC82270652014015LGN00_BOA)
self.assertIsInstance(tss, TimeSeriesSource)
sensor = SensorInstrument(tss.sid())
sensor2 = SensorInstrument(tss.sid())
self.assertIsInstance(sensor, SensorInstrument)
self.assertTrue(sensor == sensor2)
sensor2.setName('foobar')
self.assertTrue(sensor == sensor2)
self.assertIsInstance(sensor2.id(), str)
lyr = sensor.proxyLayer()
def test_datematching(self):
pass
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
def test_TimeSeriesTreeModel(self):
TS = TimeSeries()
TS.addSources(TestObjects.createMultiSourceTimeSeries())
self.assertTrue(len(TS) > 0)
self.assertIsInstance(TS, QAbstractItemModel)
self.assertEqual(len(TS), TS.rowCount())
M = QSortFilterProxyModel()
M.setSourceModel(TS)
TV = QTreeView()
TV.setSortingEnabled(True)
TV.setModel(M)
TV.show()
if SHOW_GUI:
QAPP.exec_()
def test_TimeSeriesDock(self):
TS = TimeSeries()
TS.addSources(TestObjects.createMultiSourceTimeSeries())
dock = TimeSeriesDockUI()
dock.setTimeSeries(TS)
dock.show()
if SHOW_GUI:
QAPP.exec_()
if __name__ == '__main__':
unittest.main()