2017-04-12 09:17:46 -05:00
# -*- coding: utf-8 -*-
"""
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
EquivalentNumField . 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 '
2019-11-17 12:33:50 +10:00
import warnings
2017-08-30 07:28:25 +10:00
from qgis . core import ( QgsProcessingParameterFeatureSource ,
QgsProcessingParameterField ,
QgsProcessingParameterFileDestination ,
2018-04-27 12:31:56 +10:00
QgsProcessingException )
2017-06-06 13:41:42 +10:00
from processing . algs . qgis . QgisAlgorithm import QgisAlgorithm
2017-04-12 09:17:46 -05:00
from processing . tools import vector
2019-11-18 13:19:25 +01:00
from qgis . PyQt . QtCore import QCoreApplication
2017-04-12 09:17:46 -05:00
2017-05-19 11:27:16 +10:00
class VectorLayerScatterplot3D ( QgisAlgorithm ) :
2017-04-12 09:17:46 -05:00
INPUT = ' INPUT '
OUTPUT = ' OUTPUT '
XFIELD = ' XFIELD '
YFIELD = ' YFIELD '
ZFIELD = ' ZFIELD '
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 ( QgsProcessingParameterFeatureSource ( self . INPUT ,
self . tr ( ' Input layer ' ) ) )
self . addParameter ( QgsProcessingParameterField ( self . XFIELD ,
self . tr ( ' X attribute ' ) ,
parentLayerParameterName = self . INPUT ,
type = QgsProcessingParameterField . Numeric ) )
self . addParameter ( QgsProcessingParameterField ( self . YFIELD ,
self . tr ( ' Y attribute ' ) ,
parentLayerParameterName = self . INPUT ,
type = QgsProcessingParameterField . Numeric ) )
self . addParameter ( QgsProcessingParameterField ( self . ZFIELD ,
self . tr ( ' Z attribute ' ) ,
parentLayerParameterName = self . INPUT ,
type = QgsProcessingParameterField . Numeric ) )
self . addParameter ( QgsProcessingParameterFileDestination ( self . OUTPUT , self . tr ( ' Histogram ' ) , self . tr ( ' HTML files (*.html) ' ) ) )
2017-04-12 09:17:46 -05:00
2017-05-15 13:40:38 +10:00
def name ( self ) :
return ' scatter3dplot '
def displayName ( self ) :
return self . tr ( ' Vector layer scatterplot 3D ' )
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 ( ' VectorLayerScatterplot3D ' , ' 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
source = self . parameterAsSource ( parameters , self . INPUT , context )
2018-04-27 12:31:56 +10:00
if source is None :
raise QgsProcessingException ( self . invalidSourceError ( parameters , self . INPUT ) )
2017-08-30 07:28:25 +10:00
xfieldname = self . parameterAsString ( parameters , self . XFIELD , context )
yfieldname = self . parameterAsString ( parameters , self . YFIELD , context )
zfieldname = self . parameterAsString ( parameters , self . ZFIELD , context )
2017-04-12 09:17:46 -05:00
2017-08-30 07:28:25 +10:00
output = self . parameterAsFileOutput ( parameters , self . OUTPUT , context )
2017-04-12 09:17:46 -05:00
2017-08-30 07:28:25 +10:00
values = vector . values ( source , xfieldname , yfieldname , zfieldname )
2017-04-12 09:17:46 -05:00
data = [ go . Scatter3d (
x = values [ xfieldname ] ,
y = values [ yfieldname ] ,
z = values [ zfieldname ] ,
mode = ' markers ' ) ]
plt . offline . plot ( data , filename = output , auto_open = False )
2017-08-30 07:28:25 +10:00
return { self . OUTPUT : output }