使用R检查位置是否在一组其他位置的特定距离内

时间:2015-03-03 15:34:31

标签: r match geospatial distance latitude-longitude

我一直试图解决这个问题一段时间,但我似乎无法绕过它。我还是R的新手,也是这里的第一次海报。我尽可能地遵守规则,但如果我错过了什么或者能做得更好,请告诉我。

我要做的是将一组地点(POI' s)与一组旅程的停止位置相匹配。两组的位置在纬度/纵向坐标中。如果旅程位置在POI(POI $ rad)的半径范围内,则应返回POI的名称(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)

这并没有真正做到我想要的,因为我认为这比较了“旅程”中的第1行&#39;第1行&#39; POI&#39;,第2行&#39;旅程&#39;第2行&#39; POI&#39;等等。如果我通过添加以下内容将POI减少为单行:

POI <- subset(POI, POI$station =="c")

在最后一行之前,它似乎确实正常工作。不幸的是,只针对那一个POI。我想我想要的是&#39;旅程&#39;与POI&#39;的所有行进行比较。

这确实是这样做的正确方法吗? 如果是这样,我做错了什么? 如果不是......我做错了什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

是这样,想要你在找?

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])