我有数据框:
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。
有人可以告诉我如何得到答案吗?
答案 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:)