2013-02-16 00:23:56 +01:00
# -*- coding: utf-8 -*-
"""
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
RasterLayerHistogram . py
- - - - - - - - - - - - - - - - - - - - -
Date : January 2013
Copyright : ( C ) 2013 by Victor Olaya
Email : volayaf at gmail dot com
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* This program is free software ; you can redistribute it and / or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation ; either version 2 of the License , or *
* ( at your option ) any later version . *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
"""
__author__ = ' Victor Olaya '
__date__ = ' January 2013 '
__copyright__ = ' (C) 2013, Victor Olaya '
2013-10-01 20:52:22 +03:00
2019-11-17 12:33:50 +10:00
import warnings
2015-01-17 14:57:21 +02:00
2017-08-30 07:28:25 +10:00
from qgis . core import ( QgsProcessingParameterRasterLayer ,
QgsProcessingParameterBand ,
QgsProcessingParameterNumber ,
2019-11-17 12:33:50 +10:00
QgsProcessingParameterFileDestination ,
QgsProcessingException )
2017-06-06 13:41:42 +10:00
from processing . algs . qgis . QgisAlgorithm import QgisAlgorithm
2017-05-02 14:47:58 +10:00
from processing . tools import raster
2013-02-16 00:23:56 +01:00
2019-11-18 13:19:25 +01:00
from qgis . PyQt . QtCore import QCoreApplication
2013-02-16 00:23:56 +01:00
2017-05-19 11:27:16 +10:00
class RasterLayerHistogram ( QgisAlgorithm ) :
2013-02-16 00:23:56 +01:00
2013-10-01 20:52:22 +03:00
INPUT = ' INPUT '
BINS = ' BINS '
2017-08-30 07:28:25 +10:00
OUTPUT = ' OUTPUT '
BAND = ' BAND '
2013-02-16 00:23:56 +01:00
2017-03-29 12:04:09 +10:00
def group ( self ) :
return self . tr ( ' Graphics ' )
2017-12-14 14:03:56 +02:00
def groupId ( self ) :
return ' graphics '
2017-05-15 13:40:38 +10:00
def __init__ ( self ) :
super ( ) . __init__ ( )
2017-07-10 16:31:14 +10:00
def initAlgorithm ( self , config = None ) :
2017-08-30 07:28:25 +10:00
self . addParameter ( QgsProcessingParameterRasterLayer ( self . INPUT ,
self . tr ( ' Input layer ' ) ) )
self . addParameter ( QgsProcessingParameterBand ( self . BAND ,
self . tr ( ' Band number ' ) ,
1 ,
self . INPUT ) )
self . addParameter ( QgsProcessingParameterNumber ( self . BINS ,
self . tr ( ' number of bins ' ) , minValue = 2 , defaultValue = 10 ) )
self . addParameter ( QgsProcessingParameterFileDestination ( self . OUTPUT , self . tr ( ' Histogram ' ) , self . tr ( ' HTML files (*.html) ' ) ) )
2015-01-17 14:57:21 +02:00
2017-05-15 13:40:38 +10:00
def name ( self ) :
return ' rasterlayerhistogram '
def displayName ( self ) :
return self . tr ( ' Raster layer histogram ' )
2017-05-15 16:19:46 +10:00
def processAlgorithm ( self , parameters , context , feedback ) :
2019-11-17 12:33:50 +10:00
try :
# importing plotly throws Python warnings from within the library - filter these out
with warnings . catch_warnings ( ) :
warnings . filterwarnings ( " ignore " , category = ResourceWarning )
warnings . filterwarnings ( " ignore " , category = ImportWarning )
import plotly as plt
import plotly . graph_objs as go
except ImportError :
2019-11-18 13:19:25 +01:00
raise QgsProcessingException ( QCoreApplication . translate ( ' RasterLayerHistogram ' , ' This algorithm requires the Python “plotly” library. Please install this library and try again. ' ) )
2019-11-17 12:33:50 +10:00
2017-08-30 07:28:25 +10:00
layer = self . parameterAsRasterLayer ( parameters , self . INPUT , context )
band = self . parameterAsInt ( parameters , self . BAND , context )
nbins = self . parameterAsInt ( parameters , self . BINS , context )
2015-01-17 14:57:21 +02:00
2017-08-30 07:28:25 +10:00
output = self . parameterAsFileOutput ( parameters , self . OUTPUT , context )
2015-01-17 14:57:21 +02:00
2017-02-15 10:47:08 +02:00
# ALERT: this is potentially blocking if the layer is too big
2017-08-30 07:28:25 +10:00
values = raster . scanraster ( layer , feedback , band )
2013-10-01 20:52:22 +03:00
2013-02-16 00:23:56 +01:00
valueslist = [ ]
for v in values :
if v is not None :
valueslist . append ( v )
2017-02-15 10:47:08 +02:00
data = [ go . Histogram ( x = valueslist ,
nbinsx = nbins ) ]
2017-02-15 20:05:17 +02:00
plt . offline . plot ( data , filename = output , auto_open = False )
2017-08-30 07:28:25 +10:00
return { self . OUTPUT : output }