# ShowGeotiff.r # Have a look at a downloaded satellite image and check if stats are correctly calculated # I downloaded and calculated the stats for the polygon defined in C:\git\FarmMapsApiClient_WURtest\FarmmapsDataDownload\DataDownloadInput.json # in which I set "SatelliteBand": "wdvi" and in which in the console I requested the image for date '2022-03-08' library(raster) library(sf) library(rgdal) setwd("C:/git/FarmMapsApiClient_WURtest/FarmmapsDataDownload/bin/Debug/netcoreapp3.1/Downloads") # FarmmapsDataDownload fileGeotiff <- "sentinelhub_test_BvdTFieldlabG92_20220308.tif" lenfilename <- nchar(fileGeotiff) year <- substr(fileGeotiff,lenfilename-11,lenfilename-8) imgdate <- substr(fileGeotiff,lenfilename-11,lenfilename-4) stk.sentinelhub <- stack(x=fileGeotiff) # plot(stk.sentinelhub) shows 6 plots (6 bands) # 1. ndvi # 2. wdvi Note wdvi-red # 3. ci-red # 4. natural: red # 5. natural: green # 6. natural: blue names(stk.sentinelhub) <- c("ndvi","wdvired","ci-red","red","green","blue") plot(stk.sentinelhub) crs(stk.sentinelhub) # CRS arguments: +proj=longlat +datum=WGS84 +no_defs stk.sentinelhub.rd <- projectRaster(stk.sentinelhub, crs = CRS('+init=EPSG:28992')) crs(stk.sentinelhub) r.sentinelhub.rd.wdvi <- subset(stk.sentinelhub.rd,2) dev.off() plot(r.sentinelhub.rd.wdvi,main=paste("wdvi",imgdate),xlab="RDX",ylab="RDY") cellStats(r.sentinelhub.rd.wdvi,'mean') # 0.2252725 # Convert the .rd.wdvi raster to WGS84 r.sentinelhub.wgs84.wdvi <- projectRaster(r.sentinelhub.rd.wdvi, crs = CRS('+init=EPSG:4326')) # Draw a polygon on top of the raster # Polygon pol from C:\git\FarmMapsApiClient_WURtest\FarmmapsDataDownload\DataDownloadInput.json pol <- data.frame(id = 1, wkt = gsub("\n","",'POLYGON(( 5.563472073408009 52.547554398144172, 5.567425915520115 52.547725375100377, 5.567917474269188 52.540608459298582, 5.563878143678981 52.54048022658143, 5.563472073408009 52.547554398144172 ))')) pol.wgs84 <- st_as_sf(pol, wkt = 'wkt', crs = CRS('+init=EPSG:4326')) pol.rd <- st_transform(pol.wgs84, "+init=epsg:28992") #Calculate approximate middle of polygon res <- as.data.frame(do.call("rbind", lapply(st_geometry(pol.wgs84), st_bbox))) res$latmid <- (res$ymax+res$ymin)/2.0 res$lonmid <- (res$xmax+res$xmin)/2.0 res # xmin ymin xmax ymax latmid lonmid # 1 5.563472 52.54048 5.567917 52.54773 52.5441 5.565695 # Have a look at both polygons # wg84 dev.off() plot(r.sentinelhub.wgs84.wdvi,main=paste("wdvi",imgdate),xlab="LON",ylab="LAT") plot(pol.wgs84,add=TRUE, col="transparent",border="red") # RD dev.off() plot(r.sentinelhub.rd.wdvi,main=paste("wdvi",imgdate),xlab="RDX",ylab="RDY") plot(pol.rd,add=TRUE, col="transparent",border="red") # Clip the polygon from the full rectangle figure r.sentinelhub.rd.wdvi.pol <- mask(r.sentinelhub.rd.wdvi,pol.rd) r.sentinelhub.wgs84.wdvi.pol <- mask(r.sentinelhub.wgs84.wdvi,pol.wgs84) dev.off() plot(r.sentinelhub.wgs84.wdvi.pol,main=paste("wdvi",imgdate),xlab="LON",ylab="LAT") plot(pol.wgs84,add=TRUE, col="transparent",border="red") #That's what we want! # Now compare the stats cellStats(r.sentinelhub.wgs84.wdvi,'mean') # [1] 0.2250987 # Stats from rectangle, WGS84 cellStats(r.sentinelhub.rd.wdvi,'mean') # [1] 0.2252725 # Stats from rectangle, RD. Almost but not exactly same as above cellStats(r.sentinelhub.wgs84.wdvi.pol,'mean') # [1] 0.2275067 # Stats from raster clipped by polygon, WGS84 cellStats(r.sentinelhub.rd.wdvi.pol,'mean') # [1] 0.2275073 # Stats from raster clipped by polygon, RD. Almost but not exactly same as above # file satelliteStats_test_BvdTFieldlabG92_20220308.csv # "wdvi" "mean": 0.22744397204465 # Mean in csv corresponds with cellStats calculated from clipped tif! # So while the tif returned is a non-clipped image, the downloaded statistics are from the clipped image # Exactly as we wanted. cellStats(r.sentinelhub.wgs84.wdvi.pol,'median') # Error in .local(x, stat, ...) : invalid 'stat'. Should be sum, min, max, sd, mean, or 'countNA' r.sentinelhub.wgs84.wdvi.vals <- values(r.sentinelhub.wgs84.wdvi) median(r.sentinelhub.wgs84.wdvi.vals) # [1] NA median(r.sentinelhub.wgs84.wdvi.vals,na.rm=TRUE) # [1] 0.2318 r.sentinelhub.wgs84.wdvi.pol.vals <- values(r.sentinelhub.wgs84.wdvi.pol) median(r.sentinelhub.wgs84.wdvi.pol.vals) # [1] NA median(r.sentinelhub.wgs84.wdvi.pol.vals,na.rm=TRUE) # [1] 0.2338 # file satelliteStats_test_BvdTFieldlabG92_20220308.csv # "wdvi" "mean": 0.233799993991851 # Median is same as for median(r.sentinelhub.wgs84.wdvi.pol.vals,na.rm=TRUE) # in csv corresponds with cellStats calculated from clipped tif! # So while the tif returned is a non-clipped image, the downloaded statistics are from the clipped image # Exactly as we wanted. cellStats(r.sentinelhub.wgs84.wdvi,'countNA') # [1] 27896 ncell(r.sentinelhub.wgs84.wdvi) # [1] 272718 cellStats(r.sentinelhub.wgs84.wdvi,'countNA') / ncell(r.sentinelhub.wgs84.wdvi) # [1] 0.1022888 # 10% no data? doesn't show in the plot? cellStats(r.sentinelhub.wgs84.wdvi.pol,'countNA') # [1] 57625 summary(r.sentinelhub.wgs84.wdvi.pol.vals) # shows the same: NA's: 57625 ncell(r.sentinelhub.wgs84.wdvi.pol) # [1] 272718 populationCount = ncell(r.sentinelhub.wgs84.wdvi.pol) - cellStats(r.sentinelhub.wgs84.wdvi.pol,'countNA') populationCount # [1] 215093 # file satelliteStats_test_BvdTFieldlabG92_20220308.csv # "wdvi" "populationCount": 214688 # similar but not same