Hi Janet, I believe you could do this using the `clump()` and `zonalGeog()` functions in the fasterRaster package for R, which calls GRASS (https://github.com/adamlilith/fasterRaster).
It's not clear from your description if the "patch" raster is the reclassed NLCD raster or another raster, but I'll assume it is. So the "patch" raster has groups of cells that had had same ID but are composed of cells that, before reclassing, may have had a different class. I would: # Setup fasterRaster devtools::install_github(' https://github.com/adamlilith/fasterRaster', dependencies = TRUE) library(fasterRaster) faster('C:/Program Files/GRASS GIS 8.3') # install path for GRASS on your system... should be the stand-alone version, not OSGeo # Use fast() to create the rasters: nlcd <- fast('C:/folder/nlcd_raster.tif') nlcd_reclass <- fast('C:/folder/nlcd_reclassed_raster.tif') names(nlcd) <- 'nlcd' names(nlcd_reclass) <- 'nlcd_reclass' # Use clump() to assign unique IDs to each reclassed clump cells. Clumps are sets of adjacent cells with the same value (assuming argument minDiff = 0): clumps <- clump(nlcd_reclass, minDiff = 0) # Get unique clump IDs clump_ids <- freq(clumps) clump_ids <- clump_ids$value # for saving results results <- data.frame(clump_ids = clump_ids) # Loop over each vegetation type of interest in the NLCD # Assumes you have a vector veg_ids with integers indicating the veg types of interest for (veg_id in veg_ids) { # create mask for just this vegetation type fun <- paste0('= if(nlcd == ', veg_id, ', 1, null())` veg_mask <- app(nlcd, fun = fun) # raster of clumps but only with cells in clumps overlapping this veg type veg_by_clump <- veg_mask * clumps names(veg_by_clump) <- 'veg_by_clump' # calculate area of cells in each masked clump stats <- zonalGeog(veg_by_clump) stats <- stats$veg_by_clump # output is a list of data frames, so just get the df # remember the value of "area" for each relevant patch # I'm hazy on this part, as I always have to try match() to see how it works, but you can figure it out. areas <- stats$area[match(stats$value, results$clump_ids)] results$NEW <- areas # add to results names(results)[ncol(results)] <- paste0('veg_id_', veg_id) # rename column } To get % of each patch with each veg type, simply sum across the "area" rows and divide each value by that sum. I think you could do something similar with a) patches() to assign cell numbers to patches, b) cycle over unique patch IDs and mask out anything that does not have that ID, then c) count the number of cells in the veg-type-by-clump raster using global(..., fun = 'sum', na.rm = TRUE). If you have a lot of patches x veg-type combinations, it could take a while, though. Adam Center for Conservation & Sustainable Development Missouri Botanical Garden 4344 Shaw Boulevard Saint Louis, MO 63110 USA +01 314-577-9473 ext. 76314 www.earthSkySea.org -----Original Message----- From: grass-user <grass-user-boun...@lists.osgeo.org> On Behalf Of grass-user-requ...@lists.osgeo.org Sent: Thursday, June 6, 2024 2:00 PM To: grass-user@lists.osgeo.org Subject: grass-user Digest, Vol 218, Issue 8 Send grass-user mailing list submissions to grass-user@lists.osgeo.org To subscribe or unsubscribe via the World Wide Web, visit https://lists.osgeo.org/mailman/listinfo/grass-user or, via email, send a message with subject or body 'help' to grass-user-requ...@lists.osgeo.org You can reach the person managing the list at grass-user-ow...@lists.osgeo.org When replying, please edit your Subject line so it is more specific than "Re: Contents of grass-user digest..." Today's Topics: 1. computing percent cover (Janet Choate) 2. Re: computing percent cover (Anna Petr??ov?) 3. Re: computing percent cover (Micha Silver) ---------------------------------------------------------------------- Message: 1 Date: Wed, 5 Jun 2024 17:09:45 -0700 From: Janet Choate <jsc....@gmail.com> To: grass list <grass-user@lists.osgeo.org> Subject: [GRASS-user] computing percent cover Message-ID: <CAEqw1VzTdprBBQoO=ywbjog910j2mvko75npu4yafrifn2d...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" Hi GRASS community, I downloaded land cover data from NLCD and reclassed values into 6 categories to generate a vegetation/landcover type raster (tree, shrub, grass, non-veg, water, developed) that is composed of IDs (i.e. 11=tree, 5-shrub, etc...) I also have a 90 meter patch raster. Any given 90 meter patch may have more than one vegetation type ID occurring in it. I would like to generate percent coverage maps to find the percent that each vegetation type occupies of each patch (i.e. patch 1 is composed of 60% tree, 30% shrub, 10%grass). Is it possible to compute percent cover from a vegetation type ID map? Any advice would be much appreciated, I have unsuccessfully tried to do this in GRASS as well as R. thank you, Janet -- Tague Team Lab Manager 1005 Bren Hall UCSB, Santa Barbara, CA. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20240605/9011d229/attachment-0001.htm> ------------------------------ Message: 2 Date: Wed, 5 Jun 2024 23:24:39 -0400 From: Anna Petr??ov? <kratocha...@gmail.com> To: Janet Choate <jsc....@gmail.com> Cc: grass list <grass-user@lists.osgeo.org> Subject: Re: [GRASS-user] computing percent cover Message-ID: <cae0edeqjnbj+7trf8kwldojgqkugrrpth0fck352rn8r86o...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" Hi Janet, you could run r.report: r.report map=patches,landcover But the output is not easily parseable. r.report internally runs r.stats: r.stats -a input=patches,landcover separator=comma you get output like (patch id, landcover id, area): 2,1,1205379.000000 1,5,938148.750000 3,1,904034.250000 2,3,557203.500000 1,1,512529.750000 1,4,361451.250000 so you need to postprocess it then. On Wed, Jun 5, 2024 at 8:10?PM Janet Choate via grass-user < grass-user@lists.osgeo.org> wrote: > Hi GRASS community, > I downloaded land cover data from NLCD and reclassed values into 6 > categories to generate a vegetation/landcover type raster (tree, > shrub, grass, non-veg, water, developed) that is composed of IDs (i.e. > 11=tree, 5-shrub, etc...) I also have a 90 meter patch raster. > Any given 90 meter patch may have more than one vegetation type ID > occurring in it. > I would like to generate percent coverage maps to find the percent > that each vegetation type occupies of each patch (i.e. patch 1 is > composed of 60% tree, 30% shrub, 10%grass). > Is it possible to compute percent cover from a vegetation type ID map? > Any advice would be much appreciated, I have unsuccessfully tried to > do this in GRASS as well as R. > thank you, > Janet > > -- > Tague Team Lab Manager > 1005 Bren Hall > UCSB, Santa Barbara, CA. > _______________________________________________ > grass-user mailing list > grass-user@lists.osgeo.org > https://lists.osgeo.org/mailman/listinfo/grass-user > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20240605/edef6674/attachment-0001.htm> ------------------------------ Message: 3 Date: Thu, 6 Jun 2024 17:55:42 +0300 From: Micha Silver <tsvi...@gmail.com> To: Janet Choate <jsc....@gmail.com>, grass list <grass-user@lists.osgeo.org> Subject: Re: [GRASS-user] computing percent cover Message-ID: <83520995-0be6-4875-87be-d5676db5b...@gmail.com> Content-Type: text/plain; charset="us-ascii" An HTML attachment was scrubbed... URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20240606/69b6193b/attachment-0001.htm> ------------------------------ Subject: Digest Footer _______________________________________________ grass-user mailing list grass-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/grass-user ------------------------------ End of grass-user Digest, Vol 218, Issue 8 ****************************************** _______________________________________________ grass-user mailing list grass-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/grass-user