从数据框中查找最接近的纬度和经度以及Z值

时间:2013-03-08 08:10:08

标签: r

我有数据框:

data <- data.frame(long = c( 50.75  80.75   0.75  65.75  70.75  75.75 100.75 105.75 110.75         
                  -4.25  65.75,100.55), lat=c(13.3 13.8 13.8 13.8 13.8 13.8 13.8 13.8 13.8 
                   13.8 13.8,14.8), XCh4 c(1739.9 1737.5 1740.5 1715.7 1728.5 1745.0 1724.6
                   1734.2 1733.4 1713.6 1716.3 1725.3))

我的电台值是

lon<- 100.60

lat <-13.4

那么我应该如何提取最近的纬度和经度到站点并获得z值?
我试过了:

lat.match   <- which(abs(data[[3]]$lat - 13.04) == min(abs(data[[3]]$lat - 14.04)))[1]

lon.match   <- which(abs(data$long - 100.60)== min(abs(data$long- 100.60)))[1]

data[data$long[lon.match] & data$lat[lat.match],]

我没有得到纬度经度的确切对,假设为lat = 13.8和经度= 100.75。

有人可以告诉我如何得到答案吗?

3 个答案:

答案 0 :(得分:2)

编辑以确认纬度收缩减少了经度差异,并且代码计算的不是“距离”而是“度平方”:

data$degr.sqrd <- ( (lon-data$long)*cos(90*data$lat ) )^2 + (lat-data$lat)^2
 which.min(data$degr.sqrd)
#[1] 7
data[ which.min(data$degr.sqrd), "XCh4"]
#[1] 1724.6

data[ which.min(data$degr.sqrd), ]
#    long  lat   XCh4 degr.sqrd
#7 100.75 13.8 1724.6 0.1651696

答案 1 :(得分:1)

小心!你有lat-long坐标。不要使用假定坐标是平面的方法,即在垂直和水平方向上测量单位是相同的,而地理坐标不是这种情况。在示例数据中,它没有什么区别,但如果您有更大规模的大量数据,它可能会有所作为。相反,你应该考虑计算大圆距离(或其一些衍生物)。试试这个:

r <- 6371 # radius of the Earth
#Coordinates need to be in radians
data$longR <- data$long * pi/180
data$latR <- data$lat * pi/180
lon <- 100.60 * pi/180
lat <- 13.4 * pi/180
data$dist <- acos(sin( lat ) * sin( data$latR ) + cos( lat ) * cos( data$latR) * cos( data$longR -lon ) ) * r
data[ which.min( data$dist ) , ]
    long  lat   XCh4    longR      latR    dist
7 100.75 13.8 1724.6 1.758419 0.2408554 47.3403

距离度量与地球半径的大小相同(在这种情况下为47.3 km)。有一篇关于不同距离计算方法{@ 3}}

的博文

答案 2 :(得分:0)

使用dist

的另一种解决方案
mat <- dist(cbind(c(data$lat,lat),c(data$long,lon)))
n <- attr(mat,'Size')
i <- 1:n
j <- n
v <- mat[n*(i-1) - i*(i-1)/2 + j-i]
data[which.min(v),]
long  lat   XCh4   dist
7 100.75 13.8 1724.6 0.1825

此处的优点是,您可以更改距离,例如:

mat <- dist(cbind(c(data$lat,lat),c(data$long,lon)),meath='minkowski')

data[which.min(v),]
    long  lat   XCh4   dist
7 100.75 13.8 1724.6 0.1825  ## not really representative , we get the same result:)