使用maps包生成美国州多边形时边缘重叠报错求助
解决maps包多边形转sf后st_filter的拓扑错误问题
问题原因
maps包提供的美国州界数据属于较老旧的矢量格式,转换为sf对象后常存在拓扑缺陷(比如重复顶点、自相交边缘),而sf的空间过滤操作(st_filter)对拓扑有效性要求严格,因此触发报错。
解决方案
方案1:修复现有sf对象的拓扑问题
直接使用sf包自带的st_make_valid()函数修复无效多边形,这是最快捷的方法:
# 修复拓扑无效的多边形 sf_endemic_valid <- st_make_valid(sf_endemic) # 重新执行点过滤 endemic_polygon <- st_filter(occ_points, sf_endemic_valid)
如果修复后仍有问题,可以先简化多边形去除冗余顶点,再做拓扑修复:
# 简化多边形(dTolerance单位为度,可根据需求调整) sf_endemic_simplified <- st_simplify(sf_endemic, dTolerance = 0.01) # 修复拓扑 sf_endemic_valid <- st_make_valid(sf_endemic_simplified) # 执行过滤 endemic_polygon <- st_filter(occ_points, sf_endemic_valid)
方案2:改用拓扑更规范的数据源
maps包的空间数据拓扑严谨性不足,推荐使用专为sf设计的官方数据源,比如spData或tigris包的州界数据:
用spData包获取数据
library(spData) # 定义目标州名称(注意首字母大写) target_states <- c("Alabama","Florida","Georgia","Kentucky","Mississippi","North Carolina","Pennsylvania","South Carolina","Tennessee","Virginia","West Virginia") # 筛选目标州并转换为WGS84坐标系 sf_endemic <- us_states[us_states$NAME %in% target_states, ] sf_endemic <- st_transform(sf_endemic, crs = 4326) # 执行点过滤 endemic_polygon <- st_filter(occ_points, sf_endemic)
用tigris包获取数据
library(tigris) # 获取美国州界的sf对象 us_states <- states(class = "sf") # 筛选目标州 target_states <- c("Alabama","Florida","Georgia","Kentucky","Mississippi","North Carolina","Pennsylvania","South Carolina","Tennessee","Virginia","West Virginia") sf_endemic <- us_states[us_states$NAME %in% target_states, ] # 转换为WGS84坐标系 sf_endemic <- st_transform(sf_endemic, crs = 4326) # 执行点过滤 endemic_polygon <- st_filter(occ_points, sf_endemic)
内容的提问来源于stack exchange,提问作者Jonathan Zheng
相关产品推荐
相关产品推荐

