我假设我们有一个数据框circles
每个圆的中心和半径,并且问题中发布的示例数据位于名为的数据框中dat
。下面的代码向量化距离的计算并使用lapply
计算每个点到每个圆中心的距离,并确定每个点是否在该圆的半径内。
library(geosphere)
# We'll check the distance of each data point from the center of each
# of these circles
circles = data.frame(ID=1:2, lon=c(17.074, 17.076), lat=c(48.1513, 48.15142),
radius=c(180,190))
datNew = lapply(1:nrow(circles), function(i) {
df = dat
df$dist = distHaversine(df[,c("longitude", "latitude")],
circles[rep(i,nrow(df)), c('lon','lat')])
df$in_circle = ifelse(df$dist <= circles[i, "radius"], "Yes", "No")
df$circle_id = circles[i, "ID"]
df
})
datNew = do.call(rbind, datNew)
datNew
latitude longitude sensor_time sensor_time2 time3 dist in_circle circle_id
1 48.15144 17.07569 1447149703 2015-11-10 11:01:43 126.47756 Yes 1
2 48.15404 17.07452 1447149743 2015-11-10 11:02:23 307.45048 No 1
3 48.15277 17.07514 1447149762 2015-11-10 11:02:42 184.24465 No 1
4 48.15208 17.07538 1447149771 2015-11-10 11:02:51 134.32601 Yes 1
5 48.15461 17.07560 1447149773 2015-11-10 11:02:53 387.15358 No 1
6 48.15139 17.07562 1447149811 2015-11-10 11:03:31 120.73138 Yes 1
7 48.15446 17.07517 1447149866 2015-11-10 11:04:26 362.34236 No 1
8 48.15266 17.07330 1447149993 2015-11-10 11:06:33 160.07179 Yes 1
9 48.15144 17.07569 1447149703 2015-11-10 11:01:43 23.13059 Yes 2
10 48.15404 17.07452 1447149743 2015-11-10 11:02:23 311.68096 No 2
11 48.15277 17.07514 1447149762 2015-11-10 11:02:42 163.29068 Yes 2
12 48.15208 17.07538 1447149771 2015-11-10 11:02:51 86.70762 Yes 2
13 48.15461 17.07560 1447149773 2015-11-10 11:02:53 356.34955 No 2
14 48.15139 17.07562 1447149811 2015-11-10 11:03:31 28.41890 Yes 2
15 48.15446 17.07517 1447149866 2015-11-10 11:04:26 343.97933 No 2
16 48.15266 17.07330 1447149993 2015-11-10 11:06:33 243.44024 No 2
现在我们有一个数据框告诉我们每个点是否在给定的圆内。数据帧是长格式,这意味着有n
原始数据框中每个点的行dat
, where n
是行数circles
数据框。从这里,您可以进行进一步的处理,例如为多个圆圈中的每个点保留一行,等等。
这是一个例子。我们将返回一个数据框,列出点所在的圆,或者如果该点不在任何圆内,则返回“None”:
library(dplyr)
datNew %>%
group_by(latitude, longitude) %>%
summarise(in_which_circles = if(any(in_circle=="Yes")) paste(circle_id[in_circle=="Yes"], collapse=",") else "None")
latitude longitude in_which_circles
<dbl> <dbl> <chr>
1 48.15139 17.07562 1,2
2 48.15144 17.07569 1,2
3 48.15208 17.07538 1,2
4 48.15266 17.07330 1
5 48.15277 17.07514 2
6 48.15404 17.07452 None
7 48.15446 17.07517 None
8 48.15461 17.07560 None