Skip to content
Prev 17733 / 29559 Next

Click issue segmentGoogleMaps ( pie for plotGoogleMaps, spplot and plotKML)

Hi,

This is the bug in segment function, infoWindows at the moment this
works only for 3 variables. I'm sending to you alternative solution.
I'll fix it in new version of package. There will be fixed version of
segmentGoogleMaps, and added pie function which can be used for
sppplot and plotKML.

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

#################################################################################


# Function creates SPolyDF from points, piecharts from points  ,
modified from #plotGoogleMaps package
#
pie<-function(SPDF,
              zcol=1:length(SPDF at data),
              scalelist=TRUE,  # TRUE proportional, FALSE pie charts same size
              max.radius=100,  #m
              do.sqrt = TRUE,
              colPalette=rainbow(ncol(SPDF at data[,zcol])),
              fillColor=rainbow(length(zcol)),
              strokeColor="red"){

  ####  FUNCTION modified from plotGoogleMaps package

  createSphereSegment <- function(partOfSP,
                                  max.radius=100,  #m
                                  key.entries = as.numeric(partOfSP at data),
                                  scalelist=1,
                                  do.sqrt = TRUE,
                                  fillColor=rainbow(length(key.entries)),
                                  strokeColor="red",
                                  id=length(key.entries)) {

    center=coordinates(partOfSP)
    fillColor<-as.character(substr(fillColor,1,7))

    obj = as(partOfSP, "SpatialPointsDataFrame")
    z = as.numeric(partOfSP at data)
    # avoid negative values
    if (min(key.entries)<0 ){
      ke<-abs(min(key.entries))+ key.entries+mean(key.entries)
    }else{ke<-key.entries+min(key.entries)}     # no zeros for radius vecor
    # creating a vector for subgroupes
    if(do.sqrt){
      scale.level<- sqrt(ke/(max(ke)) ) }else{scale.level<-ke/(max(ke))}
    radius.level<-max.radius*scale.level
    # list of radiuses for createSphereCircle
    radius.vector<-   radius.level
    dfi<-cbind(rep(NA,1+length(radius.vector)))
    dfi[1]=0

    if(max(scale.level)==0)
    {scale.level=0.1
     scalelist=0.01}

    dfi[2:(length(radius.vector)+1)]=360/sum(scale.level)*  scale.level


    fi= cbind(rep(NA,2*length(radius.vector)) )
    dfi=as.numeric(dfi)
    for (i in (seq(2,length(fi),by=2))){
      fi[i]=sum(dfi[1:(i/2+1)])
    }
    fi[1]=0
    for (i in (seq(3,length(fi),by=2))){
      fi[i]=fi[i-1]
    }


    radius.vector=scalelist*max.radius/6378000

    lat1 <- (pi/180)* center[2];
    lng1 <- (pi/180)* center[1];

    paths<-as.list(rep(NA,length(radius.vector)))

    for(ik in (seq(2,length(fi),by=2))){
      radius<-  radius.vector

      coords<-cbind(rep(NA,11),rep(NA,11))
      coords[1,]  <- c(  center[,1], center[,2])
      j<-2
      for (i in seq(fi[ik-1],fi[ik],length.out=10)) {
        tc <- (pi/180)*i
        y <- asin(sin(lat1)*cos(radius)+cos(lat1)*sin(radius)*cos(tc))
        dlng <-
atan2(sin(tc)*sin(radius)*cos(lat1),cos(radius)-sin(lat1)*sin(y))
        x <- ((lng1-dlng+pi) %% (2*pi)) - pi

        coords[j,1] <-c(x*(180/pi))
        coords[j,2] <-c(y*(180/pi))
        j<-j+1
      }



      lonlat<-coords
      paths[[ik/2]]<-rbind(lonlat,lonlat[1,])
    }
    pol=paths
    lonlat<-rbind( paths[[1]],paths[[1]][1,])
    pol[[1]]<-Polygon(lonlat,hole=FALSE)
    pol[[1]]<-Polygons(list(pol[[1]]),ID=id-1)

    for(i in (2:(length(paths)))){
      lonlat<-rbind( paths[[i]],paths[[i]][1,])
      pol[[i]]<-Polygon(lonlat,hole=FALSE)
      pol[[i]]<-Polygons(list(pol[[i]]),ID=id-i)   }


    return(pol)

  }

  SP <-as(SPDF, "SpatialPointsDataFrame")
  SP.ll <- spTransform(SP, CRS("+proj=longlat +datum=WGS84"))
  SP.ll<-SP.ll[,zcol]

  if(strokeColor!=""){
    rgbc<-col2rgb(strokeColor)
    strokeColor<-rgb(rgbc[1],rgbc[2],rgbc[3],maxColorValue=255) }

  if(!is.null(colPalette)){
    rgbc<-col2rgb(colPalette)
    colPalette<-apply(rgbc,2,function(x) rgb(x[1],x[2],x[3],maxColorValue=255))}
  if(scalelist){
    xdata<-SP at data[,zcol]
    xdata <- apply(xdata, 2L, function(x) (x - min(x, na.rm =
TRUE))/diff(range(x, na.rm = TRUE)))
    xsum <- apply(xdata, 1L,function(x) ( sum(x)))
    scalelist<-xsum/max(xsum)
    scalelist<-sqrt(scalelist)} else{
scalelist<-rep(1,length(SP.ll at coords[,1])) }

  Pols<-as.list(rep(NA,length(SP.ll[,1])))
  Srl<-Pols
  num=(rep(NA,length(zcol)*length(SP.ll at data[,1])) )
  for(i in 1:length(SP.ll at data[,1])){
    Pols[[i]]<-createSphereSegment(SP.ll[i,zcol],
                                   max.radius=max.radius,  #m
                                   key.entries = ,
                                   scalelist= scalelist[i],
                                   do.sqrt = do.sqrt,
                                   fillColor=colPalette,
                                   strokeColor= strokeColor,
                                   id=i*length(as.numeric(SP.ll at data[i,zcol])))
    num[i*length(zcol)-(0:(length(zcol)-1))]=i

  }

  id=num  # rep(1:length(zcol),length(SP.ll at data[,1]))
  dat=data.frame(id)
  SP$id=1: length(SP.ll at data[,1])
  dat=merge(dat,SP at data)
  Pols=unlist(Pols)
  SPl<-SpatialPolygons(Pols,proj4string=SP.ll at proj4string)
  SPldf<-SpatialPolygonsDataFrame(SPl,dat,match.ID = FALSE)
  return(SPldf)
}

###########################  END OF FUNCTION pie ###############################
#
a=pie(meuse,zcol=c('zinc','lead','copper'))
a$col=rep(c('zinc','lead','copper'),155)
m=plotGoogleMaps(a,zcol='col',colPalette=c('red','green','blue') )

# this works for 2 or more variables.

 a=pie(meuse,zcol=c('zinc','lead','copper','dist.m'))
 a$col=rep(c('zinc','lead','copper','dist.m'),155)
 m=plotGoogleMaps(a,zcol='col',colPalette=rainbow(4) )

# you can use it for spplot
 a$col=rep(1:4,155)
 spplot(a,zcol='col', col.regions=rainbow(4))

# or for plotKML
plotKML(a)

Hope this helps.

Best,
Kili
On 3/8/13, Mckay, Shawn <smckay at rand.org> wrote: