0

我有数据框:

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 和 longitude = 100.75。

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

4

3 回答 3

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
于 2013-03-08T08:36:47.830 回答
2

当心!你有经纬度坐标。不要使用假设坐标是平面的方法,即在垂直和水平方向上的测量单位是相同的,而地理坐标则不是这样。在示例数据中,它没有任何区别,但如果您有大量跨较大规模的数据,它可能会有所作为。相反,您应该考虑计算大圆距离(或它的一些导数)。试试这个:

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 公里)。这里有一篇关于不同距离计算方法的精彩博客文章

于 2013-03-08T09:11:02.850 回答
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:)
于 2013-03-08T09:00:13.467 回答