plotGoogleMaps - несколько слоев одной и той же переменной, управляемые легендами

Есть ли способ создать карту с plotGoogleMaps с легендой, которая управляет слоями одной и той же переменной?

Используя в качестве примера набор данных meuse из пакета gstat, цель состоит в том, чтобы получить "толстую коробку" для каждого типа землепользования. Поэтому, позволяя пользователю решать, какой слой просматривать, один за другим, или выбирать несколько или все из них:

 # Data Preparation
    library(sp)
    data(meuse)
    coordinates(meuse)<-~x+y
    proj4string(meuse) <- CRS('+init=epsg:28992')

    ic=iconlabels(meuse$landuse, height=12)
    m<-plotGoogleMaps(meuse,zcol='landuse',filename='Map.htm', iconMarker=ic)

Лучшим решением была бы команда для разбивки по значениям переменной...

Или в качестве альтернативы, нам нужно создать карту для каждого слоя (все 15 из них) и затем сложить их вместе? Будет ли это более удобный способ добиться этого? Я получил проект с более чем 300 слоями...

#Alternative the long way : Example with 3 landuse values
data(meuse)
list <- list(unique(meuse$landuse)) #list all 15 landuse values

Ah <- subset(meuse, landuse == "Ah")
coordinates(Ah)<-~x+y
proj4string(Ah) <- CRS('+init=epsg:28992')
ic=iconlabels(Ah$landuse, height=12)
m.Ah<-plotGoogleMaps(Ah,zcol='landuse', legend=FALSE, filename='MapAh.htm', iconMarker=ic, add=TRUE)

Fw <- subset(meuse, landuse == "Fw")
coordinates(Fw)<-~x+y
proj4string(Fw) <- CRS('+init=epsg:28992')
icf=iconlabels(Fw$landuse, height=12)
m.Fw<-plotGoogleMaps(Fw,zcol='landuse',legend=FALSE, filename='MapFw.htm', iconMarker=icf, previousMap=m.Ah, add=TRUE)

W <- subset(meuse, landuse == "W")
coordinates(W)<-~x+y
proj4string(W) <- CRS('+init=epsg:28992')
icw=iconlabels(W$landuse, height=12)
m.W<-plotGoogleMaps(W,zcol='landuse', legend=TRUE, filename='MapFw.htm', iconMarker=icw,previousMap=m.Fw)

Вторым лучшим решением было бы зациклить все это.

2 ответа

Решение

Вот одно из решений. Конечно, вы можете сделать свою собственную функцию на основе этого.

library(plyr)
library(plotGoogleMaps)
library(sp)
data(meuse)
# list of SPDFs based on landuse
mlis <- dlply(meuse,'landuse',function(x) {
  coordinates(x)<-~x+y
  proj4string(x) <- CRS('+init=epsg:28992')
  x
})
# prepare colors 
cols = PolyCol(meuse$landuse)$col.uniq
#cols = rainbow(15)
names(cols) = levels(meuse$landuse)

# 1st landuse category  
lev1 <- levels(meuse$landuse)[1]
ic=iconlabels(mlis[[lev1]]$landuse, height=12, colPalette= cols[lev1])
m<-plotGoogleMaps(mlis[[lev1]],zcol='landuse', legend=FALSE,filename='MapLU.htm', iconMarker=ic,layerName = lev1, add=TRUE)

nlev <-length(levels(meuse$landuse))
for(lev in levels(meuse$landuse)[c(-1,-nlev)]){
 ic=iconlabels(mlis[[lev]]$landuse, height=12, colPalette= cols[lev])
 m<-plotGoogleMaps(mlis[[lev]],zcol='landuse', legend=FALSE, filename='MapLU.htm', iconMarker=ic,layerName = lev, previousMap=m, add=TRUE)
}
# the last LU cat
lev=levels(meuse$landuse)[nlev]
ic=iconlabels(mlis[[lev]]$landuse, height=12, colPalette= cols[lev])
m<-plotGoogleMaps(mlis[[lev]],zcol='landuse', legend=FALSE, filename='MapLU.htm', iconMarker=ic,layerName = lev,previousMap=m)

Просто потому, что я большой сторонник принципа СУХОЙ, оптимизированной версии предыдущего кода:

library(plyr)
library(plotGoogleMaps)
library(sp)

data(meuse)
# list of SPDFs based on landuse
mlis <- dlply(meuse,'landuse',function(x) {
  coordinates(x)<-~x+y
  proj4string(x) <- CRS('+init=epsg:28992')
  x
})

# prepare colors 
cols <- PolyCol(meuse$landuse)$col.uniq
#cols = rainbow(15)
names(cols) <- levels(meuse$landuse)

m<- NULL
nlev <- nlevels(meuse$landuse)
landUseLevels <- levels(meuse$landuse)

for( n in 1:nlev  ) {
  lev <- landUseLevels[n] 
  ic <- iconlabels(mlis[[lev]]$landuse, height=12, colPalette= cols[lev])
  m <- plotGoogleMaps(mlis[[lev]],zcol='landuse', legend=FALSE, filename='MapLU.htm', iconMarker=ic,layerName = lev, previousMap=m, add=(n!=nlev))
}
Другие вопросы по тегам