Skip to content
Snippets Groups Projects
sandbox.py 10.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • from __future__ import absolute_import
    import six, sys, os, gc, re, collections, site, inspect
    
    logger = logging.getLogger(__name__)
    
    from osgeo import gdal, ogr
    from qgis import *
    from qgis.core import *
    from qgis.gui import *
    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    
    
    from timeseriesviewer.utils import *
    
    from timeseriesviewer import file_search
    from timeseriesviewer.timeseries import *
    
    class SandboxObjects(object):
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
        def TimeSeries(nMax=10):
            files = file_search(jp(DIR_EXAMPLES,'Images'),'*.bsq')
    
            from timeseriesviewer.timeseries import TimeSeries
            ts = TimeSeries()
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
            n = len(files)
            if nMax:
                nMax = min([n, nMax])
                ts.addFiles(files[0:nMax])
            else:
                ts.addFiles(files[:])
    
    def sandboxGui():
    
        from timeseriesviewer.main import TimeSeriesViewer
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        from timeseriesviewer import PATH_EXAMPLE_TIMESERIES
    
        S = TimeSeriesViewer(None)
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
        S.ui.show()
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
    
    
        S.spatialTemporalVis.MVC.createMapView()
        import example.Images
    
        #imgs = file_search(jp(DIR_EXAMPLES,'Images'),'*.bsq')
        searchDir = jp(DIR_EXAMPLES, 'Images')
    
        #searchDir = r'O:\SenseCarbonProcessing\BJ_NOC\01_RasterData\01_UncutVRT'
        #searchDir = r'O:\SenseCarbonProcessing\BJ_NOC\01_RasterData\02_CuttedVRT'
    
        imgs = file_search(searchDir, '*.bsq', recursive=True)[0:2]
    
    
        #imgs = [example.Images.Img_2014_07_10_LC82270652014191LGN00_BOA]
        S.addTimeSeriesImages(imgs)
    
    
    class QgisFake(QgisInterface):
    
        def __init__(self, *args):
            super(QgisFake, self).__init__(*args)
    
            self.canvas = QgsMapCanvas()
            self.canvas.blockSignals(False)
            print(self.canvas)
            self.canvas.setCrsTransformEnabled(True)
            self.canvas.setCanvasColor(Qt.black)
            self.canvas.extentsChanged.connect(self.testSlot)
            self.layerTreeView = QgsLayerTreeView()
            self.rootNode =QgsLayerTreeGroup()
            self.treeModel = QgsLayerTreeModel(self.rootNode)
            self.layerTreeView.setModel(self.treeModel)
            self.bridge = QgsLayerTreeMapCanvasBridge(self.rootNode, self.canvas)
            self.bridge.setAutoSetupOnFirstLayer(True)
            self.ui = QMainWindow()
            mainFrame = QFrame()
    
            self.ui.setCentralWidget(mainFrame)
            self.ui.setWindowTitle('Fake QGIS')
            l = QHBoxLayout()
            l.addWidget(self.layerTreeView)
            l.addWidget(self.canvas)
            mainFrame.setLayout(l)
            self.ui.setCentralWidget(mainFrame)
            self.lyrs = []
            self.createActions()
    
        def testSlot(self, *args):
            #print('--canvas changes--')
            s = ""
    
    
        def addVectorLayer(self, path, basename=None, providerkey=None):
            if basename is None:
                basename = os.path.basename(path)
            if providerkey is None:
                bn, ext = os.path.splitext(basename)
    
                providerkey = 'ogr'
            l = QgsVectorLayer(path, basename, providerkey)
            assert l.isValid()
            QgsMapLayerRegistry.instance().addMapLayer(l, True)
            self.rootNode.addLayer(l)
            self.bridge.setCanvasLayers()
            s = ""
    
    
        def legendInterface(self):
            QgsLegendInterface
    
        def addRasterLayer(self, path, baseName=''):
            l = QgsRasterLayer(path, loadDefaultStyleFlag=True)
            self.lyrs.append(l)
            QgsMapLayerRegistry.instance().addMapLayer(l, True)
            self.rootNode.addLayer(l)
            self.bridge.setCanvasLayers()
            return
    
            cnt = len(self.canvas.layers())
    
            self.canvas.setLayerSet([QgsMapCanvasLayer(l)])
            l.dataProvider()
            if cnt == 0:
                self.canvas.mapSettings().setDestinationCrs(l.crs())
                self.canvas.setExtent(l.extent())
                from timeseriesviewer.main import SpatialExtent
    
                spatialExtent = SpatialExtent.fromMapLayer(l)
                #self.canvas.blockSignals(True)
                self.canvas.setDestinationCrs(spatialExtent.crs())
                self.canvas.setExtent(spatialExtent)
                #self.blockSignals(False)
                self.canvas.refresh()
    
            self.canvas.refresh()
    
        def createActions(self):
            m = self.ui.menuBar().addAction('Add Vector')
            m = self.ui.menuBar().addAction('Add Raster')
    
        def mapCanvas(self):
            return self.canvas
    
    
    def sandboxQgisBridge():
    
        from timeseriesviewer.main import TimeSeriesViewer
        from timeseriesviewer import PATH_EXAMPLE_TIMESERIES
    
        fakeQGIS = QgisFake()
    
        import qgis.utils
        qgis.utils.iface = fakeQGIS
    
    
        S = TimeSeriesViewer(fakeQGIS)
        S.run()
    
        fakeQGIS.ui.show()
        import example.Images
    
        fakeQGIS.addVectorLayer(example.exampleEvents)
    
        fakeQGIS.addRasterLayer(example.Images.Img_2014_08_03_LE72270652014215CUB00_BOA)
    
        S.loadImageFiles([example.Images.Img_2014_01_15_LC82270652014015LGN00_BOA])
    
        S.ui.dockRendering.gbQgsVectorLayer.setChecked(True)
    
    
    def gdal_qgis_benchmark():
        """Benchmark to compare loading times between GDAL a QGIS"""
        import numpy as np
    
        def load_via_gdal(path):
            ds = gdal.Open(path)
            assert isinstance(ds, gdal.Dataset)
            nb = ds.RasterCount
            ns = ds.RasterXSize
            nl = ds.RasterYSize
            wkt = ds.GetProjectionRef()
            crs = QgsCoordinateReferenceSystem(wkt)
            return crs, nb, nl, ns
    
    
        def load_via_qgis(path):
            lyr = QgsRasterLayer(path)
            nb = lyr.bandCount()
            ns = lyr.width()
            nl = lyr.height()
            crs = lyr.crs()
            return crs, nb, nl, ns
    
        t0 = None
        dtime = lambda t0 : np.datetime64('now') - t0
    
        root = r'E:\_EnMAP\temp\temp_bj\landsat\37S\EB'
        files = file_search(root, '*_sr.tif', recursive=True)
        #files = files[0:10]
    
    
        print('Load {} images with gdal...'.format(len(files)))
        t0 = np.datetime64('now')
        results_gdal = [load_via_gdal(p) for p in files]
        dt_gdal = dtime(t0)
    
        print('Load {} images with qgis...'.format(len(files)))
        t0 = np.datetime64('now')
        results_qgis = [load_via_qgis(p) for p in files]
        dt_qgis = dtime(t0)
    
        print('gdal: {} qgis: {}'.format(str(dt_gdal), str(dt_qgis)))
        for t in zip(results_gdal, results_qgis):
            assert t[0] == t[1]
            assert t[0][0].authid() == t[1][0].authid()
        print('Benchmark done')
        s =""
    
    
    class SignalPrinter(object):
    
        def __init__(self,  objs=None):
    
    
            if objs:
                self.addObject(objs)
    
        def addObject(self, obj):
            import inspect
            if isinstance(obj, list):
                for o in obj:
                    self.addObject(o)
            elif isinstance(obj, QObject):
                t = QThread.currentThread()
                metaObject = obj.metaObject()
                for i in range(metaObject.methodCount()):
                    method = metaObject.method(i)
                    assert isinstance(method, QMetaMethod)
                    if method.methodType() == QMetaMethod.Signal:
                        sigName = str(method.signature()).split('(')[0]
                        sig = getattr(obj, sigName)
    
                        if obj not in self.signals:
                            self.signals[obj] = []
                        self.signals[obj].append(sig)
    
                for sig in self.signals[obj]:
                    sig.connect(lambda obj=obj, sig=sig, *args , **kwds : self.printSignal(obj, sig, *args, **kwds))
    
        def printSignal(self, o, sig, *args, **kwds):
            info = '{}'.format(sig.signal[1:])
    
            if len(args) > 0:
                info += ' {}'.format(str(args))
            if len(kwds) > 0:
                info += ' {}'.format(str(kwds))
            print(info)
    
    def initQgisEnvironment():
    
        from timeseriesviewer import DIR_SITE_PACKAGES
        site.addsitedir(DIR_SITE_PACKAGES)
    
        # prepare QGIS environment
    
        if sys.platform == 'darwin':
            PATH_QGS = r'/Applications/QGIS.app/Contents/MacOS'
    
            os.environ['GDAL_DATA'] = r'/Library/Frameworks/GDAL.framework/Versions/2.1/Resources/gdal'
    
            QApplication.addLibraryPath(r'/Applications/QGIS.app/Contents/PlugIns')
            QApplication.addLibraryPath(r'/Applications/QGIS.app/Contents/PlugIns/qgis')
    
        else:
            # assume OSGeo4W startup
            PATH_QGS = os.environ['QGIS_PREFIX_PATH']
        assert os.path.exists(PATH_QGS)
    
        qgsApp = QgsApplication([], True)
    
        gdal.SetConfigOption('VRT_SHARED_SOURCE', '0')  # !important. really. do not change this.
        #register resource files (all)
        import timeseriesviewer.ui
        dn = os.path.dirname(timeseriesviewer.ui.__file__)
        import timeseriesviewer.ui.qgis_icons_py2
    
    
    
    
        qgsApp.setPrefixPath(PATH_QGS, True)
        qgsApp.initQgis()
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
    def sandboxTestdata():
        from timeseriesviewer.main import TimeSeriesViewer
    
        from timeseriesviewer import PATH_EXAMPLE_TIMESERIES
        S = TimeSeriesViewer(None)
        S.ui.show()
        S.run()
    
        S.spatialTemporalVis.MVC.createMapView()
        import example.Images
        searchDir = jp(DIR_EXAMPLES, 'Images')
    
        imgs = file_search(searchDir, '*.bsq', recursive=True)#[0:1]  # [0:5]
    
    benjamin.jakimow@geo.hu-berlin.de's avatar
    benjamin.jakimow@geo.hu-berlin.de committed
    
        S.addTimeSeriesImages(imgs)
    
    def sandboxMultitemp2017(qgis=False):
    
        from timeseriesviewer.main import TimeSeriesViewer
    
        from timeseriesviewer import PATH_EXAMPLE_TIMESERIES
    
    
        iface = None
        if qgis:
            iface = QgisFake()
    
        S = TimeSeriesViewer(iface)
    
        S.ui.show()
        S.run()
    
        S.spatialTemporalVis.MVC.createMapView()
        import example.Images
    
    
        if True:
            searchDir = r'O:\SenseCarbonProcessing\BJ_Multitemp2017\01_Data\Landsat'
    
            imgs = file_search(searchDir, 'LC8*.vrt', recursive=True)#[0:5]
    
            S.addTimeSeriesImages(imgs)
    
        if True:
            searchDir = r'O:\SenseCarbonProcessing\BJ_Multitemp2017\01_Data\CBERS'
            imgs = file_search(searchDir, 'CBERS*.vrt', recursive=True)#[0:1]
            S.addTimeSeriesImages(imgs)
    
            searchDir = r'O:\SenseCarbonProcessing\BJ_Multitemp2017\01_Data\RapidEye'
            imgs = file_search(searchDir, 're*.vrt', recursive=True)#[0:1]
            S.addTimeSeriesImages(imgs)
    
    if __name__ == '__main__':
    
        import site, sys, pyqtgraph
    
        # add site-packages to sys.path as done by enmapboxplugin.py
    
        qgsApp = initQgisEnvironment()
    
        if False: gdal_qgis_benchmark()
    
        if True: sandboxQgisBridge()
    
        if False: sandboxGui()
    
        if False: sandboxTestdata()
    
    Benjamin Jakimow's avatar
    Benjamin Jakimow committed
        if False: sandboxMultitemp2017(qgis=True)
    
        #close QGIS
        qgsApp.exec_()
        qgsApp.exitQgis()