spatstat 和 maptools 包中的 Spatial 对象的转换器函数可用于此目的。 shapefile 至少由每个对象的点(或线或多边形)和属性组成。
library(spatstat)
library(sp)
library(maptools)
data(bei)
将bei 强制为Spatial 对象,这里只是没有属性的点,因为ppp 对象上没有“标记”。
spPoints <- as(bei, "SpatialPoints")
shapefile 至少需要一列属性数据,因此请创建一个虚拟文件。
dummyData <- data.frame(dummy = rep(0, npoints(bei)))
使用SpatialPoints 对象和虚拟数据,生成SpatialPointsDataFrame。
spDF <- SpatialPointsDataFrame(spPoints, dummyData)
此时您绝对应该考虑bei 使用的坐标系是什么,以及是否可以用WKT CRS(众所周知的文本坐标参考系)来表示它。您可以将其分配给Spatial 对象作为SpatialPointsDataFrame 的另一个参数,或者在使用proj4string(spDF) <- CRS("+proj=etc...") 创建之后(但这是一个我们可以在其上编写页面的整个问题)。
加载rgdal包(这是最通用的选项,因为它支持多种格式并使用GDAL库,但由于系统依赖性可能不可用。
library(rgdal)
(如果rgdal 不可用,请在maptools 包中使用writePolyShape)。
语法是对象,然后是“数据源名称”(这里是当前目录,这可以是 .shp 或文件夹的完整路径),然后是层(对于 shapefile,是不带扩展名的文件名),然后是输出驱动程序的名称。
writeOGR(obj = spDF, dsn = ".", layer = "bei", driver = "ESRI Shapefile")
请注意,如果“bei.shp”已经存在,则写入将失败,因此必须首先删除unlink("bei.shp")。
列出所有以“bei”开头的文件:
list.files(pattern = "^bei")
[1] "bei.dbf" "bei.shp" "bei.shx"
请注意,ppp 对象没有通用的“as.Spatial”转换器,因为必须决定这是否是带有标记的点模式等等 - 尝试编写一个可能会很有趣,报告是否需要虚拟数据等。
有关这些数据表示之间差异的更多信息和详细信息,请参阅以下小插图:
库(sp);小插图(“sp”)
图书馆(spatstat);小插图(“spatstat”)