在R中对KML加载的多多边形按面积比例点采样遇错求助
问题:KML多边形执行st_sample时出现几何有效性错误
问题背景
- 持有包含4个多边形的
core.kml文件,需求是在多边形区域内随机选点,且按多边形面积比例分配采样数量(面积大的多边形采样更多) - 参考相关代码处理北卡罗来纳州多边形样本正常,但处理自身KML文件时,执行
st_sample步骤持续报错
报错信息
st_as_s2(): dropping Z and/or M coordinate Error in
wk_handle.wk_wkb(wkb, s2_geography_writer(oriented = oriented, :
Loop 0 is not valid: Edge 15 crosses edge 19
当前使用代码
core<-st_read("core.kml") core<-st_geometry(core) sf_use_s2(FALSE) core.points<-st_sample(core,5) plot(core)
解决方案
报错根源是多边形存在自相交问题(Edge 15 crosses edge 19),即便关闭S2空间引擎,sf的底层几何校验依然会因无效几何触发错误。按以下步骤修复并实现需求:
1. 修复几何有效性
使用st_make_valid()自动处理自相交、几何方向错误等问题,这是解决报错的核心步骤。
2. 按面积比例分配采样数
先计算每个多边形的准确面积(注意投影转换),再根据面积占比分配采样数量,实现按面积多采样的需求。
修改后的完整代码:
library(sf) # 读取KML文件 core <- st_read("core.kml") # 关闭S2空间引擎(若修复后仍有问题可保留) sf_use_s2(FALSE) # 修复多边形几何有效性 core_valid <- st_make_valid(core) # 转换为等面积投影(WGS84经纬度直接算面积误差大,推荐用EPSG:6933) core_proj <- st_transform(core_valid, crs = 6933) # 计算每个多边形的面积及占比 area <- st_area(core_proj) area_ratio <- area / sum(area) # 设置总采样数,按比例分配(自动修正四舍五入误差) total_samples <- 50 sample_counts <- round(area_ratio * total_samples) sample_counts[which.max(sample_counts)] <- sample_counts[which.max(sample_counts)] + (total_samples - sum(sample_counts)) # 按分配的数量在每个多边形内采样 core_points <- st_sample(st_geometry(core_valid), size = sample_counts) # 可视化验证结果 plot(st_geometry(core_valid)) plot(core_points, add = TRUE, col = "red", pch = 19)
关键提示
st_make_valid()能处理绝大多数常见的几何无效问题,是解决本次报错的关键- 若原始数据是WGS84(EPSG:4326),必须转换为等面积投影后计算面积,否则比例分配会有明显误差
- 若关闭S2后仍报错,优先确保几何已被修复,无效几何才是报错的根本原因
内容的提问来源于stack exchange,提问作者chill
相关产品推荐
相关产品推荐

