2017-03-29 3 views
3

Je voudrais utiliser le package leaflet avec R pour dessiner une carte d'un pays spécifiques tels que l'Italie, l'Espagne, etc.Dessiner une carte d'un pays spécifique avec dépliant

J'ai vérifié les exemples de base avec la fonction setView() et moi avons essayé de donner un vecteur de deux valeurs pour la arg de latitude et longitutde:

m <- leaflet() %>% 
    addTiles() %>% # Add default OpenStreetMap map tiles 
    setView(lng=c(46.00,48.00), lat=c(2.00,6.00), zoom = 4) 
m # Print the map (map is not centered on a country, it's just a test) 

Mais je ne serai jamais en mesure d'avoir un pays spécifique sur mon écran tel que le résultat de cette fonction:

library(maps) 
map('italy', fill = TRUE, col = 1:10) 

En fin de compte, je veux simplement attirer des points en les situant géographiquement sur mes cartes (avec la latitude et Longtitude)

Est-il possible ou est le paquet maps est adéquat pour cette tâche (même si je n » t trouver un moyen de zoomer)?

Répondre

2

Le package maps contient les données de fichier de forme sous forme de sommets. Afaik rien de tel n'est inclus dans la brochure. Vous devrez donc récupérer vos données ailleurs. Voici ma suggestion:

# Get an Italy shapefile 
download.file(url = 'http://biogeo.ucdavis.edu/data/diva/adm/ITA_adm.zip', 
       destfile = 'italy.zip') 
unzip(zipfile = 'italy.zip') 

# Load libraries 
library(sp) 
library(rgdal) 
italy <- readOGR('ITA_adm0.shp') 

library(leaflet) 
leaflet(italy) %>% 
    addPolygons() %>% 
    addTiles() 

enter image description here

ADD-ON:

Vous pouvez regarder les sommets qui composent l'Italie comme enregistré dans le paquet maps avec le code ci-dessous.

library(maps) 
italy <- map('italy', fill = TRUE, col = 1:10) 
italy_coords <- cbind(italy$x, italy$y) 
plot(italy_coords) 

enter image description here

+0

Merci pour votre réponse, cela fonctionne vraiment très bien. – Omlere

+0

Pas de problème, content que ce fut utile! – JanLauGe

3

Vous pouvez simplement utiliser les polygones retreived de maps. Bien sûr, on peut utiliser n'importe quelle autre source appropriée, tout comme @JanLauGe l'a mentionné. Après avoir les polygones du pays spécifique, vous pouvez les envoyer à Leafet après les avoir convertis en SpatialPolygonsDataFrame. Vous pouvez également créer un masque si vous souhaitez afficher uniquement la zone d'intérêt.

Naturellement, après cela, vous pouvez facilement ajouter n'importe quel point ou marqueur avec les méthodes standard de Leaflet, comme addCircleMarkers(lng, lat).

library(ggmap) 
library(leaflet) 
library(magrittr) 
library(maps) 
library(maptools) 
library(raster) 
library(rgeos) 
library(sp) 

country <- 'italy'; 
zoomLevel <- 6; 

# Get the map (class is map) 
ita.map <- map(country, fill = TRUE, col = 1, plot = F); 

# Get the geo center for lazyness 
ita.center <- geocode("italy"); 

# Extract the names from ita.map. 
# e.g. "Trapani:I. Le Egadi:I. Marettimo" -> "Trapani" 
# note: any other solution is fine, because we don't really need them, but they 
# can be useful later 
ita.map.ids <- sapply(strsplit(ita.map$names, ':'), function(x) x[1]); 
# Convert our map object to SpatialPolygons 
ita.sp <- map2SpatialPolygons(ita.map, IDs=ita.map.ids, 
    proj4string=CRS("+proj=longlat +datum=WGS84")) 

# Note: if you only need a unified polygon, it can be achieved by fortify 
# ita.sp.df <- fortify(ita.sp); 

# Finally convert our SpatialPolygons to SpatialPolygonsDataFrame 
tmp.id.df <- data.frame(ID = names(ita.sp)); 
rownames(tmp.id.df) <- names(ita.sp); 
ita.spdf <- SpatialPolygonsDataFrame(ita.sp, tmp.id.df); 

# Visualize 
l.ita.map <- leaflet(ita.spdf) %>% 
    setView(lng = ita.center$lon, lat = ita.center$lat, zoom = zoomLevel) %>% 
    addTiles() %>% 
    addPolygons(data = ita.spdf, weight = 1, fillColor = "blue", fillOpacity = 0.5); 

l.ita.map 

Map of Italy from from ploygons

####### Alternatively if a mask if needed ####### 

# Get a plane of the world 
wld.sp <- rasterToPolygons(raster(ncol = 1, nrow = 1, crs = proj4string(ita.sp))); 
# Cut our country polygon from the plane to get our target mask 
ita.sp.mask <- gDifference(wld.sp, ita.sp); 

# Convert our ita.sp.mask (SpatialPolygons) to SpatialPolygonsDataFrame 
tmp.id.df <- data.frame(ID = "1"); 
rownames(tmp.id.df) <- names(ita.sp.mask); 
ita.mask.spdf <- SpatialPolygonsDataFrame(ita.sp.mask, tmp.id.df); 

# Coordinates of Rome 
ita.rome.center <- geocode("Rome, italy"); 

# Visualize 
l.ita.mask.map <- leaflet(ita.mask.spdf) %>% 
    setView(lng = ita.center$lon, lat = ita.center$lat, zoom = zoomLevel) %>% 
    addTiles() %>% 
    addPolygons(data = ita.mask.spdf, fillColor = "white", fillOpacity = 1.0, color = "black", weight = 1) %>% 
addCircleMarkers(lng = ita.rome.center$lon, lat = ita.rome.center$lat); 

l.ita.mask.map; 

Masked map of Italy from from ploygons

Merci pour @fdetsch pour son suggestion!

+0

Grande extension de ma réponse, merci! Je ne connaissais pas la fonction 'map2SpatialPolygons'. – JanLauGe