如何在 R 中读取 .MAP 文件扩展名?

拉法佩雷拉

有没有一种简单的方法可以读取.MAPR 中扩展名文件我尝试了以下几个选项,但没有成功。这是一个.MAP可重现示例文件

背景:出于某种奇怪的原因,巴西卫生规划政策中使用的空间区域化仅以这种格式提供。我想将它转换为geopackage这样我们可以将它添加到geobr包中。

# none of these options work
mp <- sf::st_read("./se_mapas_2013/se_regsaud.MAP")
mp <- rgdal::readGDAL("./se_mapas_2013/se_regsaud.MAP")
mp <- rgdal::readOGR("./se_mapas_2013/se_regsaud.MAP")
mp <- raster::raster("./se_mapas_2013/se_regsaud.MAP")
mp <- stars::read_stars("./se_mapas_2013/se_regsaud.MAP")

附:SO 上有一个类似的问题,重点是 Python,不幸的是没有回答

更新

我们发现了一个使用自定义函数读取.MAP文件的出版物请参阅下面的示例。但是,它返回一个"polylist"对象。有没有一种简单的方法可以将其转换为 a simple feature

原始自定义功能

read.map = function(filename){
  zz=file(filename,"rb")
  #
  # header of .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

  #
  # repeat of each object in file
  #
  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)
    }


    # separate polygons
    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)
}

使用原始自定义功能

mp <- read.map("./se_mapas_2013/se_regsaud.MAP")

class(mp)
>[1] "polylist"

# plot
plot(attributes(mp)$maplim, type='n', asp=1, xlab=NA, ylab=NA)
title('Map')
lapply(mp, polygon, asp=T, col=3)

在此处输入图片说明

罗杰·比万德

问题是:使用readChar尾随 nul 字节 - 更改为readBin(); rawToChar()不接受的8 位字符(在我的 UTF-8 系统上);一些需要删除的文件中的多个条子;和其他一些。我将read.map()上面编辑过的函数添加maptools,但名称不同且未导出。所以现在(构建完成时使用来自https://r-forge.r-project.org/R/?group_id=943 的maptools rev 370 ):

library(maptools)
o <- maptools:::readMAP2polylist("se_regsaud.MAP")
oo <- maptools:::.makePolylistValid(o)
ooo <- maptools:::.polylist2SpP(oo, tol=.Machine$double.eps^(1/4))
rn <- row.names(ooo)
df <- data.frame(ID=rn, row.names=rn, stringsAsFactors=FALSE)
res <- SpatialPolygonsDataFrame(ooo, data=df)
library(sf)
res_sf <- st_as_sf(res)
res_sf
plot(st_geometry(res_sf))

在此处输入图片说明

这种方法重新使用了近 20 年前maptools代码,并进行了少量编辑以处理读取二进制文件和修复碎片的后续更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从R中的basename结尾删除文件扩展名?

如何从Chrome扩展名读取文件?

如何在Python中通过扩展名删除文件?

如何在PCManFM中隐藏某个扩展名的文件

如何在PHP中获得文件扩展名?

如何在PHP中检查正确的文件扩展名?

如何在PHP中获取文件扩展名?

如何在Shell脚本中获取文件扩展名

如何在Android中获取文件扩展名?

如何在NERDTree中按扩展名过滤文件?

如何在FreeMarker模板中删除文件扩展名

如何在grails中获取文件扩展名?

如何在shellscript中匹配特定的文件扩展名

如何在Flutter中获取文件扩展名?

如何在目标C中读取没有扩展名的文件

在R中获取不带扩展名的文件名

如何从PowerShell中的扩展名类型数组中提取/匹配文件类型扩展名

在R中重命名文件扩展名

根据R中的扩展名和目录获取文件

从R中的URL路径提取文件扩展名

如何在Swift中从文件扩展名中拆分文件名?

在 django 中打印时如何从目录中读取文件并删除扩展名?

如何从git仓库中读取所有具有不同扩展名的文件?

Spark:如何递归读取目录中具有不同扩展名的所有文件?

如何从目录中仅读取具有特定扩展名的文件

如何从上传的图片中获取文件扩展名,而文件名中没有扩展名

htaccess如何更正文件扩展名中的错误

如何从文件路径中获取扩展名?

如何获取路径中包含数据的文件扩展名?