[R-br] Ler .MAP no R - Shapefile

Éder Comunello comunello.eder em gmail.com
Sexta Abril 11 20:17:51 BRT 2014


Sérgio, boa noite!

Dei uma rápida olhada no script que você mencionou. O problema pode ser
decorrente de tentar usar o texto original com encoding "ISO-8859-1" em um
sistema com encoding "UTF-8".

A parte da função read.map() rodou normalmente aqui, mas alguns comandos
que seguem parecem estar obsoletos (plot.polylist(), p. ex.)

A função read,map() gera um objeto de classe 'polylist' que preciso estudar
melhor, mas por ora dá pra visualizar o conteúdo com algumas adaptações...

Separei o trecho de código da função em um arquivo separado chamado
readMap.R e executei o trecho de código abaixo, usando o arquivo
"BRREG.MAP" (Regiões do Brasil) pra testar.

# <code r>
# downURL <- 'ftp://ftp.datasus.gov.br/municip/mapas/2005/mapbr.zip'
# arquivo com vários arquivos MAP, inclusive "BRREG.MAP" aqui utilizado

setwd("C:/LAB/DATASUS")
source("readMap.R") ### carregar função

mapName <- "BRREG.MAP"
mapa <- read.map(mapName)
save(mapa, file=paste0(mapName,".R"))

### uma vez salvo, você poderá recarregar o objeto mapa, sem ter que usar
read.map() novamente.
# load(file=paste0(mapName,".R"))

plot(attributes(mapa)$maplim, type='n', asp=1, xlab=NA, ylab=NA)
title('Mapa')
lapply(mapa, polygon, asp=T, col=3)
# </code>

O código do arquivo readMap.R retirei do link passado:

# <code r>
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)
}
# </code>


Éder Comunello <c <comunello.eder em gmail.com>omunello.eder em gmail.com>
Dourados, MS - [22 16.5'S, 54 49'W]
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20140411/c1368ef6/attachment.html>


Mais detalhes sobre a lista de discussão R-br