[R-br] Calculo Distancia entre Coordenadas [loop]

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[R-br] Calculo Distancia entre Coordenadas [loop]

R-br mailing list

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


_______________________________________________
R-br mailing list
[hidden email]
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.
Reply | Threaded
Open this post in threaded view
|

Re: [R-br] Calculo Distancia entre Coordenadas [loop]

R-br mailing list
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) <[hidden email]> 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 <- 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

_______________________________________________
R-br mailing list
[hidden email]
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.


_______________________________________________
R-br mailing list
[hidden email]
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.