R语言根据经纬度获得对应样本的省份

R语言根据经纬度获得对应样本的省份

一.输入

包含样本的经纬度

二.代码

复制代码
library(sf)
library(dplyr)
library(osmextract)

# 1. 准备省份中英文对照表
province_names <- data.frame(
  name_en = c("Beijing", "Tianjin", "Shanghai", "Chongqing", 
              "Hebei", "Shanxi", "Inner Mongolia", "Liaoning",
              "Jilin", "Heilongjiang", "Jiangsu", "Zhejiang",
              "Anhui", "Fujian", "Jiangxi", "Shandong",
              "Henan", "Hubei", "Hunan", "Guangdong",
              "Guangxi", "Hainan", "Sichuan", "Guizhou",
              "Yunnan", "Tibet", "Shaanxi", "Gansu",
              "Qinghai", "Ningxia", "Xinjiang", "Taiwan"),
  province_cn = c("北京市", "天津市", "上海市", "重庆市",
                  "河北省", "山西省", "内蒙古自治区", "辽宁省",
                  "吉林省", "黑龙江省", "江苏省", "浙江省",
                  "安徽省", "福建省", "江西省", "山东省",
                  "河南省", "湖北省", "湖南省", "广东省",
                  "广西壮族自治区", "海南省", "四川省", "贵州省",
                  "云南省", "西藏自治区", "陕西省", "甘肃省",
                  "青海省", "宁夏回族自治区", "新疆维吾尔自治区", "台湾省")
)

# 2. 读取元数据
metadata <- read.csv("lib_metadata2.csv") %>% 
  filter(!is.na(latitude), !is.na(longitude))

# 3. 获取中国行政区划数据(两种方式任选其一)
# 方式A:使用osmextract获取数据
poly_china <- openstreetmap_fr_zones %>% 
  filter(parent == "china") %>% 
  left_join(province_names, by = c("name" = "name_en")) %>% 
  mutate(province_cn = ifelse(is.na(province_cn), name, province_cn))

# 方式B:使用本地GeoJSON文件(推荐,更稳定)
# china_map <- st_read("D:/path/to/china.json") %>% 
#   left_join(province_names, by = c("name" = "name_en")) %>% 
#   mutate(province_cn = coalesce(province_cn, name))

# 4. 转换为空间点数据
points <- st_as_sf(
  metadata,
  coords = c("longitude", "latitude"),
  crs = 4326,  # WGS84坐标系
  remove = FALSE  # 保留原始列
) %>% 
  st_transform(st_crs(poly_china))  # 转换为与多边形相同的坐标系

# 5. 执行空间连接(带中文省份名称)
result <- st_join(points, poly_china, join = st_within) %>% 
  select(lib_id, genus, species, latitude, longitude, 
         region_en = name, region_cn = province_cn)

# 6. 处理未匹配的点(可选)
if(any(is.na(result$region_cn))) {
  # 方法A:标记未匹配点
  result <- result %>% 
    mutate(region_cn = ifelse(is.na(region_cn), "未知地区", region_cn))
  
  # 方法B:使用最近邻匹配(更精确)
  # unmatched <- result %>% filter(is.na(region_cn))
  # nearest <- st_nearest_feature(unmatched, poly_china)
  # result[is.na(result$region_cn), "region_cn"] <- poly_china$province_cn[nearest]
}

# 7. 检查结果
print(result %>% 
        count(region_cn, sort = TRUE) %>% 
        as.data.frame())

# 8. 保存结果(UTF-8编码支持中文)
write.csv(result, "D:/file/BGI/蚊虫项目/Wolbachia/bam/metadata_with_regions.csv", 
          row.names = FALSE, fileEncoding = "UTF-8")

结果

相关推荐
死磕音视频4 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲6 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
程序喵大人8 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)8 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的9 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质9 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
释厄62310 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_9628857210 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python
临床数据科学和人工智能兴趣组11 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1