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

使用R检查位置是否在一组其他位置的特定距离内,r,match,geospatial,distance,latitude-longitude,R,Match,Geospatial,Distance,Latitude Longitude,我已经试着解决这个问题有一段时间了,但我似乎不能完全理解它。我对R还是个新手,也是这里的第一张海报。我尽可能地遵守规则,但是如果我错过了什么或者可以做得更好,请告诉我 我试图做的是将一组地点(POI)与一组行程的停靠位置相匹配。两组的位置均在纬度/纵向坐标中。如果行程位置在POI(POI$rad)半径范围内,则应返回POI的名称(POI$station) 到目前为止,我已经做到了: station <- c("a", "b", "c") lat <- c(47.61870, 47.6

我已经试着解决这个问题有一段时间了,但我似乎不能完全理解它。我对R还是个新手,也是这里的第一张海报。我尽可能地遵守规则,但是如果我错过了什么或者可以做得更好,请告诉我

我试图做的是将一组地点(POI)与一组行程的停靠位置相匹配。两组的位置均在纬度/纵向坐标中。如果行程位置在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)

车站你要找的就是这个吗

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

d
outer
功能可能有帮助:
outer(1:nrow(旅程),1:nrow(POI),功能(x,y)earth.dist(旅程$lat[x],旅程$lng[x],POI$lat[y],POI$lng[y])
将为每个
旅程调用
earth.dist
来对抗任何
POI
。您可以使用
apply
功能将您的ifelse应用到
旅程的每一行
中:
t(应用(旅程,1,函数(x){ifelse(earth.dist(x[2],x[3],POI$lat,POI$lng)为了清楚起见,以上两种方法都可以,但请注意参数的顺序——问题中定义的
earth.dist
函数是
lng
然后
lat
——因此使用@NicE solution,您将需要:
t(apply(旅程,1,函数(x){ifelse(earth.dist(x[3],x[2],POI$lng,POI$lat)感谢您的关注,OP可能在他的帖子中也有错误,没有检查数学@roger您可能还想看看
地球圈
软件包,它有一些计算距离的函数谢谢大家的帮助。我确实改变了
纬度
液化天然气
的顺序,谢谢@JasonAizkalns。我已经尝试了
应用
方法,但它会产生一个18行的
旅程
表格,其中前6行是正常的,第1行是
POI
的结果,第7-12行是
POI
的第2行的结果,第13-18行是
POI
的第3行的结果ourney
。这可能吗?另外,关于
geosphere
软件包@NicE的好提示,我一定会仔细研究。是的!这正是我想要的。谢谢你(当然还有其他人)的帮助。现在来弄清楚它是如何工作的……)
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])