Byte-value tif files not properly read by readGDAL
On Mon, 15 Mar 2010, reeves at nceas.ucsb.edu wrote:
Hello List: I am reading an 8 bit format raster .tif image, containing 0s and 1s and written using the Export Data utility of ArcMap GIS on a Windows 7 platform. The image read into R does not consist of 0s and 1s, rather, 0s, 1s, and 128s.
Rick, When you display the image, are the 128s in the locations of NODATA? (Read decimated to save time displaying - raster display should get faster in R 2.11.* when Northern Hemisphere Spring comes). Much of what you provide below simply makes things harder to read, please only provide the output of sessionInfo(), and the message returned when rgdal is loaded. As table() of the band shows 0, 1, and 128 (included below), then 128 is likely to be the encoding used by the software creating the file for NODATA. As is clearly explained, rgdal does no more than interface the GDAL drivers for the GDAL version loaded - here the most recent.
Information from the R session (ver 2.10.1, update packages run).
........
require(rgdal)
Loading required package: rgdal Loading required package: sp Geospatial Data Abstraction Library extensions to R successfully loaded Loaded GDAL runtime: GDAL 1.7.1, released 2010/02/08 Path to GDAL shared files: D:/PROGRA~1/R/R-210~1.1/library/rgdal/gdal Loaded PROJ.4 runtime: Rel. 4.7.1, 23 September 2009 Path to PROJ.4 shared files: D:/PROGRA~1/R/R-210~1.1/library/rgdal/proj
setwd("F:/Projects/NCEAS/Balch")
CheatgrassMapInfo = GDALinfo("BrteNVModisWGS8Bit.tif")
CheatgrassMapInfo
rows 1681 columns 1748 bands 1 origin.x -120.1789 origin.y 37.95729 res.x 0.002427655 res.y 0.002427655 oblique.x 0 oblique.y 0 driver GTiff projection +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs file BrteNVModisWGS8Bit.tif apparent band summary: GDType Bmin Bmax 1 Byte -128 127 Metadata: TIFFTAG_SOFTWARE=IMAGINE TIFF Support Copyright 1991 - 1999 by ERDAS, Inc. All Rights Reserved @(#)$RCSfile: etif.c $ $Revision: 1.10.1.9.1.9.2.11 $ $Date: 2004/09/15 18:42:01EDT $ TIFFTAG_XRESOLUTION=1 TIFFTAG_YRESOLUTION=1 TIFFTAG_RESOLUTIONUNIT=1 (unitless) AREA_OR_POINT=Area
CheatgrassMapIn = readGDAL("BrteNVModisWGS8Bit.tif")
BrteNVModisWGS8Bit.tif has GDAL driver GTiff and has 1681 rows and 1748 columns
summary(CheatgrassMapIn at data$band1)
Min. 1st Qu. Median Mean 3rd Qu. Max. 0.000 0.000 0.000 5.248 1.000 128.000
......
summary(toUnSigned(CheatgrassMapIn at data$band1))
Error in toUnSigned(CheatgrassMapIn at data$band1) : already unsigned
..... Well, if the values are 0, 1, and 128, they are unsigned, there are no negative values and Byte can use the 0:255 range, stored in R as integer, as you see here:
str(CheatgrassMapIn)
Formal class 'SpatialGridDataFrame' [package "sp"] with 6 slots ..@ data :'data.frame': 2938388 obs. of 1 variable: .. ..$ band1: int [1:2938388] 128 128 128 128 128 128 128 128 128 128 ... ..@ grid :Formal class 'GridTopology' [package "sp"] with 3 slots .. .. ..@ cellcentre.offset: Named num [1:2] -120.2 38 .. .. .. ..- attr(*, "names")= chr [1:2] "x" "y" .. .. ..@ cellsize : num [1:2] 0.00243 0.00243 .. .. ..@ cells.dim : int [1:2] 1748 1681 ..@ grid.index : int(0) ..@ coords : num [1:2, 1:2] -120.2 -115.9 38 42 .. ..- attr(*, "dimnames")=List of 2 .. .. ..$ : NULL .. .. ..$ : chr [1:2] "x" "y" ..@ bbox : num [1:2, 1:2] -120.2 38 -115.9 42 .. ..- attr(*, "dimnames")=List of 2 .. .. ..$ : chr [1:2] "x" "y" .. .. ..$ : chr [1:2] "min" "max" ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots .. .. ..@ projargs: chr " +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
...........
unique(CheatgrassMapIn$band1)
[1] 128 0 1
table(CheatgrassMapIn$band1)
0 1 128
2142594 680644 115150
summary(CheatgrassMapIn$band1)
Min. 1st Qu. Median Mean 3rd Qu. Max. 0.000 0.000 0.000 5.248 1.000 128.000 Again, the values in CheatgrassMapIn$band1 should be 0 or 1, somehow the value 128 has appeared. There is a conflict between output of GDALinfo and the summary(CheatgrassMapIn$band1) statement.
No - in the absence of any input from the file metadata, the GDAL driver takes a guess at whether the Byte is signed or unsigned (GDALinfo() says "apparent"). The first guess is signed, but it reads unsigned, which is probably the intention in the creating software. Double-check with gdalinfo externally, but also search the Arc documentation to see how it is encoding NODATA, and whether you can encourage the creating software to declare the NODATA encoding so that the GDAL driver has a reasonable chance of guessing right. Hope this helps, Roger
I do not see a parameter for readGDAL for specifying word size or sign treatment. Can anyone offer advice/insight? Rick Reeves NCEAS
_______________________________________________ R-sig-Geo mailing list R-sig-Geo at stat.math.ethz.ch https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Roger Bivand Economic Geography Section, Department of Economics, Norwegian School of Economics and Business Administration, Helleveien 30, N-5045 Bergen, Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43 e-mail: Roger.Bivand at nhh.no