[R] help to make a map on R

Renaud Lancelot lancelot at sentoo.sn
Thu Oct 3 10:55:11 CEST 2002


"Ronaldo Reis Jr." wrote:
> 
> Hi all,
> I need a little help for construct an state's map on R.
> 
> The first problem is to get the data.
> 
> I have a datafile of longitude and latitude in the follow format:
> 
> trajectory      latitude        longtude
> T               -22.045618      -51.287056
> T               -22.067078      -51.265888
> T               -22.067039      -51.207249
> 
> T               -22.059690      -48.089695
> T               -22.075529      -48.074608
> T               -22.072460      -48.044472
> 
> T               -22.062767      -48.298473
> T               -22.077349      -48.322140
> T               -22.047001      -48.347443
> T               -22.054266      -48.369331
> T               -22.042810      -48.392612
> T               -22.064812      -48.422195
> T               -22.062544      -48.443497
> 
> To read a file is simple, but I need that R change the value of
> trajectory after a blank line, reading something like this:
> 
> trajectory      latitude        longitude
> T1              -22.045618      -51.287056
> T1              -22.067078      -51.265888
> T1              -22.067039      -51.207249
> T2              -22.059690      -48.089695
> T2              -22.075529      -48.074608
> T2              -22.072460      -48.044472
> T3              -22.062767      -48.298473
> T3              -22.077349      -48.322140
> T3              -22.047001      -48.347443
> T3              -22.054266      -48.369331
> T3              -22.042810      -48.392612
> T3              -22.064812      -48.422195
> T3              -22.062544      -48.443497
> 
> Each trajectory is a line that is a little piece of my map.
> 
> After this, to make a map I execute:
> 
> tapply() for separate the coordinates for each trajectory, something like
> this:
> 
> > longitude <- tapply(longitude,trajectory,c)
> > longitude
> $T1
> [1] -51.2871 -51.2659 -51.2072
> 
> $T2
> [1] -48.0897 -48.0746 -48.0445
> 
> $T3
> [1] -48.2985 -48.3221 -48.3474 -48.3693 -48.3926 -48.4222 -48.4435
> 
> > latitude <- tapply(latitude,trajectory,c)
> > latitude
> $T1
> [1] -22.0456 -22.0671 -22.0670
> 
> $T2
> [1] -22.0597 -22.0755 -22.0725
> 
> $T3
> [1] -22.0628 -22.0773 -22.0470 -22.0543 -22.0428 -22.0648 -22.0625
> 
> The nest step is to make a plot with the coordinates.
> 
> > plot(longitude,latitude, asp = 1, type = "n")
> 
> And finally plot the lines for each trajectory, and all lines together,
> make a Sao Paulo's map and your cities limits.
> 
> > lines(longitude$T1,latitude$T1)
> > lines(longitude$T2,latitude$T2)
> > lines(longitude$T3,latitude$T3)
> 
> How can I make to automatized this process? Because I can about 3000
> trajectory.
> 
> Any other idea for make this is welcome.
> 

Hi Ronaldo,

ReadCoord <- function(file){
  ext <- readLines(con = file, n = -1)
  nam <- unlist(strsplit(ext[1], split = " "))
  nam <- nam[nam != ""]
  ext <- ext[-1]
  List <- list()
  j <- 1
  for (i in seq(along = ext)) {
    ok <- T
    coord <- character(0)
    while(ok){
      val <- unlist(strsplit(ext[i], split = " "))
      val <- val[val != ""]
      if(length(val) != 3) ok <- F
      else{
        coord <- c(coord, paste(val[1], j, sep = ""), val[2:3])
        i <- i + 1
        }
      }
    mat <- matrix(coord, ncol = 3, byrow = T)
    List[[j]] <- mat
    j <- j +1
  }
  df <- as.data.frame(do.call("rbind", List))
  names(df) <- nam
  df[,2] <- as.numeric(as.character(df[,2]))
  df[,3] <- as.numeric(as.character(df[,3]))
  dimnames(df)[[1]] <- as.character(seq(nrow(df)))
  df
}

Data <- ReadCoord("d:/analyses/travail/data/coord.txt")
attach(Data)
plot(longitude, latitude, asp = 1, type = "n")
tapply(seq(nrow(Data)),
       Data[,1],
       function(x, data) lines(data[x, "longitude"], data[x,
"latitude"]),
       data = Data)
detach()


Hope this helps,

Renaud


-- 
Dr Renaud Lancelot, vétérinaire
CIRAD, Département Elevage et Médecine Vétérinaire (CIRAD-Emvt)
Programme Productions Animales
http://www.cirad.fr/presentation/programmes/prod-ani.shtml (Français)
http://www.cirad.fr/presentation/en/program-eng/prod-ani.shtml (English)

ISRA-LNERV                      tel    +221 832 49 02
BP 2057 Dakar-Hann              fax    +221 821 18 79 (CIRAD)
Senegal                         e-mail renaud.lancelot at cirad.fr
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list