Ler .MAP no R - Shapefile

Olá Alguém sabe como faço para ler arquivos .MAP no R? Esse formato é usado pelo tabwin para ler shapefiles. Sei que existe o script abaixo http://dev-pg2.datasus.gov.br/DATASUS/tabwin/rx/Importa_mapa.htm Porém quando faço
mapa = read.map("BR.MAP") Erro em readChar(zz, 25) (from #33) : entrada UTF-8 inválida em readChar()
Não roda. Abraços -- Sérgio Henrique Almeida da Silva Junior Doutorando em Epidemiologia em Saúde Pública Escola Nacional de Saúde Pública Sérgio Arouca - ENSP/FIOCRUZ http://lattes.cnpq.br/1611345552843383 Tel: (21) 968463637 http://www.linkedin.com/profile/view?id=250437145&trk=tab_pro

Esqueci de dizer que uso o Linux Mint! Abraços Em 10 de abril de 2014 19:13, Sérgio Henrique almeida da silva ju < sergio.edfisica@gmail.com> escreveu:
Olá
Alguém sabe como faço para ler arquivos .MAP no R? Esse formato é usado pelo tabwin para ler shapefiles.
Sei que existe o script abaixo http://dev-pg2.datasus.gov.br/DATASUS/tabwin/rx/Importa_mapa.htm
Porém quando faço
mapa = read.map("BR.MAP") Erro em readChar(zz, 25) (from #33) : entrada UTF-8 inválida em readChar()
Não roda.
Abraços -- Sérgio Henrique Almeida da Silva Junior Doutorando em Epidemiologia em Saúde Pública Escola Nacional de Saúde Pública Sérgio Arouca - ENSP/FIOCRUZ http://lattes.cnpq.br/1611345552843383 Tel: (21) 968463637 http://www.linkedin.com/profile/view?id=250437145&trk=tab_pro
-- Sérgio Henrique Almeida da Silva Junior Doutorando em Epidemiologia em Saúde Pública Escola Nacional de Saúde Pública Sérgio Arouca - ENSP/FIOCRUZ http://lattes.cnpq.br/1611345552843383 Tel: (21) 968463637 http://www.linkedin.com/profile/view?id=250437145&trk=tab_pro

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@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]

Oi Eder Obrigado pela ajuda! No windows eu consigo rodar direitinho, mas no linux não. Abraços Em 11 de abril de 2014 20:17, Éder Comunello <comunello.eder@gmail.com>escreveu:
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@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Sérgio Henrique Almeida da Silva Junior Doutorando em Epidemiologia em Saúde Pública Escola Nacional de Saúde Pública Sérgio Arouca - ENSP/FIOCRUZ http://lattes.cnpq.br/1611345552843383 Tel: (21) 968463637 http://www.linkedin.com/profile/view?id=250437145&trk=tab_pro

Sérgio, bom dia! Não vou ter como testar no momento, mas você poderia tentar definir o encoding na abertura da conexão (zz). A ideia é passar essa informação para o correto funcionamento da função readChar() quando ela é acionada. A alteração seria na primeira linha da função read.map() definida no código. zz=file(filename,"rb", encoding="latin-1") ou zz=file(filename,"rb", encoding="ISO-8859-1") Att., Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]

Sérgio, bom dia! Não vou ter como testar no momento, mas você poderia tentar definir o encoding na abertura da conexão (zz). A ideia é passar essa informação para o correto funcionamento da função readChar() quando ela é acionada. A alteração seria na primeira linha da função read.map() definida no código. zz=file(filename,"rb", encoding="latin-1") ou zz=file(filename,"rb", encoding="ISO-8859-1") Att., Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]
participantes (2)
-
Sérgio Henrique almeida da silva ju
-
Éder Comunello