Нарисуйте карту конкретной страны с листовкой

Я хотел бы использовать пакет leaflet с R, чтобы нарисовать карту определенных стран, таких как Италия, Испания и т. д.

Я проверил базовые примеры с функцией setView() и попытался задать вектор из двух значений для аргументов широты и долготы:

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)

Но я никогда не смогу отобразить на своем экране конкретную страну, такую ​​как результат этой функции:

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

В конце концов, я просто хочу нарисовать несколько точек, разместив их географически на своих картах (с широтой и долготой).

Возможно ли это или пакет maps подходит для этой задачи (хотя я не нашел способа увеличить масштаб)?


person Omlere    schedule 29.03.2017    source источник


Ответы (2)


Пакет maps отправляет данные шейп-файла в виде вершин. Афаик, ничего подобного в листовке нет. Так что вам придется получить ваши данные в другом месте. Вот мое предложение:

# 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()

введите описание изображения здесь

ДОПОЛНЕНИЕ:

Вы можете посмотреть на вершины, составляющие италию, сохраненные в пакете maps с кодом ниже.

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

введите описание изображения здесь

person JanLauGe    schedule 29.03.2017
comment
Не за что, рад, что пригодилось! - person JanLauGe; 30.03.2017

Вы можете просто использовать полигоны, полученные из maps. Конечно, можно использовать любой другой подходящий источник, как упомянул @JanLauGe.

После того, как у вас есть полигоны определенной страны, вы можете передать их в Leafet после преобразования их в SpatialPolygonsDataFrame. Вы также можете создать маску, если хотите отобразить только интересующую область.

Естественно, после этого вы можете легко добавить любую точку или маркер стандартными методами Leaflet, например 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

Карта Италии от 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;

Карта Италии в масках от ploygons

Спасибо за @fdetsch за его предложение!

person CreMindES    schedule 30.03.2017
comment
Отличное продолжение моего ответа, спасибо! Не знал о функции map2SpatialPolygons. - person JanLauGe; 30.03.2017