Importação de mapa do TabWin


<?xml version="1.0" encoding="ISO-8859-1"?>
<Rscript>
<titulo>Importação de mapa do TabWin</titulo>
<descricao>
Importa um mapa do TabWin dentro do ambiente do R, e salva a "polylist" resultante no formato que o R pode carregar com o comando "load()". A polylist criada pode ser plotada com a função "plot.polylist()" da biblioteca "maptools" que é usada neste esquema para plotar um exemplo do mapa importado.
O nome do arquivo criado tem o mesmo nome do mapa do tabwin com a extensão ".mapR". 
Para fazer este esquema funcionar corretamente é necessário ter um arquivo .map associado ao quadro corrente.
Para associar um arquivo .map a um quadro do TabWin basta haver plotado o mapa uma vez com as informações do quadro.
Observe a função "read.map" que está definida no esquema já que ela pode ser copiada para outros esquemas de análise onde for necessário ler arquivos ".map" do TabWin bem como pode ser modificada para atender a necessidade de ter os dados em outros formatos específicos.
A capacidade do TabWin importar bases cartográficas em vários formatos, e a grande potencia de análise espacial do R potencializa o poder das duas ferramentas, resultando em uma associação poderosa para análise espacial.
</descricao>
<autor>Ernani Bandarra</autor>
<email></email>
<versao>1.1</versao>
<parametro></parametro>
<parametro2></parametro2>
<colsel></colsel>
<colsel2></colsel2>
<script>
read.map = function(filename){
  zz=file(filename,"rb")
  #
  # header do .map
  #
  versao = readBin(zz,"integer",1,size=2)  # 100 = versao 1.00
  #Bounding Box
  Leste = readBin(zz,"numeric",1,size=4)
  Norte = readBin(zz,"numeric",1,size=4)
  Oeste = readBin(zz,"numeric",1,size=4)
  Sul   = readBin(zz,"numeric",1,size=4)

  geocodigo = ""
  nome = ""
  xleg = 0
  yleg = 0
  sede = FALSE
  poli = list()
  i = 0
  
  #
  # repete para cada objeto no arquivo
  #
  repeat{  
    tipoobj = readBin(zz,"integer",1,size=1) # 0=Poligono, 1=PoligonoComSede, 2=Linha, 3=Ponto
    
    if (length(tipoobj) == 0) break
    i = i + 1
    
    Len = readBin(zz,"integer",1,size=1)  # length byte da string Pascal
    geocodigo[i] = readChar(zz,10)
    Len = readBin(zz,"integer",1,size=1)  # length byte da string Pascal
    nome[i] = substr(readChar(zz,25),1,Len)
    xleg[i] = readBin(zz,"numeric",1,size=4)
    yleg[i] = readBin(zz,"numeric",1,size=4)
    numpontos = readBin(zz,"integer",1,size=2)
    
    sede = sede || (tipoobj = 1)
    
    x=0
    y=0   
    for (j in 1:numpontos){
      x[j] = readBin(zz,"numeric",1,size=4)
      y[j] = readBin(zz,"numeric",1,size=4)
    }
    
    
    # NAs separam vários polígonos no mesmo objeto
    # BUG a corrigir: Assim como está o primeiro polígono não fecha e, em multiplos poligonos, há um NA a mais no final 
    xInic = x[1]
    yInic = y[1]  
    for (j in 2:numpontos){
    if (x[j] == xInic & y[j] == yInic) {x[j]=NA; y[j] = NA}
    }
    
    poli[[i]] = c(x,y)
    dim(poli[[i]]) = c(numpontos,2)
  }

  class(poli) = "polylist"
  attr(poli,"region.id") = geocodigo
  attr(poli,"region.name") = nome
  attr(poli,"centroid") = list(x=xleg,y=yleg)
  attr(poli,"sede") = sede
  attr(poli,"maplim") = list(x=c(Oeste,Leste),y=c(Sul,Norte))
  
  close(zz)
  return(poli)
}

grafico.tabwin()
mapa = read.map(nomemapa)
save(mapa, file=paste(nomemapa,"R",sep=""))

library(maptools)
plotpolys(mapa,col="cyan")
title(titulo)
</script>
<exemplo>

</exemplo>
</Rscript>