2017-06-06 32 views
1

我试图根据许多国家代码列表将多个多边形添加到传单世界地图。我试图使用R循环来添加多边形。下面是我手动从列表1中添加多边形代码:如何使用r循环在小册子地图中添加多个多边形?

library(sp) 
library(raster) 
library(leaflet) 
library(maps) 
library(tidyverse) 

countries_1 <- c('PAK','TUR','BGR') 

adm1 <- getData('GADM', country='PAK', level=0) 
adm2 <- getData('GADM', country= 'TUR', level=0) 
adm3 <- getData('GADM', country= 'BGR', level=0) 


leaflet() %>% 
    addTiles() %>% 
    addPolygons(data=adm1, weight = 3, fillColor = 'purple', color = 'purple') %>% 
    addPolygons(data=adm2, weight = 3, fillColor = 'purple', color = 'purple') %>% 
    addPolygons(data=adm3, weight = 3, fillColor = 'purple', color = 'purple') 

我使用的是循环添加多个多边形层,使得对list_n想:

countries_n <- ('ctry1','ctry2','ctry3',...'ctryn') 

for (i in country_n) { 

    countries <- basemap %>% addPolygons(data=getData('GADM',country = i, level = 0), 
    weight = 3, fillColor = 'purple', color = 'purple') 

    } 

的问题是我怎么能嵌入循环到“leflet()%>%”?

*请注意这里: 如果尝试在addPolygons(添加多个数据),它会在数据图仅第一要素,在以下情况下,唯一的国家“PAK”将ploted:

addPolygons(data=c('PAK','TUR'), weight = 3, fillColor = 'purple', color = 'purple') 
+1

难道你只是将数据和地图国家合并到一个变量吗? –

+1

@RomanLuštrik请阅读注释如果你将它们合并成一个变量,它只会列出列表中的第一个元素 – Daisywang

+1

看起来像你每次你通过循环时都添加一个底图,你可以在一个循环中粘贴字符串来创建'countries'多边形然后将其传递到“传单%>%addTiles%>%'的末尾。你可以在每次迭代结束时使用管道命令粘贴到循环中...... – sconfluentus

回答

2

下面是使用包sfmapview的解决方案。请注意,这是目前唯一可能使用开发MapView的的版本(参见注释devtools::install_github()

# devtools::install_github("r-spatial/[email protected]") 
library(sf) 
library(mapview) 
library(raster) 

countries_1 <- c('PAK','TUR','BGR') 

dat_list = lapply(countries_1, function(i) { 
    st_as_sf(getData("GADM", country = i, level = 0)) 
}) 

m = leaflet() %>% addTiles() 

for (i in dat_list) { 
    m = mapview::addFeatures(map = m, 
          data = i, 
          weight = 3, 
          fillColor = 'purple', 
          color = 'purple') 
} 

m 

注意addFeatures是类型不可知的,所以点,线的任意组合和/或多边形将在这里工作。

+1

非常有帮助,谢谢!虽然我设法应用我的循环使用旧的方法.. – Daisywang

相关问题