在R中使用sf包计算几何质心时遇错误,请求协助
解决sf包计算质心时的几何有效性错误
错误原因
你遇到的Loop 0 is not valid: Non-empty, non-full loops must have at least 3 vertices错误,本质是city_map数据中存在无效几何对象——某个多边形的环(Loop)顶点数少于3个,不符合多边形的定义(至少需要3个点才能构成闭合多边形环)。
解决方案步骤
1. 定位无效要素
先检查数据中哪些要素无效,以及具体原因:
library(sf) # 读取数据并转换坐标系 city_map <- st_read("~\\city.shp") city_map <- sf::st_transform(city_map, crs=4326) # 检查每个要素的有效性 validity_check <- st_is_valid(city_map) # 获取无效要素的具体原因 invalid_details <- st_is_valid_reason(city_map) # 查看无效要素的信息 print(invalid_details[!validity_check])
2. 自动修复几何有效性
使用st_make_valid()函数自动修复所有无效几何,该函数会根据几何问题自动调整(比如将顶点不足的环转换为合法几何类型,或补充必要顶点):
city_map_fixed <- st_make_valid(city_map) # 验证修复后的有效性 all(st_is_valid(city_map_fixed))
3. 过滤非多边形要素(可选)
如果仅需计算多边形的质心,修复后可过滤掉点、线等非多边形类型要素:
# 仅保留多边形和多多边形类型 city_map_polygons <- city_map_fixed[st_geometry_type(city_map_fixed) %in% c("POLYGON", "MULTIPOLYGON"), ]
4. 重新计算质心
处理完成后执行质心计算:
city_center <- city_map_polygons %>% sf::st_centroid()
额外建议
如果自动修复无法解决问题,建议用QGIS等GIS软件直接打开city.shp文件,可视化检查并手动删除/修改顶点不足的无效要素,再重新导入R中处理。
内容的提问来源于stack exchange,提问作者jinchi
相关产品推荐
相关产品推荐

