在R中基于最近经纬度坐标匹配合并数据集并保留原尺寸
在R里合并两个经纬度不匹配的地理数据集(保住原始数据规模)
核心逻辑
两个数据集的经纬度没完全对上的话,普通的按列合并肯定没用。得用空间邻近匹配——比如给每个点找另一个数据集里离它最近的点,这样既能把两边的信息关联起来,又能保住两个数据集原来的所有行数。
具体操作步骤
1. 装包加载包
主要用sf处理空间数据,dplyr管数据框操作:
install.packages(c("sf", "dplyr")) library(sf) library(dplyr)
2. 把普通数据转成空间对象
假设你的两个数据集叫df1和df2,都有latitude(纬度)、longitude(经度)和各自的属性列:
# 把df1转成sf空间对象,指定坐标系用WGS84(GPS常用的坐标系) sf1 <- st_as_sf(df1, coords = c("longitude", "latitude"), crs = 4326) # 同理处理df2 sf2 <- st_as_sf(df2, coords = c("longitude", "latitude"), crs = 4326)
3. 做空间最近邻合并(保住两边原始数据)
要保住两个数据集的所有行,得分两次做左连接:
- 第一次:给
df1的每一行匹配df2里最近的点,保住df1所有行 - 第二次:给
df2的每一行匹配df1里最近的点,保住df2所有行 - 最后可以把这两个结果拼在一起,得到完整的合并数据
3.1 给df1匹配df2的最近点
# 给sf1每个点找sf2里最近的点,保留sf1所有行 df1_match_df2 <- st_join(sf1, sf2, join = st_nearest_feature, left = TRUE) %>% # 可选:转回普通数据框,不需要空间几何的话就加这行 st_drop_geometry()
3.2 给df2匹配df1的最近点
# 给sf2每个点找sf1里最近的点,保留sf2所有行 df2_match_df1 <- st_join(sf2, sf1, join = st_nearest_feature, left = TRUE) %>% st_drop_geometry()
3.3 把两个结果拼起来(可选)
如果想把两边的匹配结果放同一个数据框里,用bind_rows就行:
final_data <- bind_rows( df1_match_df2 %>% mutate(source_dataset = "df1"), df2_match_df1 %>% mutate(source_dataset = "df2") )
4. 给匹配加距离限制(可选)
要是不想匹配太远的点,可以设个距离阈值,只找指定范围内的点。比如只匹配1公里内的:
# 先把坐标系转成米为单位的(比如UTM,这里假设你的区域在UTM 50N,crs=32650,得根据你自己的区域调整) sf1_utm <- st_transform(sf1, crs = 32650) sf2_utm <- st_transform(sf2, crs = 32650) # 只匹配1000米(1公里)内的最近点 df1_near_df2 <- st_join(sf1_utm, sf2_utm, join = st_is_within_distance, dist = 1000, left = TRUE) %>% st_drop_geometry()
重点提醒
st_nearest_feature:专门用来找每个点对应的另一个图层里最近的点,不管距离多远,都能给每个原始行找到匹配left = TRUE:这个参数一定要加,保证左数据集的所有行都能保留,不会因为找不到匹配就丢了- 坐标系转换:要是需要算实际距离,别直接用WGS84的经纬度,转成以米为单位的投影坐标系(比如UTM),误差会小很多
内容的提问来源于stack exchange,提问作者AS1
相关产品推荐
相关产品推荐

