lidR lascatalog并行与顺序处理下坐标转换结果不一致问题
使用lidR并行处理LAS点云时st_transform未加载指定BETA2007转换管道的问题
- 场景:使用lidR 4.1.2处理约2000个机载激光扫描*.laz点云文件,需将坐标系从高斯-克吕格(EPSG 31468)转换为UTM 32(EPSG 25832)
- 单线程验证:采用sf 1.0-19的
st_transform()函数,指定de_adv_BETA2007转换网格对应的proj pipeline参数,小数据集测试结果与官方ALS数据对比定位准确 - 并行问题:开启并行处理(执行
plan(multisession, workers = 6))时,st_transform()未使用指定的BETA2007转换方法,自动采用默认转换,导致结果出现约0.5米偏移;关闭并行后顺序处理结果完全正确,过程无任何警告或错误
完整代码
library(lidR) library(sf) library(mapview) library(future) # 检查sf包配置: sf_proj_search_paths() sf_extSoftVersion() sf_proj_network(enable = T) # 获取带转换网格的可用选项: options <- sf_proj_pipelines(source_crs = "EPSG:31468", target_crs = "EPSG:25832") # 选择正确的转换管道: pipeline_BETA2007 <- options[1,]$definition # 设置6核并行处理: plan(multisession, workers = 6) # 读取LAS目录: ctg <- readALSLAScatalog("../Data/GK") # 为LAS目录指定EPSG(laz文件头未包含): st_crs(ctg) <- 31468 # 验证LAS目录有效性: ctg las_check(ctg) # 可视化LAS目录: plot(ctg, mapview = TRUE) # 定义输出路径与目录结构: opt_output_files(ctg) <- ".../Data/UTM_parallel/{ORIGINALFILENAME}_UTM" opt_laz_compression(ctg) <- TRUE opt_chunk_buffer(ctg) <- 0 opt_chunk_size(ctg) <- 0 # 定义点云重投影函数: reproject_catalog = function(las) { las_trans = sf::st_transform(las, crs = 25832, pipeline = pipeline_BETA2007) return(las_trans) } # 对LAS目录应用重投影函数: reprojected_ctg = catalog_map(ctg, reproject_catalog)
关闭并行时仅需注释plan()语句并调整输出路径。
处理环境信息
> R.version _ platform x86_64-w64-mingw32 arch x86_64 os mingw32 crt ucrt system x86_64, mingw32 status major 4 minor 4.1 year 2024 month 06 day 14 svn rev 86737 language R version.string R version 4.4.1 (2024-06-14 ucrt) nickname Race for Your Life > sf_extSoftVersion() GEOS GDAL proj.4 GDAL_with_GEOS USE_PROJ_H PROJ "3.12.2" "3.9.3" "9.4.1" "true" "true" "9.4.1"
临时方案与诉求
目前尝试多种方法均未解决该问题,只能用parallel包的bpapply作为临时替代方案,希望找到lidR框架内的可行解决办法。
内容的提问来源于stack exchange,提问作者JayDXQ
相关产品推荐
相关产品推荐

