You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:17:15