GDAL Raster Output
Asked Answered
R

2

7

I'm trying to create a .tif file using GDAL in python. It's creating a file, but saying "no preview available" whenever I browse to it. Right now, I'm just trying to get it to make a copy of the input file. Here's my code:



gdal.AllRegister()

inDs = gdal.Open("C:\\Documents and Settings\\patrick\\Desktop\\tiff elevation\\EBK1KM\\color_a2.tif")
if inDs is None:
  print 'Could not open image file'
  sys.exit(1)
else:
    print "successfully opened input file"

rows = inDs.RasterYSize
cols = inDs.RasterXSize
myband = inDs.GetRasterBand(1)
elev_data = myband.ReadAsArray(0,0,cols,rows)
driver = inDs.GetDriver()
outDs = driver.Create('C:\\Documents and Settings\\patrick\\Desktop\\tiff elevation\\EBK1KM\\new.tif', cols, rows, 1, GDT_Int32)

if outDs is None:
    print "couldn't open output file"
    sys.exit(1)

outBand = outDs.GetRasterBand(1)
outData = numpy.zeros((rows,cols),numpy.int16)
outBand.WriteArray(elev_data)
outBand.FlushCache()
outBand.SetNoDataValue(-99)
outDs.SetGeoTransform(inDs.GetGeoTransform())
outDs.SetProjection(inDs.GetProjection())
del outData

============================update========================================= made some discoveries... I've studied ways of converting from one number format to another using statistical normalization. I processed the input data and transformed it to uint8 by using the following algorithm:
std = elev_data.std() #standard dev
avg = elev_data.mean()
arr = numpy.zeros((rows,cols),numpy.uint8)
for _i_ in _range_(_rows_):
    for _j_ in _range_(_cols_):
        arr[i,j] = (((out_elev[i,j]-avg)/std)*127)+128 #normalization formula
        #this puts all vals in range 1 to 255 (uint8)
dr = gdal.GetDriverByName("GTiff")
outDs = dr.Create("name",cols,rows,3,GDT_Byte) 
#creates and RGB file, accepts uint8 for input
outDs.GetRasterBand(1).WriteArray(arr) #write the output as shades of red
#this writes out a format viewable by microsoft products

the main reason I wanted to copy was to prove that I could read in, then write out updated data based on calculations.

what might be a way I could write out the output data using a color ramp, instead of shades of just one color?

Raye answered 15/7, 2011 at 16:42 Comment(0)
D
2

Do you mean you're getting "No preview available" from the Windows Picture and Fax Viewer application when trying to preview the TIFF file as an image? (See below screenshot.)

No preview available screenshot

Bear in mind that there are many different flavors of TIFF, and not all are the same. In particular, the Windows Picture and Fax Viewer does not support all kinds of TIFFs.

There is a Microsoft Knowledge Base article You Cannot View TIFF Images Using Windows Picture and Fax Viewer that says in part:

Windows Picture and Fax Viewer in Windows XP uses Windows Graphics Device Interface (GDI+). GDI+ supports many standard compression algorithms for faxes. However, it may be incompatible with some of the encoding schemes that are not used frequently.

If you're looking for a tool for viewing raster data (including GeoTIFF rasters), I'd recommend the freely available OpenEV, which you can get as part of the FWTools package.

Delegate answered 15/7, 2011 at 18:12 Comment(0)
E
1

Couple of things I notice:

  1. You only copy one band of the source dataset. If it is a color image, it may have 3 bands, or a color map. If it has a color map, you need to copy it over as well. If it is 3 or 4 bands, you have to copy all of the data.
  2. CreateCopy() is an easier way to do what you are looking for.
Encomiastic answered 29/7, 2011 at 19:55 Comment(1)
I figured out my issue - I didn't have a proper viewer for the type of output file I was creating. Int16 is not supported by microsoft products for viewing. I downloaded and installed Brava Reader, and it's able to view most forms of output I can generate.Raye

© 2022 - 2024 — McMap. All rights reserved.