From 07a4c3f61cd01d866fa4cc530f27342891655193 Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Thu, 26 May 2022 10:53:12 -0400 Subject: [PATCH] Build point cloud --- opendm/entwine.py | 7 ++++--- opendm/ogctiles.py | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/opendm/entwine.py b/opendm/entwine.py index a9fd2e94..e430d867 100644 --- a/opendm/entwine.py +++ b/opendm/entwine.py @@ -40,15 +40,16 @@ def build(input_point_cloud_files, output_path, max_concurrency=8, rerun=False): shutil.rmtree(tmpdir) -def build_entwine(input_point_cloud_files, tmpdir, output_path, max_concurrency=8): +def build_entwine(input_point_cloud_files, tmpdir, output_path, max_concurrency=8, reproject=None): kwargs = { 'threads': max_concurrency, 'tmpdir': tmpdir, 'all_inputs': "-i " + " ".join(map(double_quote, input_point_cloud_files)), - 'outputdir': output_path + 'outputdir': output_path, + 'reproject': (" -r %s " % reproject) if reproject is not None else "" } - system.run('entwine build --threads {threads} --tmp "{tmpdir}" {all_inputs} -o "{outputdir}"'.format(**kwargs)) + system.run('entwine build --threads {threads} --tmp "{tmpdir}" {all_inputs} -o "{outputdir}" {reproject}'.format(**kwargs)) def build_untwine(input_point_cloud_files, tmpdir, output_path, max_concurrency=8, rerun=False): kwargs = { diff --git a/opendm/ogctiles.py b/opendm/ogctiles.py index 9c73ca9e..cc924a64 100644 --- a/opendm/ogctiles.py +++ b/opendm/ogctiles.py @@ -7,6 +7,7 @@ from opendm.utils import double_quote from opendm import io from opendm import log from opendm import system +from opendm.entwine import build_entwine import fiona from shapely.geometry import shape @@ -68,10 +69,43 @@ def build_textured_model(input_obj, output_path, reference_lla = None, model_bou except Exception as e: log.ODM_WARNING("Cannot build 3D tiles textured model: %s" % str(e)) +def build_pointcloud(input_pointcloud, output_path, max_concurrency, rerun=False): + if not os.path.isfile(input_pointcloud): + log.ODM_WARNING("No input point cloud file to process") + return + + if rerun and io.dir_exists(output_path): + log.ODM_WARNING("Removing previous 3D tiles directory: %s" % output_path) + shutil.rmtree(output_path) + + log.ODM_INFO("Generating OGC 3D Tiles point cloud") + + try: + if not os.path.isdir(output_path): + os.mkdir(output_path) + + tmpdir = os.path.join(output_path, "tmp") + entwine_output = os.path.join(output_path, "entwine") + + build_entwine([input_pointcloud], tmpdir, entwine_output, max_concurrency, "EPSG:4978") + + kwargs = { + 'input': entwine_output, + 'output': output_path, + } + system.run('entwine convert -i "{input}" -o "{output}"'.format(**kwargs)) + + for d in [tmpdir, entwine_output]: + if os.path.isdir(d): + shutil.rmtree(d) + except Exception as e: + log.ODM_WARNING("Cannot build 3D tiles point cloud: %s" % str(e)) + def build_3dtiles(args, tree, reconstruction, rerun=False): tiles_output_path = tree.ogc_tiles - model_output_path = os.path.join(tiles_output_path, "textured_model") + model_output_path = os.path.join(tiles_output_path, "model") + pointcloud_output_path = os.path.join(tiles.output_path, "pointcloud") if rerun and os.path.exists(tiles_output_path): shutil.rmtree(tiles_output_path) @@ -79,6 +113,8 @@ def build_3dtiles(args, tree, reconstruction, rerun=False): if not os.path.isdir(tiles_output_path): os.mkdir(tiles_output_path) + # Model + if not os.path.isdir(model_output_path) or rerun: reference_lla = os.path.join(tree.opensfm, "reference_lla.json") model_bounds_file = os.path.join(tree.odm_georeferencing, 'odm_georeferenced_model.bounds.gpkg') @@ -88,5 +124,12 @@ def build_3dtiles(args, tree, reconstruction, rerun=False): input_obj = os.path.join(tree.odm_25dtexturing, tree.odm_textured_model_obj) build_textured_model(input_obj, model_output_path, reference_lla, model_bounds_file, rerun) + else: + log.ODM_WARNING("OGC 3D Tiles model %s already generated" % model_output_path) + + # Point cloud + + if not os.path.isdir(pointcloud_output_path) or rerun: + build_pointcloud(tree.odm_georeferencing_model_laz, pointcloud_output_path, args.max_concurrency, rerun) else: log.ODM_WARNING("OGC 3D Tiles model %s already generated" % model_output_path) \ No newline at end of file