使用 R 检查位置是否在一组其他位置的一定距离内
Check if location is within a certain distance of a set of other locations using R
我已经尝试解决这个问题一段时间了,但我似乎无法解决这个问题。我还是 R 的新手,也是第一次发帖。我尽量遵守规则,但如果我遗漏了什么或可以做得更好,请告诉我。
我想要做的是将一组地点 (POI) 与一组旅程的停靠点相匹配。两组的位置都在 latitudinal/longitudinal 坐标中。如果旅程位置在兴趣点(POI$rad)的半径内,则应返回兴趣点的名称(POI$station)。
到目前为止我得到了这个:
station <- c("a", "b", "c")
lat <- c(47.61870, 47.61422, 47.60603)
lng <- c(-122.34414, -122.32062, -122.32410)
rad <- c(0.075, 0.075, 0.175)
POI <- as.data.frame(list(station=station, lat=lat, lng=lng, rad=rad),
row.names = NULL, stringsAsFactors = FALSE)
journeynr <- c(1:6)
lat <- c(47.60643, 47.61013, 47.61855, 47.61855, 47.61432,47.61408)
lng <- c(-122.32404, -122.33355, -122.33263, -122.34437, -122.32082, -122.31914)
journey <- as.data.frame(list(journeynr=journeynr, lat=lat, lng=lng),
row.names = NULL, stringsAsFactors = FALSE)
earth.dist <- function (long1, lat1, long2, lat2)
{
rad <- pi/180
a1 <- lat1 * rad
a2 <- long1 * rad
b1 <- lat2 * rad
b2 <- long2 * rad
dlon <- b2 - a2
dlat <- b1 - a1
a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1 - a))
R <- 6378.145
d <- (R * c)
return(d)
}
journey$test <- ifelse(earth.dist(journey$lat, journey$lng,
POI$lat, POI$lng) <= POI$rad, POI$station ,NA)
这并不是我想要的,因为我认为这比较了 'journey' 的第 1 行和 'POI' 的第 1 行,'journey' 的第 2 行和 'journey' 的第 2 行'POI',等等。如果我通过添加以下内容将 POI 减少到单行:
POI <- subset(POI, POI$station =="c")
就在最后一行之前,它似乎工作正常。不幸的是,仅针对那个 POI。我想我想要的是 'journey' 的第 1 行与 'POI'.
的所有行进行比较
这确实是正确的方法吗?
如果是这样,我做错了什么?
如果不是...我做错了什么?
感谢您的帮助!
你要找的是这个吗?
d <- outer(1:nrow(journey), 1:nrow(POI),
FUN=function(i, j)
earth.dist(journey[i,"lng"], journey[i,"lat"],
POI[j,"lng"], POI[j, "lat"]))
apply(apply(d, 1, "-", POI$rad) < 0, 2, function(x) POI$station[x])
我已经尝试解决这个问题一段时间了,但我似乎无法解决这个问题。我还是 R 的新手,也是第一次发帖。我尽量遵守规则,但如果我遗漏了什么或可以做得更好,请告诉我。
我想要做的是将一组地点 (POI) 与一组旅程的停靠点相匹配。两组的位置都在 latitudinal/longitudinal 坐标中。如果旅程位置在兴趣点(POI$rad)的半径内,则应返回兴趣点的名称(POI$station)。
到目前为止我得到了这个:
station <- c("a", "b", "c")
lat <- c(47.61870, 47.61422, 47.60603)
lng <- c(-122.34414, -122.32062, -122.32410)
rad <- c(0.075, 0.075, 0.175)
POI <- as.data.frame(list(station=station, lat=lat, lng=lng, rad=rad),
row.names = NULL, stringsAsFactors = FALSE)
journeynr <- c(1:6)
lat <- c(47.60643, 47.61013, 47.61855, 47.61855, 47.61432,47.61408)
lng <- c(-122.32404, -122.33355, -122.33263, -122.34437, -122.32082, -122.31914)
journey <- as.data.frame(list(journeynr=journeynr, lat=lat, lng=lng),
row.names = NULL, stringsAsFactors = FALSE)
earth.dist <- function (long1, lat1, long2, lat2)
{
rad <- pi/180
a1 <- lat1 * rad
a2 <- long1 * rad
b1 <- lat2 * rad
b2 <- long2 * rad
dlon <- b2 - a2
dlat <- b1 - a1
a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1 - a))
R <- 6378.145
d <- (R * c)
return(d)
}
journey$test <- ifelse(earth.dist(journey$lat, journey$lng,
POI$lat, POI$lng) <= POI$rad, POI$station ,NA)
这并不是我想要的,因为我认为这比较了 'journey' 的第 1 行和 'POI' 的第 1 行,'journey' 的第 2 行和 'journey' 的第 2 行'POI',等等。如果我通过添加以下内容将 POI 减少到单行:
POI <- subset(POI, POI$station =="c")
就在最后一行之前,它似乎工作正常。不幸的是,仅针对那个 POI。我想我想要的是 'journey' 的第 1 行与 'POI'.
的所有行进行比较这确实是正确的方法吗? 如果是这样,我做错了什么? 如果不是...我做错了什么?
感谢您的帮助!
你要找的是这个吗?
d <- outer(1:nrow(journey), 1:nrow(POI),
FUN=function(i, j)
earth.dist(journey[i,"lng"], journey[i,"lat"],
POI[j,"lng"], POI[j, "lat"]))
apply(apply(d, 1, "-", POI$rad) < 0, 2, function(x) POI$station[x])