Source code for riskmapjnr.set_defor_cat_zero
#!/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 :>=3
# license :GPLv3
# ==============================================================================
import os
from osgeo import gdal
from .misc import progress_bar, makeblock
# set_defor_cat_zero
[docs]
def set_defor_cat_zero(ldefrate_file,
dist_file,
dist_thresh,
ldefrate_with_zero_file="ldefrate_with_zero.tif",
blk_rows=128,
verbose=True):
"""Set a value of one (1) to pixels with zero deforestation
risk. A null risk of deforestation is assumed when distance to
forest edge is greater than the distance threshold. NoData value
is set to zero (0).
:param ldefrate_file: Input raster file of local deforestation
rates. Deforestation rates are defined by integer values
between rescale_min_val (e.g. 2) and rescale_max_val
(e.g. 10000). This file is typically obtained with function
``local_defor_rate()``.
:param dist_file: Path to the distance to forest edge raster file.
:param dist_thresh: The distance threshold. This distance
threshold is used to identify pixels with zero deforestation
risk.
:param ldefrate_with_zero_file: Output raster file. Default to
"ldefrate_with_zero.tif" in the current working
directory. Pixels with zero deforestation risk are assigned a
value of 1.
:param blk_rows: If > 0, number of rows for computation by block.
:param verbose: Logical. Whether to print messages or not. Default
to ``True``.
:return: None. A raster file identifying pixels with zero risk of
deforestation (value 1) will be created (see
``ldefrate_with_zero_file``).
"""
# ==============================================================
# Input rasters: deforestation rates and distance to forest edge
# ==============================================================
# Get local deforestation rate (ldefrate) raster data
ldefrate_ds = gdal.Open(ldefrate_file)
ldefrate_band = ldefrate_ds.GetRasterBand(1)
# Raster size
xsize = ldefrate_band.XSize
ysize = ldefrate_band.YSize
# Get distance to forest edge (dist) raster data
dist_ds = gdal.Open(dist_file)
dist_band = dist_ds.GetRasterBand(1)
# Make blocks
blockinfo = makeblock(ldefrate_file, blk_rows=blk_rows)
nblock = blockinfo[0]
nblock_x = blockinfo[1]
x = blockinfo[3]
y = blockinfo[4]
nx = blockinfo[5]
ny = blockinfo[6]
# ==================================
# Zero category (beyond dist_thresh)
# ==================================
# Create cat_zero (catzero) raster
driver = gdal.GetDriverByName("GTiff")
if os.path.isfile(ldefrate_with_zero_file):
os.remove(ldefrate_with_zero_file)
catzero_ds = driver.Create(
ldefrate_with_zero_file, xsize, ysize,
1, gdal.GDT_UInt16, ["COMPRESS=LZW",
"PREDICTOR=2", "BIGTIFF=YES"])
catzero_ds.SetProjection(ldefrate_ds.GetProjection())
catzero_ds.SetGeoTransform(ldefrate_ds.GetGeoTransform())
catzero_band = catzero_ds.GetRasterBand(1)
catzero_band.SetNoDataValue(0)
# Loop on blocks of data
for b in range(nblock):
# Progress bar
if verbose:
progress_bar(nblock, b + 1)
# Position
px = b % nblock_x
py = b // nblock_x
# Data
catzero_data = ldefrate_band.ReadAsArray(x[px], y[py], nx[px], ny[py])
dist_data = dist_band.ReadAsArray(x[px], y[py], nx[px], ny[py])
# Set 1 for zero risk of deforestation (beyond distance threshold)
# !: dist to forest edge has positive values outside country border
# Also ensure NoData outside country borders (second condition)
catzero_data[(dist_data >= dist_thresh) & (catzero_data != 0)] = 1
# Ensure NoData when dist_data equals zero (especially for t2)
catzero_data[dist_data == 0] = 0
# Write data to band
catzero_band.WriteArray(catzero_data, x[px], y[py])
# Compute statistics
catzero_band.FlushCache()
cb = gdal.TermProgress_nocb if verbose else 0
catzero_band.ComputeStatistics(False, cb)
# Dereference drivers
catzero_band = None
del catzero_ds
del ldefrate_ds, dist_ds
return None
# # Test
# ldefrate_file = "outputs/ldefrate_ws7.tif"
# dist_file = "outputs/dist_edge.tif"
# dist_thresh = 390
# ldefrate_with_zero_file = "outputs/ldefrate_with_zero.tif"
# blk_rows = 128
# verbose = True
# set_defor_cat_zero(ldefrate_file,
# dist_file,
# dist_thresh,
# ldefrate_with_zero_file,
# blk_rows=128,
# verbose=True)
# End