### Navigation

- index
- modules
- Home »
- Contents »
- Module code »

# Source code for safe.engine.impact_functions_for_testing.HKV_flood_study

    import numpy
    from safe.impact_functions.core import FunctionProvider
    from safe.impact_functions.core import get_hazard_layer, get_exposure_layers
    from safe.storage.raster import Raster
    from safe.common.utilities import verify

    # Want to use the human readably name in the impact function
    # pylint: disable=W0622
    from numpy import nansum as sum
    # pylint: enable=W0622

    class HKVFloodImpactFunctionTEST(FunctionProvider):
        """Risk plugin for flood impact

        :author HKV
        :rating 1
        :param requires category=='hazard' and \
                        subcategory=='flood' and \
                        layertype=='raster' and \
                        unit=='m'

        :param requires category=='exposure' and \
                        subcategory=='population' and \
                        layertype=='raster' and \
                        datatype=='density'
        """

        plugin_name = 'HKVtest'

        @staticmethod
        def run(layers):
            """Risk plugin for earthquake fatalities

            Input
              layers: List of layers expected to contain
                  H: Raster layer of flood depth
                  P: Raster layer of population data on the same grid as H
            """

            # Depth above which people are regarded affected [m]
            threshold = 0.1

            # Identify hazard and exposure layers
            inundation = get_hazard_layer(layers)  # Flood inundation [m]

            # Get population and gender ratio
            population = gender_ratio = None
            for layer in get_exposure_layers(layers):
                keywords = layer.get_keywords()

                if 'datatype' not in keywords:
                    population = layer
                else:
                    datatype = keywords['datatype']

                    if 'ratio' not in datatype:
                        population = layer
                    else:
                        # if 'female' in datatype and 'ratio' in datatype:
                        gender_ratio_unit = keywords['unit']

                        msg = ('Unit for gender ratio must be either '
                               '"percent" or "ratio"')
                        if gender_ratio_unit not in ['percent', 'ratio']:
                            raise Exception(msg)

                        gender_ratio = layer

            msg = 'No population layer was found in: %s' % str(layers)
            verify(population is not None, msg)

            # Extract data as numeric arrays
            D = inundation.get_data(nan=0.0)  # Depth

            # Calculate impact as population exposed to depths > threshold
            if population.get_resolution(native=True, isotropic=True) < 0.0005:
                # Keep this for backwards compatibility just a little while
                # This uses the original custom population set and
                # serves as a reference

                P = population.get_data(nan=0.0)  # Population density
                pixel_area = 2500
                I = numpy.where(D > threshold, P, 0) / 100000.0 * pixel_area
            else:
                # This is the new generic way of scaling (issue #168 and #172)
                P = population.get_data(nan=0.0, scaling=True)
                I = numpy.where(D > threshold, P, 0)

            if gender_ratio is not None:
                # Extract gender ratio at each pixel (as ratio)
                G = gender_ratio.get_data(nan=0.0)
                if gender_ratio_unit == 'percent':
                    G /= 100

                # Calculate breakdown
                P_female = P * G
                P_male = P - P_female

                I_female = I * G
                I_male = I - I_female

            # Generate text with result for this study
            total = str(int(sum(P.flat) / 1000))
            count = str(int(sum(I.flat) / 1000))

            # Create report
            impact_summary = ('<table border="0" width="320px">'
                       '   <tr><td><b>%s&#58;</b></td>'
                       '<td align="right"><b>%s</b></td></tr>'
                       % ('Jumlah Penduduk', total))
            if gender_ratio is not None:
                total_female = str(int(sum(P_female.flat) / 1000))
                total_male = str(int(sum(P_male.flat) / 1000))

                impact_summary += ('        <tr><td>%s&#58;</td>'
                            '<td align="right">%s</td></tr>'
                            % (' - Wanita', total_female))
                impact_summary += ('        <tr><td>%s&#58;</td>'
                            '<td align="right">%s</td></tr>'
                            % (' - Pria', total_male))
                impact_summary += '<tr><td>&nbsp;</td></tr>'  # Blank row

            impact_summary += ('   <tr><td><b>%s&#58;</b></td>'
                        '<td align="right"><b>%s</b></td></tr>'
                        % ('Perkiraan Jumlah Terdampak (> %.1fm)' % threshold,
                           count))

            if gender_ratio is not None:
                affected_female = str(int(sum(I_female.flat) / 1000))
                affected_male = str(int(sum(I_male.flat) / 1000))

                impact_summary += ('        <tr><td>%s&#58;</td>'
                            '<td align="right">%s</td></tr>'
                            % (' - Wanita', affected_female))
                impact_summary += ('        <tr><td>%s&#58;</td>'
                            '<td align="right">%s</td></tr>'
                            % (' - Pria', affected_male))

            impact_summary += '</table>'

            impact_summary += '<br>'  # Blank separation row
            impact_summary += 'Catatan&#58; Semua nomor x 1000'

            # Create raster object and return
            R = Raster(I,
                       projection=inundation.get_projection(),
                       geotransform=inundation.get_geotransform(),
                       name='People affected',
                       keywords={'impact_summary': impact_summary})
            return R

### Navigation

- index
- modules
- Home »
- Contents »
- Module code »