代码改变世界

调色板栅格数据使用GDAL时注意

2007-04-27 09:55  flyingfish  阅读(2028)  评论(2编辑  收藏  举报

 

这几天用GDAL处理DRG数据时发现,有数据被处理成了黑板,什么都没有,发现是因为DRG图像颜色比较简单,使用了调色板的缘故。
使用SetColorTable将调色板写入后,一部分基本正常,但还有些图像还是有黑板的现象。仔细察看出错的DRG与正常的DRG的区别,发现
正常的:
C:\Program Files\FWTools1.0.5>
C:\Program Files\FWTools1.0.5>gdalinfo D:\RasterTest\DRG\I48E010019DRG.TIF
Driver: GTiff/GeoTIFF
Size is 6946, 5715
Coordinate System is `'
Origin = (636178.308000,3822519.830000)
Pixel Size = (4.00000000,-4.00000000)
Metadata:
TIFFTAG_XRESOLUTION=317.5
TIFFTAG_YRESOLUTION=317.5
TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
Corner Coordinates:
Upper Left ( 636178.308, 3822519.830)
Lower Left ( 636178.308, 3799659.830)
Upper Right ( 663962.308, 3822519.830)
Lower Right ( 663962.308, 3799659.830)
Center ( 650070.308, 3811089.830)
Band 1 Block=6946x1 Type=Byte, ColorInterp=Palette
Color Table (RGB with 256 entries)
0: 128,0,128,255
1: 78,125,208,255
2: 194,226,255,255
3: 150,240,100,255
4: 200,240,170,255
5: 150,105,66,255
6: 255,255,255,255
7: 150,150,150,255
8: 0,0,0,255
9: 0,0,0,255
出错的:
C:\Program Files\FWTools1.0.5>gdalinfo D:\RasterTest\DRG\I49E012003DRG\2.TIF
Driver: GTiff/GeoTIFF
Size is 1705, 1425
Coordinate System is `'
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 1425.0)
Upper Right ( 1705.0, 0.0)
Lower Right ( 1705.0, 1425.0)
Center ( 852.5, 712.5)
Band 1 Block=1705x4 Type=Byte, ColorInterp=Gray
还是调色板没处理好,查遍资料发现没有什么特别的地方,最后仔细跟踪错误代码,在GDAL代码中找到
  • /* -------------------------------------------------------------------- */

  • /* Check if this is even a candidate for applying a PCT. */

  • /* -------------------------------------------------------------------- */

  • if( poGDS->bCrystalized )

  • {

  • CPLError( CE_Failure, CPLE_NotSupported,

  • "SetColorTable() not supported for existing TIFF files." );

  • return CE_Failure;

  • }

  • 百思不得其解,折腾了半天最后在GDAL-DEV看到这段:

    I think the key here is that the GeoTIFF driver in GDAL库 only allows you
    to assign a pseudocolor table to a file before you start any raster data.
    察看代码,发现把SetColorTable放在了RasterIO,Write之后了,修改后就好了。