[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