Hi:

Some preliminary comments first

1- You might get a better response posting to R-sig-Geo

2- Probably better to switch to the `terra` package instead of the older `raster`

3- Furthermore, there is the package `exactextractr` that ensures that edge pixels are taken into account, weighted by the actual, partial coverage of each pixel by the polygon.

4- Can you post: your R version, and version of the relevant packages, and information about the polygons and DEM (i.e. `str(p)` and `str(r)` )


On 20/11/2023 14:30, javad bayat wrote:
Dear all;
I am trying to calculate volume under each polygon of a shapefile according
to a DEM.
when I run the code, it gives me an error as follows.
"
Error in h(simpleError(msg, call)) :
   error in evaluating the argument 'x' in selecting a method for function
'addAttrToGeom': sp supports Z dimension only for POINT and MULTIPOINT.
use `st_zm(...)` to coerce to XY dimensions
"
I want to have a table that contains one column corresponding to the
polygon rank and another that contains the volume on that polyon.
I would be more than happy if anyone could help me.
I provided codes at the end of this email.
Sincerely


##########################################################################################
library(raster);
library(sf)
# Load the DEM raster and shapefile
r <- raster("E:/Base1.tif")
p <- read_sf(dsn = "E:/Sites.shp", layer = " Sites")


Now to the question:

In `read_sf()`, when the source is a shapefile, you do not need the 'layer' option. It doesn't hurt, but in this case I see that you have an extra space before the layer name. Could that be causing the problem?



# Extract the values of the DEM raster for each polygon
values <- extract(r, p)
   Error in h(simpleError(msg, call)) :
   error in evaluating the argument 'x' in selecting a method for function
'addAttrToGeom': sp supports Z dimension only for POINT and MULTIPOINT.
use `st_zm(...)` to coerce to XY dimensions

# Calculate the volume of each polygon
volumes <- sapply(values, function(x) rasterVolume(x, r))

What is this "rasterVolume" function that you call here?


# Print the results
for (i in 1:length(volumes)) {
   cat(sprintf("Volume under polygon %d: %f\n", i, volumes[i]))
}
##########################################################################################





--
Micha Silver
Ben Gurion Univ.
Sde Boker, Remote Sensing Lab
cell: +972-523-665918

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to