Source code for safe_qgis.impact_calculator

"""
InaSAFE Disaster risk assessment tool developed by AusAid -
**ISImpactCalculator.**

The module provides a high level interface for running SAFE scenarios.

Contact : ole.moller.nielsen@gmail.com

.. note:: 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__ = 'tim@linfiniti.com, ole.moller.nielsen@gmail.com'
__revision__ = '$Format:%H$'
__date__ = '11/01/2011'
__copyright__ = ('Copyright 2012, Australia Indonesia Facility for '
                 'Disaster Reduction')

from PyQt4.QtCore import QObject

#Do not import any QGIS or SAFE modules in this module!
from safe_qgis.impact_calculator_thread import ImpactCalculatorThread
from safe_qgis.exceptions import InsufficientParametersException
from safe_qgis.safe_interface import (readSafeLayer,
                                   getSafeImpactFunctions)


[docs]class ImpactCalculator(QObject): """A class to compute an impact scenario. We inherit from QObject so that we can use Qt translation self.tr calls.""" def __init__(self): """Constructor for the impact calculator.""" QObject.__init__(self) self._hazardLayer = None self._exposureLayer = None self._function = None self._filename = None self._result = None
[docs] def exposureLayer(self): """Accessor for the exposure layer. Args: None Returns: A QgsMapLayer or None depending on if the layer is set Raises: None """ return self._exposureLayer
[docs] def setExposureLayer(self, theLayerPath): """Mutator for Exposure layer property (e.g. buildings or features that will be affected). Args: theLayerPath - This should be a string representing a path to a file which can be loaded as a SAFE readlayer instance. Returns: None Raises: None """ if theLayerPath is None: self._exposureLayer = None else: self._exposureLayer = str(theLayerPath)
[docs] def hazardLayer(self): """Accessor for the hazard layer. Args: None Returns: A QgsMapLayer or None depending on if the layer is set Raises: None """ return self._hazardLayer
[docs] def setHazardLayer(self, theLayerPath): """Mutator: hazard layer. Hazard layer property (e.g. a flood depth raster). This should be a SAFE readlayer instance. Args: theLayerPath - This should be a string representing a path to a file which can be loaded as a SAFE readlayer instance. Returns: None Raises: None """ if theLayerPath is None: self._hazardLayer = None else: self._hazardLayer = str(theLayerPath)
[docs] def function(self): """Accessor for the function layer. Args: None Returns: An inasafe function or None depending on if the layer is set Raises: None """ return self._function
[docs] def setFunction(self, theFunctionName): """Mutator: function layer. Function property (specifies which inasafe function to use to process the hazard and exposure layers with. Args: theFunctionName - This should be a string containing the name of a valid SAFE impact_function. Returns: None Raises: None """ self._function = str(theFunctionName)
[docs] def getRunner(self): """ Factory to create a new runner thread. Requires three parameters to be set before execution can take place: * Hazard layer - a path to a raster (string) * Exposure layer - a path to a vector hazard layer (string). * Function - a function name that defines how the Hazard assessment will be computed (string). Args: None. Returns: None Raises: InsufficientParametersException if not all parameters are set. """ self._filename = None self._result = None if self._hazardLayer is None or self._hazardLayer == '': myMessage = self.tr('Error: Hazard layer not set.') raise InsufficientParametersException(myMessage) if self._exposureLayer is None or self._exposureLayer == '': myMessage = self.tr('Error: Exposure layer not set.') raise InsufficientParametersException(myMessage) if self._function is None or self._function == '': myMessage = self.tr('Error: Function not set.') raise InsufficientParametersException(myMessage) # Call impact calculation engine try: myHazardLayer = readSafeLayer(self._hazardLayer) myExposureLayer = readSafeLayer(self._exposureLayer) except: raise myFunctions = getSafeImpactFunctions(self._function) myFunction = myFunctions[0][self._function] return ImpactCalculatorThread(myHazardLayer, myExposureLayer, myFunction)