From 99b68be4ca7ca7439a71c9934c8c62c4af4e1fb9 Mon Sep 17 00:00:00 2001 From: Karamaz0V1 Date: Thu, 18 Feb 2021 16:57:02 +0100 Subject: [PATCH] Add rasterize script in the package --- idefix/tools/config.json | 30 ---------- idefix/tools/rasterize-lidar.py | 2 +- idefix/tools/rasterize.py | 99 +++++++++++++++++++++++++++++++++ setup.py | 7 ++- 4 files changed, 105 insertions(+), 33 deletions(-) delete mode 100644 idefix/tools/config.json mode change 100755 => 100644 idefix/tools/rasterize-lidar.py create mode 100755 idefix/tools/rasterize.py diff --git a/idefix/tools/config.json b/idefix/tools/config.json deleted file mode 100644 index d8c4323..0000000 --- a/idefix/tools/config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "global": { - "resolution": 1, - "interpolation": "idw", - "out_dir": "./results" - }, - "rasters": [ - { - "feature": "elevation", - "bin_structure": "voxel", - "bin_method": "mean", - "squash_method": ["top", "bottom", "std"] - }, - { - "feature": "elevation", - "bin_structure": "pixel", - "bin_method": "mean" - }, - { - "bin_structure": "pixel", - "bin_method": "density" - }, - { - "feature": "num_returns", - "bin_structure": "pixel", - "bin_method": "mode" - } - ] -} - diff --git a/idefix/tools/rasterize-lidar.py b/idefix/tools/rasterize-lidar.py old mode 100755 new mode 100644 index 2c9eca8..9ca7748 --- a/idefix/tools/rasterize-lidar.py +++ b/idefix/tools/rasterize-lidar.py @@ -16,7 +16,7 @@ from pathlib import Path import idefix as ix -parser = argparse.ArgumentParser(description='Compute features rasters from LiDAR point cloud.', +parser = argparse.ArgumentParser(description='Compute features rasters from .npz point cloud.', formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" The config file can contain any parameters of the diff --git a/idefix/tools/rasterize.py b/idefix/tools/rasterize.py new file mode 100755 index 0000000..2c9eca8 --- /dev/null +++ b/idefix/tools/rasterize.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# file rasterize-lidar.py +# author Florent Guiotte +# version 0.0 +# date 18 févr. 2021 +"""Create raster of LiDAR features. + +Use npz point clouds from Idefix. +""" + +import json +import argparse +from multiprocessing import Pool +from tqdm.auto import tqdm +from pathlib import Path + +import idefix as ix + +parser = argparse.ArgumentParser(description='Compute features rasters from LiDAR point cloud.', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +The config file can contain any parameters of the +idefix.helpers.rasterize function in a json file. + +You can define 'global' parameters (for all the rasters) and raster +specific parameters in a list 'rasters'. + +See the following `config.json` example file: + +{ + "global": { + "resolution": 5, + "interpolation": "idw", + "out_dir": "./results" + }, + "rasters": [ + { + "feature": "elevation", + "bin_structure": "voxel", + "bin_method": "mean", + "squash_method": ["top", "bottom", "std"] + }, + { + "feature": "elevation", + "bin_structure": "pixel", + "bin_method": "mean" + }, + { + "bin_structure": "pixel", + "bin_method": "density" + }, + { + "feature": "num_returns", + "bin_structure": "pixel", + "bin_method": "mode" + } + ] +} +""") + +parser.add_argument('-c', '--config', type=str, help='json file to setup the rasterization processes', dest='c') +parser.add_argument('-n', '--nprocess', type=int, help='number of child processes to use', default=1, dest='n') +parser.add_argument('in_dir', type=str, help='the path to the point cloud directory') +parser.add_argument('out_dir', type=str, help='path to output raster results') + +args = parser.parse_args() + +def _map_rasterize(kwargs): + return ix.helpers.rasterize(**kwargs) + +def main(): + in_dir = Path(args.in_dir) + out_dir = Path(args.out_dir) + out_dir.mkdir(exist_ok=True) + + + pc_files = list(in_dir.glob('*.npz')) + + + config = {'global': {'out_dir': out_dir}} + config |= json.load(open(args.c)) if args.c else {} + + globalc = config['global'] + rasters = config['rasters'] if 'rasters' in config else [{}] + + queue = [] + for pc_file in pc_files: + for raster in rasters: + job = globalc.copy() + job |= raster + job |= {'pc_file': pc_file} + queue += [job] + + pool = Pool(processes=args.n) + for _ in tqdm(pool.imap_unordered(_map_rasterize, queue), total=len(queue)): + pass + +if __name__ == '__main__': + main() diff --git a/setup.py b/setup.py index f89e666..4c0202d 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ with open('README.md', 'r') as fh: setuptools.setup( name='idefix', - version='0.1.5', + version='0.2.0', description='Utils and processing pipelines for LiDAR point clouds', author='Florent Guiotte', author_email='florent.guiotte@uhb.fr', @@ -23,7 +23,10 @@ setuptools.setup( long_description=long_description, long_description_content_type='text/markdown', packages=['idefix', 'idefix.tools'], - entry_points = {'console_scripts':['txt2npz = idefix.tools.txt_to_npz:main',]}, + entry_points = {'console_scripts':[ + 'txt2npz=idefix.tools.txt_to_npz:main', + 'rasterize=idefix.tools.rasterize:main', + ]}, classifiers=[ 'Programming Language :: Python :: 3', 'License :: OSI Approved',