我需要使用spsample()从shapefile列表中的每个shapefile上放置随机点。对于一些不规则的shapefile,这被证明是一个漫长的过程,所以我需要通过丢弃小的和远程的多边形来简单地使用一些shapefile(我认为)是spsample()的麻烦制造者。
为此,我需要知道每个多边形的大小和它与所有其他多边形的平均距离。我正在寻找如何加快这个计算,可能是以更优雅(和更快)的方式完成。下面显示的尝试有效但作为简化算法需要花费太多时间。
#program tries to place random points on shapefile shapes[[i]] if it fails after 300 seconds it goes though to simplifying part and swaps the old shapefile with a simplified version.
d <- shapes[[i]]
Fdist <- list()
for(m in 1:dim(d)[1]) {
pDist <- vector()
for(n in 1:dim(d)[1]) {
pDist <- append(pDist, gDistance(d[m,],d[n,]))
}
Fdist[[m]] <- pDist
d@data$mean[m]<-mean(Fdist[[m]])
d@data$gArea[m]<-gArea(d[m,])
}
#drop small and remote polygons
d.1<-d[d@data$gArea>=quantile(d@data$gArea, prob = seq(0, 1, length=11), type=5)[[1]] & (d@data$mean<=quantile(d@data$mean, prob = seq(0, 1, length=11), type=5)[[10]]),]
#replace with simplified polygon
shapes[[i]]<-d.1
如果有任何建议,我将不胜感激。
答案 0 :(得分:2)
我会首先尝试简化多边形。 ms_simplify
包中的rmapshaper
可以大大简化您的多边形,而不会引入滑动多边形或间隙:
library("rgdal")
library("rmapshaper")
big <- readOGR(dsn = ".", "unsimplified_shapefile")
big_sample <- spsample(big, 1000, type = "stratified")
small <- rmapshaper::ms_simplify(big, keep = 0.01)
small_sample <- spsample(small, 1000, type = "stratified")
使用我必须提供的shapefile,我将~100MB的shapefile减少到~2MB,并将采样时间从~2.3s减少到~0.11s。
如果无法简化,您可以使用gArea()
向gDistance()
和byid = TRUE
函数进行矢量化:
library("rgeos")
big@data$area <- gArea(big, byid = TRUE)
big@data$dist <- gDistance(big, byid = TRUE)