Cannot correctly assign Data type of upper left cell in ascii grid with writeRaster

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Cannot correctly assign Data type of upper left cell in ascii grid with writeRaster

Mika
Dear list,

  I encountered a problem when trying to write an Ascii-grid of integers
with raster::writeRaster.
When using that function, the upper left cell (only that cell!) in the
resulting ascii grid will always
  be a floating point number, even if I convert the whole raster to
integers before.

  However, when I convert the raster to a SpatialPixelDataFrame and
write the Ascii file with
  maptools::writeAsciiGrid, the resulting upper left cell will be
correctly saved as an integer.
So Is this a bug or am I doing something wrong here?

  Here is a reproducible example:

library(raster)
library(maptools)
library(SDMTools)
library(adehabitat)

# create raster

m <- matrix(c(-999,-999,-999,-999,-999,-999.999,-999.9,-999,1,6,
               -999,-999,-999,7,1,6,7,2,6,3,
               4,7,3,4,5,3,7,9,3,8,
               9,3,6,8,3,4,7,3,7,8,
               3,3,-999.999,7,5,3,2,8,9,8,
               7,6,2,6,5,2,2,7,7,7,
               4,7,2,5,7,7,7,3,3,5,
               7,6,7,5,-999,6,5,2,3,2,
               4,9,2,5,5,8,3,3,1,2,
               5,2,6,5,1,5,3,7,7,2),nrow=10, ncol=10, byrow = T)

r <- raster(m)
values(r)<-as.integer(values(r))

#------------------------------------------------------
# write the raster and read the resulting file in again
writeRaster(r, "Test_writeRaster.asc",NAflag =-999,overwrite=T)
a<-read.table("Test_writeRaster.asc",stringsAsFactors = F)

a[7,] # upper left cell in the ascii file is a floating point number!

#------------------------------------------------------
# convert, write with writeAsciiGrid and read the resulting file in again
asc <- asc.from.raster(r) # convert to asc
rasc <- asc2spixdf(asc)   # convert to SpatialPixelDataFrame

writeAsciiGrid(rasc,"Test_writeAsciiGrid.asc", na.value =-999)
a<-read.table("Test_writeAsciiGrid.asc",stringsAsFactors = F)

a[7,] # upper left cell in the ascii file is a

# R version 3.2.5 (2016-04-14)
# Platform: i386-w64-mingw32/i386 (32-bit)
# Running under: Windows 7 x64 (build 7601) Service Pack 1
#
# locale:
# [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United
States.1252
# [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
# [5] LC_TIME=English_United States.1252
#
# attached base packages:
# [1] stats     graphics  grDevices utils     datasets  methods base
#
# loaded via a namespace (and not attached):
# [1] tools_3.2.5

--
Michael Köhler, PhD

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: Cannot correctly assign Data type of upper left cell in ascii grid with writeRaster

Loïc Dutrieux-2
writeRaster() defaults to Float 8, regardless of the data type of your
input matrix. You can set it explicitly to write to integer by using the
datatype= argument.

writeRaster(r, "Test_writeRaster.asc",NAflag =-999,overwrite=T,
datatype='INT2S')

Cheers,
Loïc

On 17/05/2017 03:21, Michael Koehler wrote:

> Dear list,
>
>  I encountered a problem when trying to write an Ascii-grid of integers
> with raster::writeRaster.
> When using that function, the upper left cell (only that cell!) in the
> resulting ascii grid will always
>  be a floating point number, even if I convert the whole raster to
> integers before.
>
>  However, when I convert the raster to a SpatialPixelDataFrame and write
> the Ascii file with
>  maptools::writeAsciiGrid, the resulting upper left cell will be
> correctly saved as an integer.
> So Is this a bug or am I doing something wrong here?
>
>  Here is a reproducible example:
>
> library(raster)
> library(maptools)
> library(SDMTools)
> library(adehabitat)
>
> # create raster
>
> m <- matrix(c(-999,-999,-999,-999,-999,-999.999,-999.9,-999,1,6,
>               -999,-999,-999,7,1,6,7,2,6,3,
>               4,7,3,4,5,3,7,9,3,8,
>               9,3,6,8,3,4,7,3,7,8,
>               3,3,-999.999,7,5,3,2,8,9,8,
>               7,6,2,6,5,2,2,7,7,7,
>               4,7,2,5,7,7,7,3,3,5,
>               7,6,7,5,-999,6,5,2,3,2,
>               4,9,2,5,5,8,3,3,1,2,
>               5,2,6,5,1,5,3,7,7,2),nrow=10, ncol=10, byrow = T)
>
> r <- raster(m)
> values(r)<-as.integer(values(r))
>
> #------------------------------------------------------
> # write the raster and read the resulting file in again
> writeRaster(r, "Test_writeRaster.asc",NAflag =-999,overwrite=T)
> a<-read.table("Test_writeRaster.asc",stringsAsFactors = F)
>
> a[7,] # upper left cell in the ascii file is a floating point number!
>
> #------------------------------------------------------
> # convert, write with writeAsciiGrid and read the resulting file in again
> asc <- asc.from.raster(r) # convert to asc
> rasc <- asc2spixdf(asc)   # convert to SpatialPixelDataFrame
>
> writeAsciiGrid(rasc,"Test_writeAsciiGrid.asc", na.value =-999)
> a<-read.table("Test_writeAsciiGrid.asc",stringsAsFactors = F)
>
> a[7,] # upper left cell in the ascii file is a
>
> # R version 3.2.5 (2016-04-14)
> # Platform: i386-w64-mingw32/i386 (32-bit)
> # Running under: Windows 7 x64 (build 7601) Service Pack 1
> #
> # locale:
> # [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United
> States.1252
> # [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
> # [5] LC_TIME=English_United States.1252
> #
> # attached base packages:
> # [1] stats     graphics  grDevices utils     datasets  methods base
> #
> # loaded via a namespace (and not attached):
> # [1] tools_3.2.5
>

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo