【问题标题】:How to convert a sample dataset from the R package "spatstat" into a shapefile如何将 R 包“spatstat”中的示例数据集转换为 shapefile
【发布时间】:2011-08-13 07:18:33
【问题描述】:

我用 Java 编写了一个内核密度估计器,它以 ESRI shapefile 的形式接受输入,并输出估计表面的 GeoTIFF 图像。为了测试这个模块,我需要一个示例 shapefile,无论出于何种原因,我都被告知要从 R 中包含的示例数据中检索一个。问题是所有示例数据都不是 shapefile...

所以我正在尝试使用 shapefiles 包的功能convert.to.shapefile(4) 将 R 中 spatstat 包中包含的 bei 数据集转换为 shapefile。不幸的是,事实证明这比我想象的要难。有没有人有这方面的经验?如果你能在这儿帮我一把,我将不胜感激。

谢谢, 瑞恩

参考资料: spatstat, shapefiles

【问题讨论】:

  • 为什么是 bei 数据集?

标签: java r gis shapefile


【解决方案1】:

spatstatmaptools 包中的 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) &lt;- 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”)

【讨论】:

  • 嘿,我第一次只是把代码扔在那里,所以我现在添加了评论来解释一些事情
  • 感谢两位响应者,您的解决方案应该可以工作......我唯一的问题是我在 Mac OS X 上运行它,rgdal 不支持它。今天下午我会试着在我的办公室里找一台windows机器来测试这些。再次感谢!
【解决方案2】:

一般的解决方案是:

  • "ppp""owin" 分类对象转换为来自sp 包的适当分类对象
  • 使用包rgdal 中的writeOGR() 函数来写出Shapefile

例如,如果我们考虑来自spatstathamster 数据集:

require(spatstat)
require(maptools)
require(sp)
require(rgdal)
data(hamster)

首先将此对象转换为SpatialPointsDataFrame 对象:

ham.sp <- as.SpatialPointsDataFrame.ppp(hamster)

这给了我们一个 sp 对象来工作:

> str(ham.sp, max = 2)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame': 303 obs. of  1 variable:
  ..@ coords.nrs : num(0) 
  ..@ coords     : num [1:303, 1:2] 6 10.8 25.8 26.8 32.5 ...
  .. ..- attr(*, "dimnames")=List of 2
  ..@ bbox       : num [1:2, 1:2] 0 0 250 250
  .. ..- attr(*, "dimnames")=List of 2
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots

此对象在@data 槽中有一个变量:

> head(ham.sp@data)
     marks
1 dividing
2 dividing
3 dividing
4 dividing
5 dividing
6 dividing

假设我们现在想将此变量写为 ESRI Shapefile,我们使用 writeOGR()

writeOGR(ham.sp, "hamster", "marks", driver = "ESRI Shapefile")

这将在当前工作目录中创建的目录hamster 中创建几个marks.xxx 文件。这组文件就是 ShapeFile

我没有对bei 数据集执行上述操作的原因之一是它不包含任何数据,因此我们无法将其强制为SpatialPointsDataFrame 对象。在bei.extra(与bei 同时加载)中数据我们可以使用,但这些额外数据或在常规网格上。所以我们不得不

  • bei.extra 转换为SpatialGridDataFrame 对象(比如bei.spg
  • bei 转换为SpatialPoints 对象(比如bei.sp
  • overlay() bei.sp 指向bei.spg 网格,从网格中为bei 中的每个点生成值
  • 这应该给我们一个SpatialPointsDataFrame,可以使用上面的writeOGR() 写出

如您所见,为了给您一个 Shapefile,这涉及到更多的内容。我展示的hamster 数据示例是否足够?如果没有,我明天可以找到我的Bivand et al 并完成bei 的步骤。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多