Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skeleton of contained coregistration with xDEM #439

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions clients/python/utils/contained_coreg_xdem.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import xdem
import geopandas as gpd

# Example files and user input
fn_epc = ""
fn_dem = ""

coreg_method_str = "nuthkaab"
subsample = 500000
fit_or_bin = "bin_and_fit"

# 1/ INPUTS FROM C++
####################

# 1A/ Inputs from SlideRule to the Python container

# Elevation point cloud provided by SlideRule
# If reading file
epc = gpd.read_file(fn_epc)
# Otherwise directly a geodataframe

# DEM provided by SlideRule
# If reading file
dem = xdem.DEM(fn_dem)
# Otherwise directly an array+geotransform+CRS+nodata
# dem_arr = # NumPy array
# dem_transform = # Can be created from a tuple with affine.transform()
# dem_crs = # Can be created with pyproj.CRS()
# dem_nodata = # Float
# dem = xdem.DEM.from_array(data=dem_arr, transform=dem_transform, crs=dem_crs, nodata=dem_nodata)

# 1B/ Inputs from user through SlideRule to the Python container

# Mapping coregistration methods
mapping_coreg_methods = {"nuthkaab": xdem.coreg.NuthKaab, "dhmin": xdem.coreg.DhMinimize,
"icp": xdem.coreg.ICP, "vshift": xdem.coreg.VerticalShift}

# Mapping potential typed inputs, nested typed dictionary: xdem.coreg.base.InputCoregDict

# Randomization is always mapped to init
init_args = xdem.coreg.base.InRandomDict(subsample=subsample)
# Other arguments are mapped to fit
fit_args = xdem.coreg.base.InFitOrBinDict(fit_or_bin=fit_or_bin)

# 2/ RUN COREGISTRATION
#######################

# Fixed parameters to have defined in the container
z_name = "h_li" # Name of z variable in the geodataframe
ref = "epc" # Which data is the reference for the user: the point cloud or DEM?
if ref == "epc":
reference_elev = epc
to_be_aligned_elev = dem
else:
reference_elev = dem
to_be_aligned_elev = epc

# Run the coregistration
c = mapping_coreg_methods[coreg_method_str](**init_args)
c.fit(reference_elev=reference_elev, to_be_aligned_elev=to_be_aligned_elev, **fit_args)

# 3/ OUTPUTS TO C++
###################

# In any case, extract relevant dictionary of outputs: detailed in xdem.coreg.base.OutputCoregDict
output_random = c.meta["outputs"]["random"]
output_fitorbin = c.meta["outputs"]["fitorbin"]
output_affine = c.meta["outputs"]["affine"]

# If prefer to transform the elevation data in Python, run apply as well, otherwise do this in C++ later
# coreg_tba_elev = c.apply(elev=to_be_aligned_elev)
# Potentially re-transform DEM object to array+transform+CRS+nodata

# Main outputs for a translation coregistration: shift in X/Y/Z
print(output_affine["shift_x"], output_affine["shift_y"], output_affine["shift_z"])
Loading