Source code for forestatrisk.misc.countpix
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ==============================================================================
# author :Ghislain Vieilledent
# email :ghislain.vieilledent@cirad.fr, ghislainv@gmail.com
# web :https://ecology.ghislainv.fr
# python_version :>=2.7
# license :GPLv3
# ==============================================================================
# Standard library imports
from __future__ import division, print_function # Python 3 compatibility
# Third party imports
import numpy as np # For arrays
from osgeo import gdal # GIS libraries
# Local application imports
from .miscellaneous import makeblock, progress_bar
# Countpix
[docs]
def countpix(input_raster, value=1, blk_rows=0):
"""Count the number of pixels having a specific value.
Count the number of pixels (and the corresponding area in ha)
having a specific value.
:param input_raster: Input raster file.
:param value: Target value.
:param blk_rows: if > 0, number of lines per block.
:return: A dictionary with the number of pixels having the \
specified value (npix) and the total area (area, in ha).
"""
# Read raster
rasterR = gdal.Open(input_raster)
rasterB = rasterR.GetRasterBand(1)
# Make blocks
blockinfo = makeblock(input_raster, blk_rows=blk_rows)
nblock = blockinfo[0]
nblock_x = blockinfo[1]
x = blockinfo[3]
y = blockinfo[4]
nx = blockinfo[5]
ny = blockinfo[6]
print("Divide region in {} blocks".format(nblock))
# Number of pixels with a given value
print("Compute the number of pixels with value={}".format(value))
npix = 0
# Loop on blocks of data
for b in range(nblock):
# Progress bar
progress_bar(nblock, b + 1)
# Position in 1D-arrays
px = b % nblock_x
py = b // nblock_x
# Read the data
rasterA = rasterB.ReadAsArray(x[px], y[py], nx[px], ny[py])
# Identify pixels (x/y coordinates) equal to value
npix += (rasterA == value).sum()
# Compute area
print("Compute the corresponding area in ha")
gt = rasterR.GetGeoTransform()
pix_area = gt[1] * (-gt[5])
area = pix_area * npix / 10000
# Results
return {"npix": npix, "area": area}
# End