Foro de debate

Calculo de rutas en R

 
Imagen de Rafa Trigo
Re: Calculo de rutas en R
de Rafa Trigo - viernes, 26 de julio de 2019, 13:55
 

Gracias por tu respuesta, por supuesto os envío un ejemplo de mi problema:

```

library(ggplot2)

library(tspmeta)


coord=read.csv2("CoordinatesUKExample.txt")

coords.df=data.frame(long=coord$Longitude,lat=coord$Latitude)

coords.mx=as.matrix(coords.df)

dist.mx=dist(coords.df)

tsp.ins <-tsp_instance(coords.mx,dist.mx)

tour=run_solver(tsp.ins,method="2-opt")

autoplot(tsp.ins,tour)

head(coord)

#> Postcode          City Latitude           Longitude

#> 1 AB53 8BJ Aberdeenshire   57.52995 -2.4509960

#> 2 NE46 4SA       Acomb 54.99080 -2.1184036

#> 3 NE66 2HT       Alnwick 55.39723 -1.6900000

#> 4 CA16 6QR       Appleby 54.57808 -2.4929927

#> 5 CA16 6JP        Appleby 54.60883 -2.5188636

#> 6  CO7 7LG        Ardeigh 51.92808           0.9833302


```

Camino optimo

En este caso obtengo una unión optima de todos los puntos. Pero yo quiero detectar que puntos están cerca de la ruta que une los dos puntos principales (ciudades).

 

También he hecho un mapa con Ias ciudades de Reino Unido para hacerlo más fácil de entender. He calculado las distancias reales entre los puntos y creado clusters en función de las distancias entre ellos. En este ejemplo solo hay 10 ciudades aunque en el problema hay más de 80 ciudades diferentes.


```

**library**(gmp)

**library**(cluster)

**library**(raster)


#Geo distance function

geo.dist = function(df) {

  require(geosphere)

  d <- function(i,z){         # z[1:2] contain long, lat

    dist <- rep(0,nrow(z))

    dist[i:nrow(z)] <- distHaversine(z[i:nrow(z),1:2],z[i,1:2])

    return(dist)

  }

  dm <- do.call(cbind,lapply(1:nrow(df),d,df))

  return(as.dist(dm))

}

df     <- data.frame(long=coord$Longitude, lat=coord$Latitude, city=coord$City)

d      <- geo.dist(df)   # distance matrix

hc     <- hclust(d)      # hierarchical clustering

df$clust <- cutree(hc,k=10)


UK <- getData("GADM", country = "GBR", level = 1)

map.df <- fortify(UK)


ggplot(map.df)+

  geom_path(aes(x=long, y=lat, group=group))+

  geom_point(data=df, aes(x=long, y=lat, color=factor(clust)), size=4)+

  scale_color_discrete("Cluster")+

  coord_fixed()

```

He obtenido el siguiente mapa con los puntos a tratar (sin la línea roja):

Mapa con las ciudades de UK

Mi objetivo es ser capaz de decir que si voy desde el punto 1 hasta el punto 7 (línea roja), paso cerca de los puntos 9, 3 y 5, por lo que podrían ser paradas en la ruta.

 

Quizá existe un package para hacerlo más fácil. Yo he visto algo con package que interactúan con google maps pero no he sido capaz de montar un programa con éxito.

  

Si alguien sabe cómo ayudarme seria genial.

 Un saludo y gracias,

 Rafa