2017-06-06 3 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'を作成できますか?ポリゴンはそれを 'leaflet%>%addTiles%>%'の最後までパイプします。ループ内の各繰り返しの最後にpipeコマンドを貼り付けることができます。 – sconfluentus

答えて

2

パッケージsfmapviewを使用したソリューションです。これは、現在のみ可能(addFeaturesはとても点、線、および/または多角形の任意の組み合わせはここで働いてますが、種類にとらわれないであることをコメントアウト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 

ノートを参照してくださいのMapViewの開発バージョンを使用していることに注意してください。

+1

非常に参考になりました、ありがとう!私は古いメソッドを使用して私のループを適用することができましたが.. – Daisywang

関連する問題