【问题标题】:Create a spatial polygons data frame that preserves overlapping features with another spatial polygons data frame but does not clip polygon extent创建一个空间多边形数据框,该数据框保留与另一个空间多边形数据框的重叠要素,但不裁剪多边形范围
【发布时间】:2019-11-12 14:09:53
【问题描述】:

我一直在使用 R 中 raster 包中的 intersect() 函数将空间多边形数据框(HUC-4 分水岭)裁剪到另一个空间多边形数据框(由科罗拉多州、爱达荷州、蒙大拿州组成的区域)的范围内、犹他州和怀俄明州)。

我想保留与我要剪裁到的空间数据框重叠的空间多边形的整个范围。使用intersect() 剪切 HUC-4 流域,使它们不会超出被剪切到的状态范围。

我正在使用的流域数据可以从以下位置下载:ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/National/GDB/ (WBD_National_GDB.zip)。

该地区包括科罗拉多州、犹他州、爱达荷州、怀俄明州和蒙大拿州的数据是从以下可用的县数据中提取的:https://catalog.data.gov/dataset/tiger-line-shapefile-2017-nation-u-s-current-county-and-equivalent-national-shapefile

我用intersect()函数做剪辑的代码如下:

library(raster)
library(dplyr)
library(spdplyr)
library(rgdal)
library(rgeos)

# albers equal area projection
proj <- CRS("+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs ")

counties <- readOGR(dsn = "./data/tl_2017_us_county/tl_2017_us_county.shp")

# filtering out only counties in our 5 states of interest
counties <- counties %>%
  filter(STATEFP %in% c("08", "16", "30", "49", "56"))

# transforming to albers projection
counties <- spTransform(counties, proj)

# create a region shapefile (to clip watersheds with)
region <- gUnaryUnion(counties)

# Make Region into a SpatialPolygonsDataFrame
row.names(region) <- as.character(1:length(region))
region_data <- c("West")
region_data <- as.data.frame(region_data)
colnames(region_data) <- "Region"

region <- SpatialPolygonsDataFrame(region, region_data)

file <- "./data/WBD_National_GDB/WBD_National_GDB.gdb"

# huc4 watersheds
huc4 <- readOGR(dsn = file, layer = "WBDHU4")

# transforming to albers projection
huc4 <- spTransform(huc4, proj)

# selecting only huc4 watersheds that intersect with our states of interest
huc4_clip <- raster::intersect(huc4, region)

# plot the result
plot(huc4_clip)

我想要一个输出文件,它不会裁剪位于感兴趣区域边缘的空间多边形的范围,但不包含任何不直接与感兴趣区域重叠的空间多边形。是否有任何其他我可以使用的函数类似于intersect(),但不会裁剪区域边界上空间多边形的范围?

【问题讨论】:

  • 答案是肯定的,但除非您提供一个最小(尽可能简单)可重现的示例,否则我们无法帮助您。或许请参阅?raster::intersect 以获得灵感。

标签: r geospatial spatial r-raster


【解决方案1】:

如果我正确理解了这个问题,您可以使用函数 gIntersects 找出哪些流域与您的区域相交,然后仅从 huc4 数据集中提取那些流域。在实践中,这样的事情可能会起作用:

intersects <- which(gIntersects(huc4, region, byid = TRUE))
huc4_clip  <- huc4[intersects, ] 

【讨论】:

  • 这很好用,谢谢!需要注意的是,我发现仅当gIntersects(在本例中为区域)中的 spgeom2 仅是一个大多边形时,才使用此方法。我尝试将 spgeom2 作为一个状态多边形来执行此操作,多个多边形用于不同的状态,它给了我一个错误,并且在我尝试提取剪辑时不起作用。
  • 这可能是因为如果 spgeom2 包含多个特征,那么 gIntersects 返回一个矩阵,告诉 spgeom2 的哪个元素与 spgeom 的每个元素相交。这种情况的一个简单解决方案是使用类似intersects &lt;- which(colSums(gIntersects(polys_sp, filt_bbox, byid = TRUE)) &gt; 0)
  • 再次感谢您的解决方案@Ibusett。我最近一直在涉足sf 包,并发现使用st_intersects 是这里的另一个很好的选择。例如,huc4_clip &lt;- huc4 %&gt;% filter(st_intersects(region, huc4, sparse = FALSE))sparse=FALSE 保留了 sf 对象的数据框元素。
猜你喜欢
  • 2018-12-13
  • 1970-01-01
  • 2018-08-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多