2017-06-21 4 views
1

J'ai un code postal pour chaque sommet d'un objet igraph. Je veux les convertir en coordonnées géographiques en utilisant ggmap afin que je puisse calculer l'attribut edge = distance géographique.Géocodage des attributs vertex igraph en utilisant ggmap

require(igraph) 
require(ggmap) 

g <- graph.ring(6) 
V(grph)$postcode <- c("Johannesburg 2017", 
         "Rondebosch 8000", 
         "Durban 4001", 
         "Pietermaritzburg 3201", 
         "Jeffreys Bay 6330", 
         "Pretoria 0001") 

Je pensais que je pouvais générer des coordonnées géographiques pour chaque sommet de cette façon:

V(g)$coordinate <- geocode(V(g)$postcode, sensor = FALSE, 
          output = "latlon", source = "google") 

Le résultat est une liste de LatLon coordonnées pour tous les sommets répétés pour chaque sommet, pas un LatLon unique pour chaque sommet.

head(head(V(g)$coordinate) 
[[1]] 
[1] 28.03837 28.31993 31.02204 30.36661 24.91015 28.18540 

[[2]] 
[1] -26.18825 -25.84222 -29.84962 -29.65119 -34.05067 -25.74895 

[[3]] 
[1] 28.03837 28.31993 31.02204 30.36661 24.91015 28.18540 

[[4]] 
[1] -26.18825 -25.84222 -29.84962 -29.65119 -34.05067 -25.74895 

[[5]] 
[1] 28.03837 28.31993 31.02204 30.36661 24.91015 28.18540 

[[6]] 
[1] -26.18825 -25.84222 -29.84962 -29.65119 -34.05067 -25.74895 

Les nombres -ve = latitude, + ve nombres = longitude. Qu'est-ce que je fais mal?

+0

géocodage crée une liste de tuples pour chaque code postal. Chaque tuple contient une valeur de latitude et de longitude. – user2995175

Répondre

1

Le problème est que geocode renvoie une trame de données, mais lorsque vous l'attribuez à V(g)$coordinate, elle le traite sous la forme d'une liste et le recyclage des colonnes permet d'obtenir une valeur pour chaque sommet.

postcode_df <- geocode(V(g)$postcode, sensor = FALSE, 
          output = "latlon", source = "google") 

postcode_df 
#  lon  lat 
# 1 28.03837 -26.18825 
# 2 28.31993 -25.84222 
# 3 31.02204 -29.84962 
# 4 30.36661 -29.65119 
# 5 24.91015 -34.05067 
# 6 28.18540 -25.74895 

Vous devez transformer chaque ligne de l'ensemble de données en un élément pouvant être affecté à un sommet. Cela peut être fait beaucoup de façons, voici un simple:

V(g)$coordinate <- split(postcode_df, 1:nrow(postcode_df)) 

V(g)$coordinate 
# [[1]] 
# lon  lat 
# 1 28.03837 -26.18825 
# 
# [[2]] 
# lon  lat 
# 2 28.31993 -25.84222 
# 
# [[3]] 
# lon  lat 
# 3 31.02204 -29.84962 
# 
# [[4]] 
# lon  lat 
# 4 30.36661 -29.65119 
# 
# [[5]] 
# lon  lat 
# 5 24.91015 -34.05067 
# 
# [[6]] 
# lon  lat 
# 6 28.1854 -25.74895