Calculo Distancia entre Coordenadas [loop]

Boa Tarde, Estou escrevendo um algorítimo que calcule a distância entre uma serie de coordenadas e retorne qual o ponto mais próximo. Para isso, o código utiliza dois datasets de coordenadas geográficas (lat/long) e o calculo da distancia é feito utilizando a biblioteca "geosphere". Porém, basicamente todos os resultados do algorítimo sempre apontam para a ultimo ponto do segundo dataset como sendo o mais próximo, assim creio ter algum erro no loop. Alguma sugestão? Abaixo o código ______ #biblioteca necessária #install.packages("geosphere") library("geosphere") #carregar arquivos x <- read.csv(file.choose(),sep=";",dec=",") # carregar lista de pontos nominais TIM y <- read.csv(file.choose(),sep=";",dec=",") # carregar base de sites #converter site id em characther x$SiteID <- as.character(x$SiteID) y$SITE.ID <- as.character(y$SITE.ID) #Mostrar tabelas View(y) View(x) dista1 <- c() #distancia do ponto nominal ao site # Calculo Distancia for (i in 1:216) { coord1 <- c(x$LONG[i],x$LAT[i]) for (j in 1:11195 ) { coord2 <- c(y$Longitude[j],y$Latitude[j]) dista1[j] <- as.numeric(distm(coord1,coord2, fun = distGeo)) #Calculo da menor distancia if (j>1) { k <- j-1 if (dista1[j]<dista1[k]) { menor_dist <- dista1[j] x$Distancia[i] <- menor_dist x$SiteID[i] <- y$SITE.ID[j] } else { menor_dist <- dista1[k] x$Distancia[i] <- menor_dist x$SiteID[i] <- y$SITE.ID[k] } } } } write.csv(x, "Resultado.csv", row.names = FALSE) _______________ Resultado retornado: ï*..END_ID* *LAT* *LONG* *Distancia (m)* *SiteID* BASDR_1 -1.296.434 -3.847.421 144.669.250.579.953 YBARWL BALFS_2 -1.289.767 -3.832.365 146.401.362.045.206 YBARWL CEFLA_3 -377.709 -3.855.802 222.607.630.292.628 YBARWL Distancia (m) = distancia ao ponto mais próximo SiteID = nome do ponto mais próximo. At.te Bruno

Boa tarde Bruno, Seria ideal colocar um exemplo dos dois data frames para que possamos reproduzir. Mas da uma olhada na condicional. Eh isso mesmo que você quer? # Calculo Distancia for (i in 1:216) { coord1 <- c(x$LONG[i],x$LAT[i]) for (j in 1:11195 ) { coord2 <- c(y$Longitude[j],y$Latitude[j]) dista1[j] <- as.numeric(distm(coord1,coord2, fun = distGeo)) #Calculo da menor distancia ### AQUI, a condição executa se j > 1. Na verdade, o j varia de 1 a 11195. Eh isso mesmo? if (j>1) { k <- j-1 if (dista1[j]<dista1[k]) { menor_dist <- dista1[j] x$Distancia[i] <- menor_dist x$SiteID[i] <- y$SITE.ID[j] } else { menor_dist <- dista1[k] x$Distancia[i] <- menor_dist x$SiteID[i] <- y$SITE.ID[k] } } } } daniel
On Dec 17, 2018, at 2:23 PM, Bruno Rhuan por (R-br) <r-br@listas.c3sl.ufpr.br> wrote:
Boa Tarde,
Estou escrevendo um algorítimo que calcule a distância entre uma serie de coordenadas e retorne qual o ponto mais próximo.
Para isso, o código utiliza dois datasets de coordenadas geográficas (lat/long) e o calculo da distancia é feito utilizando a biblioteca "geosphere".
Porém, basicamente todos os resultados do algorítimo sempre apontam para a ultimo ponto do segundo dataset como sendo o mais próximo, assim creio ter algum erro no loop.
Alguma sugestão?
Abaixo o código
______
#biblioteca necessária #install.packages("geosphere") library("geosphere")
#carregar arquivos x <- read.csv(file.choose(),sep=";",dec=",") # carregar lista de pontos nominais TIM y <- read.csv(file.choose(),sep=";",dec=",") # carregar base de sites
#converter site id em characther x$SiteID <- as.character(x$SiteID) y$SITE.ID <http://site.id/> <- as.character(y$SITE.ID <http://site.id/>)
#Mostrar tabelas View(y) View(x)
dista1 <- c() #distancia do ponto nominal ao site
# Calculo Distancia for (i in 1:216) { coord1 <- c(x$LONG[i],x$LAT[i]) for (j in 1:11195 ) { coord2 <- c(y$Longitude[j],y$Latitude[j]) dista1[j] <- as.numeric(distm(coord1,coord2, fun = distGeo)) #Calculo da menor distancia if (j>1) { k <- j-1 if (dista1[j]<dista1[k]) { menor_dist <- dista1[j] x$Distancia[i] <- menor_dist x$SiteID[i] <- y$SITE.ID <http://site.id/>[j] } else { menor_dist <- dista1[k] x$Distancia[i] <- menor_dist x$SiteID[i] <- y$SITE.ID <http://site.id/>[k] } } } }
write.csv(x, "Resultado.csv", row.names = FALSE)
_______________
Resultado retornado:
ï..END_ID LAT LONG Distancia (m) SiteID BASDR_1 -1.296.434 -3.847.421 144.669.250.579.953 YBARWL BALFS_2 -1.289.767 -3.832.365 146.401.362.045.206 YBARWL CEFLA_3 -377.709 -3.855.802 222.607.630.292.628 YBARWL
Distancia (m) = distancia ao ponto mais próximo SiteID = nome do ponto mais próximo.
At.te
Bruno
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
participantes (2)
-
Bruno Rhuan
-
Daniel Guimarães Tiezzi