如何正确在球面Shapefile上绘制坐标并完成空间相交统计?
解决方法
1. 修复中等尺度国家多边形的拓扑有效性
不要降级到小尺度数据,直接对原始中等尺度的国家数据做几何修复,st_make_valid只会修正拓扑错误,不会破坏原有多边形的形状精度:
# 加载并修复中等尺度国家数据 world <- ne_countries(scale = "medium", returnclass = "sf") %>% st_make_valid() # 验证修复结果(返回TRUE则表示所有几何都有效) all(st_is_valid(world))
2. 用空间连接替代相交操作统计点归属
统计点在多边形内的数量,st_join比st_intersection更高效且更适合这类场景,避免相交操作带来的拓扑问题:
# 将陨石落点匹配到对应的国家 meteorite_country <- st_join(MeteoriteData.sf, world, join = st_within) # 按国家统计落点数量,过滤掉无归属的点(如海洋上的落点) int_result <- meteorite_country %>% drop_na(sovereignt) %>% group_by(sovereignt) %>% count(name = "meteorite_count")
3. 临时关闭S2球面几何引擎(针对全球拓扑错误)
如果仍遇到S2相关的拓扑报错,可临时切换到平面几何处理WGS84数据,解决球面计算带来的Loop无效问题:
# 关闭S2引擎 sf::sf_use_s2(FALSE) # 执行空间连接操作 meteorite_country <- st_join(MeteoriteData.sf, world, join = st_within) # 操作完成后可重新开启S2(可选) sf::sf_use_s2(TRUE)
4. 验证地图绘制效果
修复后的国家数据绘制地图,效果和原始数据一致:
MeteoriteMap <- ggplot(data = world) + geom_sf() + geom_sf(data = MeteoriteData.sf, size = 0.5, shape = 23, fill = "darkred") + theme_bw() MeteoriteMap
内容的提问来源于stack exchange,提问作者Chase Dickson
相关产品推荐
相关产品推荐

