R中两个坐标之间的关联

时间:2013-03-28 15:33:47

标签: r geolocation geospatial distance

我的空间数据存在问题。 我需要从NetCDF文件中提取温度数据;然后我需要将给定纬度和经度的温度与另一个数据帧中包含的另一组纬度和经度相关联。 这是我用来提取变量的代码:

myfile <- nc_open(paste(wd, 'myfile.nc', sep=''))
timearr = ncvar_get(myfile, "time")  
temp <- ncvar_get(myfile, 'temp_srf')
lat <- ncvar_get(myfile, 'lat_rho')
lon <- ncvar_get(myfile, 'lon_rho')
dim(temp)

[1] 27 75 52         # which means: 27 longitude * 75 latitudes * 52 time steps

我现在选择在第一时间温度工作。所以:

> t1 <- as.vector(temp[,,1])

然后我在第一时间步骤创建了一个包含lat,lon和temperature的data.frame:

lat1 <- as.vector(lat)
lon1 <- as.vector(lon)
df1 <- as.data.frame(cbind(lon1, lat1, t1))
head(df1)

    lon1    lat1     t1
1 18.15338  40.48656 13.96225
2 18.24083  40.55126 14.36726
3 18.32845  40.61589 14.53822
4 18.41627  40.68045 14.78643
5 18.50427  40.74495 14.88624
6 18.59246  40.80938 14.95925

在另一个数据框(df2)中,我有一些经纬度的随机点,我必须与之前data.frame的最近纬度和经度相关联。

> df2 <- read.csv(paste(id, "myfile.csv", sep=""), header=TRUE, sep=",")
> head(df2)

    LONs     LATs
1 14.13189 43.41072
2 14.13342 43.34871
3 14.09980 43.40822
4 14.05338 43.72771
5 13.91311 43.88051
6 13.98500 43.91164

我想要获得每个点之间的距离并获得最低点,但我不知道该怎么做。不确定是否还有其他解决方案。

2 个答案:

答案 0 :(得分:2)

我假设您的数据是投影坐标,并且您需要计算很大的圆距离。您可以自己使用公式(请参阅my answer here),也可以使用包rdist.earth中的fields。对于df2中的每个条目,计算df1中所有条目的距离,找到该向量中最小距离的索引,并使用该索引选择要分配的相应行df1临时为df2。它只需要一行(但是可以更清楚地将步骤分成几个命令):

require( fields )
df2["Temp"] <- df1[ sapply( seq_len( nrow(df2) ) , function(x){ which.min( rdist.earth( df2[x,] , as.matrix( df1[ c("lon1" , "lat1") ] ) , miles = FALSE, R = 6371 ) ) } ) , "t1" ]

And the results using your data:
df1
#         lon1     lat1       t1
#   1 18.15338 40.48656 13.96225
#   2 18.24083 40.55126 14.36726
#   3 18.32845 40.61589 14.53822
#   4 18.41627 40.68045 14.78643
#   5 18.50427 40.74495 14.88624
#   6 18.59246 40.80938 14.95925

df2
#         LONs     LATs     Temp
#   1 14.13189 43.41072 13.96225
#   2 14.13342 43.34871 13.96225
#   3 14.09980 43.40822 13.96225
#   4 14.05338 43.72771 14.53822
#   5 13.91311 43.88051 14.53822
#   6 13.98500 43.91164 14.78643

看起来您的距离至少相距Km(此数据中> 300km),因此您应该使用Great Circle公式获得良好的精确度。如果它们小于1km,您可能想要使用Haversine formula

答案 1 :(得分:0)

我想要获得两个纬度/经度坐标之间距离的两个公式是Haversine formulaVincenty's formula。 Haversine公式是一个更简单的公式,假设地球是一个完美的球体。您可能会将精度提高到几英尺。如果您需要更高的准确度,请尝试Vincenty的公式。它是基于球体的,试图解释地球不完美的球体形状。链接上的样本不在R中,但在R中重写它们并不困难。