【问题标题】:Association between two coordinates in RR中两个坐标之间的关联
【发布时间】:2013-03-19 03:13:14
【问题描述】:

我对空间数据有疑问。 我需要从 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) 中,我有一些随机的经纬度点,我必须将其与前一个数据帧的最近纬度和经度相关联:

> 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

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

【问题讨论】:

  • 有多种解决方案,但这取决于您是否有投影坐标或平面坐标。投影就像您在手机或 GPS 设备(我怀疑您有)上使用的经纬度,并以角度测量。
  • 要求(sp); ?spDistsN1

标签: r geolocation geospatial distance


【解决方案1】:

我假设您的数据是投影坐标,并且您需要计算大圆距离。您可以自己使用公式(参见my answer here),也可以使用fields 包中的rdist.earth。对于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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2021-12-14
      • 2010-11-23
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多