Thursday, 11 October 2018

Converting shapefile to raster: Character attributes


I've got a shapefile that I would like to convert into a raster, but the trick is that the attribute I want a raster version of is character data. I'm familiar with geoprocessing using GDAL (in the command line) and R, so solutions using either of those two are preferred. However, I have access to QGIS if necessary, and even ArcMap.


I'm using this shapefile. It contains polygons of municipalities in part of Brazil. The attribute NAME_2 is the name of the municipality, and I want a raster version of that.



I know that you can't make a raster with characters, so I created a numeric version of NAME_2 in R by doing


library("rgdal")
munisCrop.shape = readOGR(dsn=getwd(), layer="munisCrop") # Read shapefile
munisCrop.shape$NAME_2_NUM = as.numeric(munisCrop.shape$NAME_2) # Make new attribute
writeOGR(obj = munisCrop.shape, dsn = getwd(), layer = "munisCrop", driver = "ESRI Shapefile") # Save new version of shapefile

Values in munisCrop.shape$NAME_2_NUM range from 1 to 787.


I was hoping to then use gdal_rasterize on my command line (GDAL version 1.10.1 on Mac OS X 10.9.2) to make a raster version of the shapefile. Here's the code I was trying (separate lines for clarity):


gdal_rasterize -of GTiff -ot UInt32 -a NAME_2_NUM \
-tr 0.0002777778 0.0002777778 -ot BYTE \

-co COMPRESS=LZW -l munisCrop \
munisCrop.shp munisCrop.tif

This completes easily enough. However, when viewing munisCrop.tif in QGIS, I see that the data range from 0 to 255. This is confirmed in R with


library("raster")
munisCrop.raster = raster("munisCrop.tif")
sort(unique(getValues(munisCrop.raster)))

0 makes sense, as NA values got converted to that. However, the maximum value of 255 is no good; remember, the maximum value of that attribute in the shapefile is 787.


I think I understand why this is happening but can somebody really explain it to me and suggest a workaround?



I've tried various options in gdal_rasterize instead of -ot UInt32 (for example, BYTE), and the result is always the same. I've also tried rasterizing it in R:


munisCrop.blankraster = raster(ext = extent(munisCrop.shp), 
resolution = 0.0002777778,
crs = projection(munisCrop.shp)
)
munisCrop.Rraster = rasterize(x = munisCrop.shp,
y = munisCrop.blankraster,
field = "NAME_2_NUM"
)


But that seems like it takes forever. gdal_rasterize is way faster (a matter of seconds instead of... indefinite), so I'd love a solution using that.




No comments:

Post a Comment