为LAS Catalog分配坐标系后代码失效,请求技术协助
问题根源分析
你的核心问题是错误地给平面投影坐标的LAS数据直接赋值了经纬度坐标系EPSG:4326:
- 原始LAS数据的坐标是平面投影(比如UTM、高斯克里格等,数值通常是数万/数十万级),而EPSG:4326的合法范围是经度±180、纬度±90,强行赋值后会导致边界框超出合法区间,触发
s2地理处理库的无效几何体错误(边界交叉)。
解决步骤
1. 确认原始数据的正确坐标系
先搞清楚LAS数据原本的投影信息:
- 用
lasinfo(normalized1987)查看LAS元数据,里面可能包含坐标系参数; - 若元数据缺失,联系数据提供者,或根据数据采集区域的常用投影推断(比如国内常用CGCS2000高斯克里格,国外常用UTM)。
2. 正确转换坐标系(而非直接赋值)
不能直接给st_crs()赋值4326,必须先设置原始CRS再转换:
# 示例:假设原始坐标系是UTM 50N(EPSG:32650),先正确设置 st_crs(normalized1987) <- 32650 # 转换为EPSG:4326 normalized1987_wgs84 <- st_transform(normalized1987, 4326)
3. 修复无效几何体(若转换后仍报错)
如果转换后还是出现边界交叉错误,用s2库修复几何体:
# 修复LAS Catalog的边界多边形 normalized1987_wgs84$geometry <- s2::s2_repair_geometry(normalized1987_wgs84$geometry) # 注意:EPSG:4326下res单位是度,30米对应约0.00027度(1度≈111km) heigh <- pixel_metrics(normalized1987_wgs84, func = .stdmetrics_z, res = 0.00027)
4. 更高效的备选方案
如果仅需最终结果用4326,建议在原始坐标系下计算指标再转换:
# 设置原始CRS st_crs(normalized1987) <- 32650 # 原始平面坐标系下计算(res=30米,符合预期) heigh <- pixel_metrics(normalized1987, func = .stdmetrics_z, res = 30) # 转换结果到EPSG:4326 heigh_wgs84 <- st_transform(heigh, 4326)
关键注意事项
- 禁止给非经纬度数据直接赋值EPSG:4326,必须先明确原始CRS再转换;
- 经纬度坐标系下的分辨率单位是度,不能直接用米,否则结果完全不符合预期;
- LAS Catalog边界无效时,
s2_repair_geometry()可修复大部分交叉、自重叠问题。
内容的提问来源于stack exchange,提问作者Shaya
相关产品推荐
相关产品推荐

