R根据两个数据帧的经纬度计算距离
R calculate distance based on latitude-longitude from two data frames
我正在尝试根据条件用另一个数据框中的值替换一个数据框中的值。
两个数据都包含纬度、经度和高度,但其中一个较短。我想从较短的数据框(5103 行)中选择任何一点,在第二个数据框(188426 行)上找到最接近的纬度和经度值(通过计算距离),然后用最长的数据框替换高度值短的高度。
下面代码中的第一个数据帧是topo.rams,第二个是topo.msg。最终目的是将 topo.msg 中的高度替换为 topo.rams
中的高度值
topo.rams:
longitud,latitud,tempc,u,v,w,relhum,speed,topo
-1.7107, 38.1464, 18.2412, -6.1744, -0.3708, 0.0000, 58.6447, 6.3584,460.5908
-1.7107, 38.1734, 18.5915, -5.7757, -0.3165, 0.0000, 61.8492, 5.9840,416.0403
topo.msg
height,longitud,latitud
448.0, 1.70, 38.14
402.0, 1.70, 38.18
和所需的输出(topo.msg 已修改)
height,longitud,latitud
460.5908, 1.70, 38.14
416.0403, 1.70, 38.18
和使用的代码
#lectura de datos
topo.msg=read.csv("MSG_DEM.txt",sep=",",header=FALSE)
colnames(topo.msg) <- c("topoMSG","longitud","latitud")
topo.rams=read.csv("topografia-rams.txt",sep=",",header=TRUE)
# número de estaciones a tratar
puntos.rams=dim(topo.rams)[1]
puntos.msg=dim(topo.msg)[1]
# Localización del punto de MSG más próximo a la estación.
# Se calcula la distancia a partir de las coordenadas lat-lon
topo.temp=data.frame()
for(i in 1:puntos.rams)
{
for(j in 1:puntos.msg)
{
dlon<-topo.rams$longitud[i]-topo.msg$longitud
if ( dlon < 0.5 && dlat < 0.5) {
dlat<-topo.rams$latitud[i]-topo.msg$latitud
if ( dlat < 0.5) {
n1<-n1+1
distancia=sqrt(dlon*dlon+dlat*dlat)
}
}
indexj=which.min(distancia)
}
topo.msg$topo[indexj] = topo.rams$topo[i]
}
这段代码似乎运行但是需要很长时间。我还尝试使用 中 post 的 geosphere 包创建距离矩阵
但是 R 抱怨分配 3.6 Gb。
我该如何解决这个问题?我想优化循环或使用距离矩阵。当然,必须有一种更简洁、更有效的方法来计算距离。
提前致谢
根据 Patric 的评论,我从循环切换到 matrix/vector 计算。现在的代码是运行,更简单,更高效。
for(i in 1:puntos.rams)
{
dlon<-topo.rams$longitud[i]-topo.msg$longitud
dlat<-topo.rams$latitud[i]-topo.msg$latitud
distancia<-matrix(sqrt(dlon*dlon+dlat*dlat))
indexj=which.min(distancia)
topo.temp$topo[indexj] = topo.rams$topo[i]
}
可能有更优雅的方法来进行此计算。我将不胜感激任何意见。
我正在尝试根据条件用另一个数据框中的值替换一个数据框中的值。
两个数据都包含纬度、经度和高度,但其中一个较短。我想从较短的数据框(5103 行)中选择任何一点,在第二个数据框(188426 行)上找到最接近的纬度和经度值(通过计算距离),然后用最长的数据框替换高度值短的高度。
下面代码中的第一个数据帧是topo.rams,第二个是topo.msg。最终目的是将 topo.msg 中的高度替换为 topo.rams
中的高度值topo.rams:
longitud,latitud,tempc,u,v,w,relhum,speed,topo
-1.7107, 38.1464, 18.2412, -6.1744, -0.3708, 0.0000, 58.6447, 6.3584,460.5908
-1.7107, 38.1734, 18.5915, -5.7757, -0.3165, 0.0000, 61.8492, 5.9840,416.0403
topo.msg
height,longitud,latitud
448.0, 1.70, 38.14
402.0, 1.70, 38.18
和所需的输出(topo.msg 已修改)
height,longitud,latitud
460.5908, 1.70, 38.14
416.0403, 1.70, 38.18
和使用的代码
#lectura de datos
topo.msg=read.csv("MSG_DEM.txt",sep=",",header=FALSE)
colnames(topo.msg) <- c("topoMSG","longitud","latitud")
topo.rams=read.csv("topografia-rams.txt",sep=",",header=TRUE)
# número de estaciones a tratar
puntos.rams=dim(topo.rams)[1]
puntos.msg=dim(topo.msg)[1]
# Localización del punto de MSG más próximo a la estación.
# Se calcula la distancia a partir de las coordenadas lat-lon
topo.temp=data.frame()
for(i in 1:puntos.rams)
{
for(j in 1:puntos.msg)
{
dlon<-topo.rams$longitud[i]-topo.msg$longitud
if ( dlon < 0.5 && dlat < 0.5) {
dlat<-topo.rams$latitud[i]-topo.msg$latitud
if ( dlat < 0.5) {
n1<-n1+1
distancia=sqrt(dlon*dlon+dlat*dlat)
}
}
indexj=which.min(distancia)
}
topo.msg$topo[indexj] = topo.rams$topo[i]
}
这段代码似乎运行但是需要很长时间。我还尝试使用
我该如何解决这个问题?我想优化循环或使用距离矩阵。当然,必须有一种更简洁、更有效的方法来计算距离。
提前致谢
根据 Patric 的评论,我从循环切换到 matrix/vector 计算。现在的代码是运行,更简单,更高效。
for(i in 1:puntos.rams)
{
dlon<-topo.rams$longitud[i]-topo.msg$longitud
dlat<-topo.rams$latitud[i]-topo.msg$latitud
distancia<-matrix(sqrt(dlon*dlon+dlat*dlat))
indexj=which.min(distancia)
topo.temp$topo[indexj] = topo.rams$topo[i]
}
可能有更优雅的方法来进行此计算。我将不胜感激任何意见。