两个 sf 对象的空间合并
Spatial merge of two sf objects
我正在尝试合并两个数据框(主数据框和子数据框)。我希望 'sub' 中的 'variable' 数据根据距离或更好的距离合并到 'main',以 'sub' row/site 中最接近 [=17= 的那个为准] row/site.
library(sf)
a <- structure(list(`Site#` = c("Site1", "Site2", "Site3", "Site4", "Site5", "Site6"), Longitude = c(-94.609, -98.1391, -99.033, -98.49, -96.4309, -95.99), `Latitude` = c(38.922, 37.486111, 37.811, 38.364, 39.4402, 39.901)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
main <- st_as_sf(a, coords = c("Longitude", "Latitude"), crs = 4326)
b <- structure(list(Longitude = c(-98.49567, -96.22451, -98.49567, -98.941391, -95.91411, -99.031113), `Latitude` = c(38.31264,39.97692, 38.31264, 37.486111, 39.92143, 37.814171), Variable = c(400, 50, 100, 201, 99, 700)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
sub <- st_as_sf(b, coords = c("Longitude", "Latitude"), crs = 4326)
c <- st_intersection(main,sub)
c <- st_is_within_distance(main,sub,dist=0.001)
我相信 st_intersection 是我想要的,但如果我可以根据距离一对一地做到这一点,那就行得通了。有谁知道什么可以提供我正在寻找的结果?
这是我试过的。似乎您需要 st_nearest_feature()
,它获取最近要素的索引。一旦有了索引,就可以将它们添加到 main
。您还可以将行号(索引)添加到 b
。然后,你要处理加入。
library(dplyr)
library(sf)
# Which feature in y is closest to each feature in x?
# You get row index
st_nearest_feature(x = main, y = sub)
# Add the index number to main.
mutate(main, ind = st_nearest_feature(x = main, y = sub)) -> main
# Add row numbers (index) to b
mutate(b, ind = 1:n()) -> b
left_join(main, b, by = "ind")
# `Site#` geometry ind Longitude Latitude Variable
# <chr> <POINT [°]> <int> <dbl> <dbl> <dbl>
#1 Site1 (-94.609 38.922) 5 -95.9 39.9 99
#2 Site2 (-98.1391 37.48611) 4 -98.9 37.5 201
#3 Site3 (-99.033 37.811) 6 -99.0 37.8 700
#4 Site4 (-98.49 38.364) 1 -98.5 38.3 400
#5 Site5 (-96.4309 39.4402) 2 -96.2 40.0 50
#6 Site6 (-95.99 39.901) 5 -95.9 39.9 99
st_join()
允许一步加入:
st_join(main, sub, join = st_nearest_feature, left = T)
#> although coordinates are longitude/latitude, st_nearest_feature assumes that they are planar
#> Simple feature collection with 6 features and 2 fields
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: -99.033 ymin: 37.48611 xmax: -94.609 ymax: 39.901
#> epsg (SRID): 4326
#> proj4string: +proj=longlat +datum=WGS84 +no_defs
#> # A tibble: 6 x 3
#> `Site#` geometry Variable
#> <chr> <POINT [°]> <dbl>
#> 1 Site1 (-94.609 38.922) 99
#> 2 Site2 (-98.1391 37.48611) 201
#> 3 Site3 (-99.033 37.811) 700
#> 4 Site4 (-98.49 38.364) 400
#> 5 Site5 (-96.4309 39.4402) 50
#> 6 Site6 (-95.99 39.901) 99
由 reprex package (v0.3.0)
于 2020-01-19 创建
我正在尝试合并两个数据框(主数据框和子数据框)。我希望 'sub' 中的 'variable' 数据根据距离或更好的距离合并到 'main',以 'sub' row/site 中最接近 [=17= 的那个为准] row/site.
library(sf)
a <- structure(list(`Site#` = c("Site1", "Site2", "Site3", "Site4", "Site5", "Site6"), Longitude = c(-94.609, -98.1391, -99.033, -98.49, -96.4309, -95.99), `Latitude` = c(38.922, 37.486111, 37.811, 38.364, 39.4402, 39.901)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
main <- st_as_sf(a, coords = c("Longitude", "Latitude"), crs = 4326)
b <- structure(list(Longitude = c(-98.49567, -96.22451, -98.49567, -98.941391, -95.91411, -99.031113), `Latitude` = c(38.31264,39.97692, 38.31264, 37.486111, 39.92143, 37.814171), Variable = c(400, 50, 100, 201, 99, 700)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
sub <- st_as_sf(b, coords = c("Longitude", "Latitude"), crs = 4326)
c <- st_intersection(main,sub)
c <- st_is_within_distance(main,sub,dist=0.001)
我相信 st_intersection 是我想要的,但如果我可以根据距离一对一地做到这一点,那就行得通了。有谁知道什么可以提供我正在寻找的结果?
这是我试过的。似乎您需要 st_nearest_feature()
,它获取最近要素的索引。一旦有了索引,就可以将它们添加到 main
。您还可以将行号(索引)添加到 b
。然后,你要处理加入。
library(dplyr)
library(sf)
# Which feature in y is closest to each feature in x?
# You get row index
st_nearest_feature(x = main, y = sub)
# Add the index number to main.
mutate(main, ind = st_nearest_feature(x = main, y = sub)) -> main
# Add row numbers (index) to b
mutate(b, ind = 1:n()) -> b
left_join(main, b, by = "ind")
# `Site#` geometry ind Longitude Latitude Variable
# <chr> <POINT [°]> <int> <dbl> <dbl> <dbl>
#1 Site1 (-94.609 38.922) 5 -95.9 39.9 99
#2 Site2 (-98.1391 37.48611) 4 -98.9 37.5 201
#3 Site3 (-99.033 37.811) 6 -99.0 37.8 700
#4 Site4 (-98.49 38.364) 1 -98.5 38.3 400
#5 Site5 (-96.4309 39.4402) 2 -96.2 40.0 50
#6 Site6 (-95.99 39.901) 5 -95.9 39.9 99
st_join()
允许一步加入:
st_join(main, sub, join = st_nearest_feature, left = T)
#> although coordinates are longitude/latitude, st_nearest_feature assumes that they are planar
#> Simple feature collection with 6 features and 2 fields
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: -99.033 ymin: 37.48611 xmax: -94.609 ymax: 39.901
#> epsg (SRID): 4326
#> proj4string: +proj=longlat +datum=WGS84 +no_defs
#> # A tibble: 6 x 3
#> `Site#` geometry Variable
#> <chr> <POINT [°]> <dbl>
#> 1 Site1 (-94.609 38.922) 99
#> 2 Site2 (-98.1391 37.48611) 201
#> 3 Site3 (-99.033 37.811) 700
#> 4 Site4 (-98.49 38.364) 400
#> 5 Site5 (-96.4309 39.4402) 50
#> 6 Site6 (-95.99 39.901) 99
由 reprex package (v0.3.0)
于 2020-01-19 创建