sf包中M值与st_zm函数报错问题求助
问题解决思路
先搞懂M值是什么
M值是OGC几何规范里的测量维度(Measure),和X/Y平面坐标、Z高程维度并列,一般用来存储和空间位置绑定的额外数据(比如道路里程、时间戳这类)。你的shp文件带M值,大概率是导出时GIS软件(比如ArcGIS/QGIS)不小心勾选了保留M维度,或者原始数据生成时自带了这个属性。
彻底移除M值的方法
你之前用st_zm(patch, drop=TRUE, what="ZM")没生效,可能是因为指定了同时处理Z和M,但数据里没有Z值,导致函数没正确识别M维度。试试下面几种方法:
方法1:精准指定移除M维度
直接用st_zm只针对M维度处理:
# 移除M值,保留XY维度 patch_clean <- st_zm(patch, what = "M") # 验证是否移除成功 st_dimensions(patch_clean)
输出里如果看不到M相关的维度,就说明处理成功了。
方法2:强制转换几何类型(兜底方案)
如果方法1没用,用st_cast强制把几何转成标准的多面类型,会自动丢弃M这类额外维度:
patch_clean <- st_cast(patch, "MULTIPOLYGON") # 验证 st_dimensions(patch_clean)
方法3:用GDAL命令行彻底清理
如果R里处理还是有问题,直接用GDAL的ogr2ogr命令(需要安装GDAL)从源文件清理:
ogr2ogr -f "ESRI Shapefile" patch_clean.shp patch.shp -dim XY
这个命令会强制输出只保留XY平面坐标的shp,彻底去掉Z和M维度。
处理后完成波段均值计算
清理完M值后,就可以正常计算并添加属性了,推荐用exactextractr包(比传统方法效率更高):
library(exactextractr) library(sf) # 计算每个斑块各波段的平均反射率 mean_vals <- exact_extract(SenBel, patch_clean, fun = "mean") # 将均值结果合并到属性表 patch_final <- cbind(patch_clean, mean_vals) # 保存处理后的shp st_write(patch_final, "patch_with_mean_reflectance.shp")
内容的提问来源于stack exchange,提问作者Max_student
相关产品推荐
相关产品推荐

