From be142549e3818eb08f4c0d49e46fc2c4b9f24145 Mon Sep 17 00:00:00 2001 From: HeDo Date: Mon, 13 Mar 2023 19:26:01 +0100 Subject: [PATCH 1/2] Preserve UserData dimension --- .../extra_dimensions/userdata_dimension.py | 25 +++++++++++++++++++ opendm/dem/ground_rectification/io/las_io.py | 3 +++ 2 files changed, 28 insertions(+) create mode 100755 opendm/dem/ground_rectification/extra_dimensions/userdata_dimension.py diff --git a/opendm/dem/ground_rectification/extra_dimensions/userdata_dimension.py b/opendm/dem/ground_rectification/extra_dimensions/userdata_dimension.py new file mode 100755 index 00000000..0d6dd517 --- /dev/null +++ b/opendm/dem/ground_rectification/extra_dimensions/userdata_dimension.py @@ -0,0 +1,25 @@ +import numpy as np +from .dimension import Dimension + +class UserDataDimension(Dimension): + """A dimension that stores the user data of a point cloud.""" + + def __init__(self): + super(UserDataDimension, self).__init__() + + def assign_default(self, point_cloud): + default = np.full(point_cloud.len(), 0, dtype=np.uint8) + super(UserDataDimension, self)._set_values(point_cloud, default) + + def assign(self, *point_clouds, **kwargs): + + # Simply copy the value of the UserData dimension from the original point cloud + # to the new point cloud + for point_cloud in point_clouds: + super(UserDataDimension, self)._set_values(point_cloud, point_cloud.user_data) + + def get_name(self): + return 'UserData' + + def get_las_type(self): + return 'uint8' diff --git a/opendm/dem/ground_rectification/io/las_io.py b/opendm/dem/ground_rectification/io/las_io.py index 68383bdb..c79a3898 100755 --- a/opendm/dem/ground_rectification/io/las_io.py +++ b/opendm/dem/ground_rectification/io/las_io.py @@ -1,4 +1,5 @@ import time +from opendm.dem.ground_rectification.extra_dimensions.userdata_dimension import UserDataDimension import pdal import numpy as np from opendm import log @@ -22,6 +23,7 @@ def read_cloud(point_cloud_path): blue = arrays["Blue"] cloud = PointCloud.with_dimensions(x, y, z, classification, red, green, blue) + cloud.add_dimension(UserDataDimension(), arrays["UserData"]) return pipeline.metadata["metadata"]["readers.las"], cloud @@ -63,6 +65,7 @@ def write_cloud(metadata, point_cloud, output_point_cloud_path): arrays['Red'] = red.astype(np.uint8).ravel() arrays['Green'] = green.astype(np.uint8).ravel() arrays['Blue'] = blue.astype(np.uint8).ravel() + arrays['UserData'] = point_cloud.extra_dimensions["UserData"].ravel() writer_pipeline = { "pipeline": [ From 6b0f8f62ffa0b300d63b2bd87134e6c88e4a6e06 Mon Sep 17 00:00:00 2001 From: HeDo Date: Mon, 13 Mar 2023 22:25:43 +0100 Subject: [PATCH 2/2] Added checks --- opendm/dem/ground_rectification/io/las_io.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/opendm/dem/ground_rectification/io/las_io.py b/opendm/dem/ground_rectification/io/las_io.py index c79a3898..91a7d362 100755 --- a/opendm/dem/ground_rectification/io/las_io.py +++ b/opendm/dem/ground_rectification/io/las_io.py @@ -23,7 +23,9 @@ def read_cloud(point_cloud_path): blue = arrays["Blue"] cloud = PointCloud.with_dimensions(x, y, z, classification, red, green, blue) - cloud.add_dimension(UserDataDimension(), arrays["UserData"]) + + if "UserData" in arrays.dtype.names: + cloud.add_dimension(UserDataDimension(), arrays["UserData"]) return pipeline.metadata["metadata"]["readers.las"], cloud @@ -65,7 +67,9 @@ def write_cloud(metadata, point_cloud, output_point_cloud_path): arrays['Red'] = red.astype(np.uint8).ravel() arrays['Green'] = green.astype(np.uint8).ravel() arrays['Blue'] = blue.astype(np.uint8).ravel() - arrays['UserData'] = point_cloud.extra_dimensions["UserData"].ravel() + + if "UserData" in point_cloud.extra_dimensions: + arrays['UserData'] = point_cloud.extra_dimensions["UserData"].ravel() writer_pipeline = { "pipeline": [