Foro de debate

Distancia mínima entre coordenadas. Cómo asignar las coordenadas más cercanas

Distancia mínima entre coordenadas. Cómo asignar las coordenadas más cercanas

de Francisco Javier -
Número de respuestas: 2
Hola, estoy tratando de crear un bucle usando "for" para calcular las distancias mínimas entre puntos (en coordenadas Latitud - Longitud) en dos marcos de datos

En mi caso, tengo un marco de datos1 con más de 1,000 puntos y otro (marco de datos2) con más de 10,000 puntos, y necesito asignar los puntos más cercanos en el marco de datos2 a cada punto en el marco de datos1

La distancia entre dos puntos se calcula mediante la fórmula:

Este es un ejemplo de marcos de datos con coordenadas:

coordenadas1 <- data.frame ("X1" = c (70,10,50), "Y1" = c (20,5,60))

coordenadas2 <- data.frame ("X2" = c (1,2,45,7,8,5,4,13,3,6), "Y2" = c (2,5,36,4,3, 2,6,27,9,8))

¿Alguien podría ayudarme a solucionarlo? Muchas gracias por adelantado
Saludos, Javi
En respuesta a Francisco Javier

Re: Distancia mínima entre coordenadas. Cómo asignar las coordenadas más cercanas

de Francisco Javier -
Este es mi intento pero no me funciona:

```{r}
df1 <- data.frame ("x1" = c (70,10,50), "y1" = c (20,5,60))

df2 <- data.frame ("x2" = c (1,2,45,7,8,5,4,13,3,6), "y2" = c (2,5,36,4,3, 2,6,27,9,8))

dist_func = function (x1, y1, x2, y2){
dist = sqrt(((x2 - x1)^2) + ((y2-y1)^2))
return(dist)
}

# Container columns for closest point
df1$x_closest = NA
df1$y_closest = NA

for(i in 1:nrow(df1)){
min_dist = 0
x1 = df1$x[i]
y1 = df1$y[i]
for(j in 1:nrow(df2)){
x2 = df2$x[j]
y2 = df2$y[j]
current_dist = dist_function(x1, y1, x2, y2)
if(j == 1){
min_dist = current_dist
x_closest = x2
y_closest = y2
}
if(current_dist < min_dist){
min_dist = current_dist
x_closest = x2
y_closest = y2
}
}
df1$x_closest[i] = x_closest
df1$y_closest[i] = y_closest
}
```
En respuesta a Francisco Javier

Re: Distancia mínima entre coordenadas. Cómo asignar las coordenadas más cercanas

de Francisco Javier -

 

Solucionado!!

 

```{r}
df1 <- data.frame("x1"=c(70,10,50), "y1"=c(20,25,60))

df2 <- data.frame("x2"=c(1,2,45,7,8,5,4,13,3,6), "y2"=c(2,5,36,4,3,2,6,27,9,8))

dist_func = function (x1, y1, x2, y2){
dist = sqrt(((x2 - x1)^2) + ((y2-y1)^2))
return(dist)
}

# Container columns for closest point
df1$x_closest = NA
df1$y_closest = NA
df1$dist = NA

for(i in 1:nrow(df1)){
min_dist = 0
x1 = df1$x1[i]
y1 = df1$y1[i]
for(j in 1:nrow(df2)){
x2 = df2$x2[j]
y2 = df2$y2[j]
current_dist = dist_function(x1, y1, x2, y2)
if(j == 1){
min_dist = current_dist
x_closest = x2
y_closest = y2
}
if(current_dist < min_dist){
min_dist = current_dist
x_closest = x2
y_closest = y2
}
}
df1$x_closest[i] = x_closest
df1$y_closest[i] = y_closest
df1$dist[i] = min_dist
}

```