1

我对空间数据有疑问。我需要从 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

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

4

2 回答 2

2

我假设您的数据是投影坐标,并且您需要计算大圆距离。您可以自己使用公式(请参阅我的答案here),也可以rdist.earth从包中使用fields。对于 中的每个条目df2,计算与 中所有条目的距离df1,找到该向量中最小距离的索引,并使用该索引选择适当的行df1以将 temp 分配给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

看起来您的距离至少相距一公里(在此数据中 > 300 公里),因此您应该使用大圆公式获得良好的准确性。如果它们小于 1 公里,您可能需要使用Haversine 公式

于 2013-03-28T15:57:57.353 回答
0

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

于 2013-03-28T16:03:02.793 回答