gpt4 book ai didi

r - 一个或多个多边形覆盖的栅格单元的一部分 : is there a faster way to do this (in R)?

转载 作者:行者123 更新时间:2023-12-04 18:59:41 24 4
gpt4 key购买 nike

图片胜过文字,请看this example image.

我拥有的是

  • 一个 RasterLayer 对象(此处填充随机值仅用于说明目的,实际值无关紧要)
  • 一个包含很多多边形的 SpatialPolygons 对象

  • 您可以使用以下代码重新创建我用于图像的示例数据:
    library(sp)
    library(raster)
    library(rgeos)

    # create example raster
    r <- raster(nrows=10, ncol=15, xmn=0, ymn=0)
    values(r) <- sample(x=1:1000, size=150)

    # create example (Spatial) Polygons
    p1 <- Polygon(coords=matrix(c(50, 100, 100, 50, 50, 15, 15, 35, 35, 15), nrow=5, ncol=2), hole=FALSE)
    p2 <- Polygon(coords=matrix(c(77, 123, 111, 77, 43, 57, 66, 43), nrow=4, ncol=2), hole=FALSE)
    p3 <- Polygon(coords=matrix(c(110, 125, 125, 110, 67, 75, 80, 67), nrow=4, ncol=2), hole=FALSE)

    lots.of.polygons <- SpatialPolygons(list(Polygons(list(p1, p2, p3), 1)))
    crs(lots.of.polygons) <- crs(r) # copy crs from raster to polygons (please ignore any potential problems related to projections etc. for now)


    # plot both
    plot(r) #values in this raster for illustration purposes only
    plot(lots.of.polygons, add=TRUE)

    对于栅格中的每个像元,我想知道一个或多个多边形覆盖了多少像元。或者实际上:栅格单元内所有多边形的面积,没有所讨论单元之外的区域。如果有多个多边形重叠一个单元格,我只需要它们的组合区域。

    下面的代码完成了我想要的,但需要一个多星期的时间来运行实际数据集:
    # empty the example raster (don't need the values):
    values(r) <- NA

    # copy of r that will hold the results
    r.results <- r

    for (i in 1:ncell(r)){
    r.cell <- r # fresh copy of the empty raster
    r.cell[i] <- 1 # set the ith cell to 1
    p <- rasterToPolygons(r.cell) # create a polygon that represents the i-th raster cell
    cropped.polygons <- gIntersection(p, lots.of.polygons) # intersection of i-th raster cell and all SpatialPolygons

    if (is.null(cropped.polygons)) {
    r.results[i] <- NA # if there's no polygon intersecting this raster cell, just return NA ...
    } else{
    r.results[i] <- gArea(cropped.polygons) # ... otherwise return the area
    }
    }

    plot(r.results)
    plot(lots.of.polygons, add=TRUE)

    我可以通过使用 sapply 来提高一点速度而不是 for -loop,但瓶颈似乎在其他地方。整个方法感觉很尴尬,我想知道我是否遗漏了一些明显的东西。一开始我以为 rasterize()应该能够轻松做到这一点,但我不知道该把什么放入 fun=争论。有任何想法吗?

    最佳答案

    [已编辑]
    也许 gIntersection(..., byid = T)gUnaryUnion(lots.of.polygons) (它们使您能够一次处理所有单元格)比 for 循环更快(如果 gUnaryUnion() 花费太多时间,这是一个坏主意)。

    r <- raster(nrows=10, ncol=15, xmn=0, ymn=0)
    set.seed(1); values(r) <- sample(x=1:1000, size=150)
    rr <- rasterToPolygons(r)

    # joining intersecting polys and put all polys into single SpatialPolygons
    lots.of.polygons <- gUnaryUnion(lots.of.polygons) # in this example, it is unnecessary

    gi <- gIntersection(rr, lots.of.polygons, byid = T)

    ind <- as.numeric(do.call(rbind, strsplit(names(gi), " "))[,1]) # getting intersected rr's id
    r[] <- NA
    r[ind] <- sapply(gi@polygons, function(x) slot(x, 'area')) # a bit faster than gArea(gi, byid = T)

    plot(r)
    plot(lots.of.polygons, add=TRUE)
    enter image description here

    关于r - 一个或多个多边形覆盖的栅格单元的一部分 : is there a faster way to do this (in R)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40658173/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com