如何在R语言中基于经纬度数据统计日本EEZ内作业数量
日本EEZ内捕捞作业数量统计方案
前提准备
确保已加载sf和dplyr包,且完成示例数据与日本EEZ数据的加载(即你提供的前两段代码)。
步骤1:统一空间参考系(CRS)
不同来源的空间数据可能使用不同坐标系统,必须先统一才能进行空间判断:
# 检查并转换EEZ数据的CRS,与作业点数据保持一致(EPSG:4326) if (!sf::st_crs(eez_JP) == sf::st_crs(df2)) { eez_JP <- sf::st_transform(eez_JP, crs = sf::st_crs(df2)) }
步骤2:标记作业点是否在日本EEZ内
使用sf包的st_within函数,快速判断每个作业点是否位于日本EEZ多边形范围内:
# 为作业点数据添加"是否在日本EEZ内"的标记列 df2 <- df2 %>% dplyr::mutate( in_jp_eez = sf::st_within(geometry, eez_JP, sparse = FALSE)[, 1] )
st_within(..., sparse=FALSE)返回逻辑矩阵,每个值对应作业点是否在EEZ内- 取
[,1]是因为eez_JP过滤后仅包含日本EEZ这一个多边形
步骤3:统计EEZ内的作业总数
筛选出标记为TRUE的作业点,对ope_nums求和即可得到总数:
# 计算并输出日本EEZ内的捕捞作业总数 total_jp_eez_ops <- df2 %>% dplyr::filter(in_jp_eez) %>% dplyr::summarise(total_operations = sum(ope_nums)) %>% dplyr::pull(total_operations) cat("日本专属经济区内的捕捞作业总数:", total_jp_eez_ops, "\n")
替代方案(使用st_intersects)
若更习惯用st_intersects函数,也可这样实现标记:
df2 <- df2 %>% dplyr::mutate( in_jp_eez = lengths(sf::st_intersects(geometry, eez_JP)) > 0 )
原理是st_intersects返回每个点与EEZ的交集数量,数量大于0即表示点在EEZ内。
内容的提问来源于stack exchange,提问作者TKH_9
相关产品推荐
相关产品推荐

