【问题标题】:How to Subset One Spatial Data Set into Multiple Spatial Datasets Based on Feature Name in R如何根据 R 中的特征名称将一个空间数据集子集为多个空间数据集
【发布时间】:2020-01-31 03:22:41
【问题描述】:

我有一个空间数据集折线,它包含 115 个线要素,我想弄清楚是否可以使用循环或类似功能选择每个线要素并将其保存到单独的形状文件中?

我了解如何使用子集(下面的示例)单独执行此操作,但是重复此过程 115 次似乎是在浪费时间和 R 的力量。

我将包含以下数据的示例:

trailname <- ("trail1", "trail2", "trail3")
trailtype <- ("mountain", "flat", "hilly")
parking <- ("no", "yes", "no")
shapelength <- ("835", "5728", "367")
trails <- data.frame(accessname, trailtype, parking, shapelength)

这是一个单独的子集示例:

trail1 <- subset(trails, trailname == "trail1")

我想选择每条路径,并将其保存为“路径名称”列下显示的名称,即 trail1.shp

【问题讨论】:

  • 你试过tidyr::unnest_wider()tidyr::hoist()
  • 使用子集(下面的示例) ...示例在哪里?
  • tidy::unnest 似乎不适用于空间文件。
  • 添加子集示例

标签: r subset spatial shapefile


【解决方案1】:

在基础 R 中,您不能在 for 循环中使用 assign 函数来执行此操作吗?

trailname <- c("trail1", "trail2", "trail3")
trailtype <- c("mountain", "flat", "hilly")
parking <- c("no", "yes", "no")
shapelength <- c("835", "5728", "367")
trails <- data.frame(trailname, trailtype, parking, shapelength)


for(i in 1:nrow(trails)){

name <- as.character(trails$trailname[[i]])

assign( name, subset(trails, trailname == trails$trailname[[i]]) )

}

编辑以回答 OP 的评论

这应该可以通过一些调整来实现。需要注意的一点是,您提供的示例是一个数据框,而 writeOGR 函数需要...

在 sp 包中定义的 SpatialPointsDataFrame、SpatialLinesDataFrame 或 SpatialPolygonsDataFrame 对象。

这些类型的对象有数据框,还有其他可能感兴趣的属性。假设您的数据属于这些可接受的类型之一。我将使用rgdal 城市数据作为示例。如果我们只关心在 R 会话之外保存文件,则跳过 assign 函数并将 subset 放入 writeOGR 函数中:

library('rgdal')

#loading in data
cities <- readOGR(system.file("vectors", package = "rgdal")[1], "cities")

#taking only first two rows for this example
shap <- cities[1:2,]

 #where you want to save these files. This places it on your current working directory
location <- getwd()[[1]]

for(i in 1:nrow(shap)){

  # name of file
   name <- as.character(shap$NAME[[i]])

 # change shap to your 'SpatialPointsDataFrame' 
 writeOGR(subset(shap, NAME == shap$NAME[[i]]), location, name , driver="ESRI Shapefile")

}

【讨论】:

  • 太好了,成功了。有没有办法让我也使用循环中的 writeOGR 函数保存每个单独的文件?
  • 一个想法见上文
【解决方案2】:

有一个名为 ShapePattern 的 R 包。查找函数 shpsplitter。似乎做你想做的事。否则你可以在其他 GIS 软件中完成,见这里https://gis.stackexchange.com/questions/25709/splitting-shapefile-into-separate-files-for-each-feature-using-qgis-gdal-saga

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2015-10-05
    • 2015-09-07
    • 2020-08-08
    • 2019-02-22
    • 2020-08-03
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多