Source code for lmpy.tools.encode_layers

"""Script to encode layers into a Matrix."""
import argparse
import os

from lmpy.data_preparation.layer_encoder import LayerEncoder


DESCRIPTION = 'Encode raster and / or vector layers into a site by layer matrix.'


# .....................................................................................
[docs]def cli(): """Command line interface for layer encoding. Raises: ValueError: Raised if an unknown encoding method is provided or too many layer arguments. """ parser = argparse.ArgumentParser(description=DESCRIPTION) parser.add_argument( '--encode_method', '-m', type=str, choices=['biogeo', 'presence_absence', 'largest_class', 'mean_value'], default='mean_value', help='The method to use to encode each layer.', ) parser.add_argument( '--min_coverage', type=float, default=25, help='Minimum percentage of a cell that has to be covered to encode it.', ) parser.add_argument( '--min_presence', type=float, default=10, help='Minimum value to be considered present when encoding presence absence.', ) parser.add_argument( '--max_presence', type=float, default=127, help='The maximum value that should be considered present.', ) parser.add_argument( 'shapegrid_filename', type=str, help='File location of shapegrid to use for site geometries.', ) parser.add_argument( 'out_matrix_filename', type=str, help='File location to write the encoded matrix.', ) # Layers to encode parser.add_argument( '--layer', '-l', nargs='*', action='append', help='File location of layer [ LABEL [ EVENT FIELD ]].', ) args = parser.parse_args() encoder = LayerEncoder(args.shapegrid_filename) for layer_args in args.layer: # if there are too many layer arguments, fail if len(layer_args) > 3: raise ValueError( 'Too many layer arguments {}.' 'Hint: Specify layer args last in command.'.format(layer_args) ) # Process layer arguments, get filename for sure, try label and event field lyr_fn = layer_args[0] layer_event = None # Label if len(layer_args) > 1: lyr_label = layer_args[1] if len(layer_args) > 2: layer_event = layer_args[2] else: lyr_label = os.path.splitext(os.path.basename(lyr_fn))[0] if args.encode_method == 'biogeo': encoder.encode_biogeographic_hypothesis( lyr_fn, lyr_label, args.min_coverage, event_field=layer_event ) elif args.encode_method == 'presence_absence': encoder.encode_presence_absence( lyr_fn, lyr_label, args.min_presence, args.max_presence, args.min_coverage, attribute_name=layer_event, ) elif args.encode_method == 'largest_class': encoder.encode_largest_class( lyr_fn, lyr_label, args.min_coverage, attribute_name=layer_event, ) elif args.encode_method == 'mean_value': encoder.encode_mean_value( lyr_fn, lyr_label, attribute_name=layer_event ) else: raise ValueError('Unknown encoding method: {}'.format(args.encode_method)) enc_mtx = encoder.get_encoded_matrix() enc_mtx.write(args.out_matrix_filename)
# ..................................................................................... __all__ = ['cli'] # ..................................................................................... if __name__ == '__main__': # pragma: no cover cli()