Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- """
- /***************************************************************************
- AverageRaster
- A QGIS plugin
- This plugin calculates the average of a raster as active layer
- -------------------
- begin : 2015-08-15
- git sha : $Format:%H$
- copyright : (C) 2015 by Jose Guerrero
- email : joseguerreroa@gmail.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. *
- * *
- ***************************************************************************/
- """
- from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication
- from PyQt4.QtGui import QAction, QIcon, QMessageBox
- from qgis.gui import QgsMessageBar
- # Initialize Qt resources from file resources.py
- import resources_rc
- # Import the code for the dialog
- from average_raster_dialog import AverageRasterDialog
- import os.path
- from osgeo import gdal
- import struct
- class AverageRaster:
- """QGIS Plugin Implementation."""
- def __init__(self, iface):
- """Constructor.
- :param iface: An interface instance that will be passed to this class
- which provides the hook by which you can manipulate the QGIS
- application at run time.
- :type iface: QgsInterface
- """
- # Save reference to the QGIS interface
- self.iface = iface
- # initialize plugin directory
- self.plugin_dir = os.path.dirname(__file__)
- # initialize locale
- locale = QSettings().value('locale/userLocale')[0:2]
- locale_path = os.path.join(
- self.plugin_dir,
- 'i18n',
- 'AverageRaster_{}.qm'.format(locale))
- if os.path.exists(locale_path):
- self.translator = QTranslator()
- self.translator.load(locale_path)
- if qVersion() > '4.3.3':
- QCoreApplication.installTranslator(self.translator)
- # Create the dialog (after translation) and keep reference
- self.dlg = AverageRasterDialog()
- # Declare instance attributes
- self.actions = []
- self.menu = self.tr(u'&Average Raster')
- # TODO: We are going to let the user set this up in a future iteration
- self.toolbar = self.iface.addToolBar(u'AverageRaster')
- self.toolbar.setObjectName(u'AverageRaster')
- # noinspection PyMethodMayBeStatic
- def tr(self, message):
- """Get the translation for a string using Qt translation API.
- We implement this ourselves since we do not inherit QObject.
- :param message: String for translation.
- :type message: str, QString
- :returns: Translated version of message.
- :rtype: QString
- """
- # noinspection PyTypeChecker,PyArgumentList,PyCallByClass
- return QCoreApplication.translate('AverageRaster', message)
- def add_action(
- self,
- icon_path,
- text,
- callback,
- enabled_flag=True,
- add_to_menu=True,
- add_to_toolbar=True,
- status_tip=None,
- whats_this=None,
- parent=None):
- """Add a toolbar icon to the toolbar.
- :param icon_path: Path to the icon for this action. Can be a resource
- path (e.g. ':/plugins/foo/bar.png') or a normal file system path.
- :type icon_path: str
- :param text: Text that should be shown in menu items for this action.
- :type text: str
- :param callback: Function to be called when the action is triggered.
- :type callback: function
- :param enabled_flag: A flag indicating if the action should be enabled
- by default. Defaults to True.
- :type enabled_flag: bool
- :param add_to_menu: Flag indicating whether the action should also
- be added to the menu. Defaults to True.
- :type add_to_menu: bool
- :param add_to_toolbar: Flag indicating whether the action should also
- be added to the toolbar. Defaults to True.
- :type add_to_toolbar: bool
- :param status_tip: Optional text to show in a popup when mouse pointer
- hovers over the action.
- :type status_tip: str
- :param parent: Parent widget for the new action. Defaults None.
- :type parent: QWidget
- :param whats_this: Optional text to show in the status bar when the
- mouse pointer hovers over the action.
- :returns: The action that was created. Note that the action is also
- added to self.actions list.
- :rtype: QAction
- """
- icon = QIcon(icon_path)
- action = QAction(icon, text, parent)
- action.triggered.connect(callback)
- action.setEnabled(enabled_flag)
- if status_tip is not None:
- action.setStatusTip(status_tip)
- if whats_this is not None:
- action.setWhatsThis(whats_this)
- if add_to_toolbar:
- self.toolbar.addAction(action)
- if add_to_menu:
- self.iface.addPluginToMenu(
- self.menu,
- action)
- self.actions.append(action)
- return action
- def initGui(self):
- """Create the menu entries and toolbar icons inside the QGIS GUI."""
- icon_path = ':/plugins/AverageRaster/AverageRaster.png'
- self.add_action(
- icon_path,
- text=self.tr(u'To calculate raster average'),
- callback=self.run,
- parent=self.iface.mainWindow())
- def unload(self):
- """Removes the plugin menu item and icon from QGIS GUI."""
- for action in self.actions:
- self.iface.removePluginMenu(
- self.tr(u'&Average Raster'),
- action)
- self.iface.removeToolBarIcon(action)
- # remove the toolbar
- del self.toolbar
- def run(self):
- """Run method that performs all the real work"""
- #My code starts here
- layer = self.iface.activeLayer()
- if layer is not None:
- provider = layer.dataProvider()
- fmttypes = {'Byte':'B', 'UInt16':'H', 'Int16':'h', 'UInt32':'I', 'Int32':'i', 'Float32':'f', 'Float64':'d'}
- path= provider.dataSourceUri()
- (raiz, filename) = os.path.split(path)
- dataset = gdal.Open(path)
- band = dataset.GetRasterBand(1)
- totHeight = 0
- BandType = gdal.GetDataTypeName(band.DataType)
- for y in range(band.YSize):
- scanline = band.ReadRaster(0, y, band.XSize, 1, band.XSize, 1, band.DataType)
- values = struct.unpack(fmttypes[BandType] * band.XSize, scanline)
- for value in values:
- totHeight += value
- average = totHeight / float((band.XSize * band.YSize))
- else:
- self.iface.messageBar().pushMessage("Advertencia:",
- u"No hay capa activa",
- QgsMessageBar.WARNING, 5)
- return
- #My code ends here
- # show the dialog
- self.dlg.show()
- # Run the dialog event loop
- result = self.dlg.exec_()
- # See if OK was pressed
- if result:
- # Do something useful here - delete the line containing pass and
- # substitute with your code.
- #My code starts here
- message = "the raster average of " + filename + " is = " + str(average)
- QMessageBox.information(None, "Raster Average", message)
- #My code ends here
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement