Source code for satproc.console.spatial_filter

# -*- coding: utf-8 -*-
import argparse
import logging
import sys
import os
from glob import glob

from satproc import __version__
from satproc.postprocess.spatial_filter import MODES, spatial_filter

__author__ = "Damián Silvani"
__copyright__ = "Dymaxion Labs"
__license__ = "Apache-2.0"

_logger = logging.getLogger(__name__)


[docs]def check_kernel_size(value): ivalue = int(value) if ivalue % 2 == 0: raise argparse.ArgumentTypeError("must be an odd number") return ivalue
[docs]def parse_args(args): """Parse command line parameters Args: args ([str]): command line parameters as list of strings Returns: :obj:`argparse.Namespace`: command line parameters namespace """ parser = argparse.ArgumentParser( description="Apply a spatial filter (median, gaussian) to an image", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) parser.add_argument( "--version", action="version", version="satproc {ver}".format(ver=__version__), ) parser.add_argument("input", nargs="*", help="input raster") parser.add_argument("--input-dir", help="directory containing input rasters") parser.add_argument("--output", "-o", help="output raster") parser.add_argument("--mode", "-m", choices=MODES, default="gaussian", help="Filter mode") parser.add_argument("--size", "-s", type=check_kernel_size, default=5, help="Size of the filter") parser.add_argument( "--merge", dest="merge", default=True, action="store_true", help="merge all input files into a single virtual raster before filtering", ) parser.add_argument( "--no-merge", dest="merge", default=False, action="store_false", help="do not merge all input files into a single virtual raster", ) parser.add_argument( "-v", "--verbose", dest="loglevel", help="set loglevel to INFO", action="store_const", const=logging.INFO, ) parser.add_argument( "-vv", "--very-verbose", dest="loglevel", help="set loglevel to DEBUG", action="store_const", const=logging.DEBUG, ) return parser.parse_args(args)
[docs]def setup_logging(loglevel): """Setup basic logging Args: loglevel (int): minimum loglevel for emitting messages """ logformat = "[%(asctime)s] %(levelname)s:%(name)s:%(message)s" logging.basicConfig( level=loglevel, stream=sys.stdout, format=logformat, datefmt="%Y-%m-%d %H:%M:%S" )
[docs]def main(args): """Main entry point allowing external calls Args: args ([str]): command line parameter list """ args = parse_args(args) setup_logging(args.loglevel) input_paths = [] if args.input: input_paths.extend(args.input) if args.input_dir: files = list(glob(os.path.join(args.input_dir, "*.tif"))) input_paths.extend(files) if not input_paths: raise RuntimeError( ( "No input files found. " "You should pass individual input_image paths, or use --input-dir." ) ) _logger.info("Num. input files: %d", len(input_paths)) spatial_filter(input_paths=input_paths, output_path=args.output, mode=args.mode, size=args.size)
[docs]def run(): """Entry point for console_scripts""" main(sys.argv[1:])
if __name__ == "__main__": run()