handle NODATA for rgb and grey images in gdal.input - closes #727
This commit is contained in:
parent
f9040c6026
commit
b8663b67e3
2 changed files with 56 additions and 2 deletions
|
@ -14,6 +14,8 @@ For a complete change history, see the SVN log.
|
||||||
Mapnik Trunk
|
Mapnik Trunk
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
- Support for NODATA values with grey and rgb images in GDAL plugin (#727)
|
||||||
|
|
||||||
- Print warning if invalid XML property names are used (#110)
|
- Print warning if invalid XML property names are used (#110)
|
||||||
|
|
||||||
- Made XML property names use consistent dashes, never underscores (#644)
|
- Made XML property names use consistent dashes, never underscores (#644)
|
||||||
|
|
|
@ -290,18 +290,68 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
|
||||||
#ifdef MAPNIK_DEBUG
|
#ifdef MAPNIK_DEBUG
|
||||||
std::clog << "GDAL Plugin: processing rgb bands..." << std::endl;
|
std::clog << "GDAL Plugin: processing rgb bands..." << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
int hasNoData;
|
||||||
|
float nodata = red->GetNoDataValue(&hasNoData);
|
||||||
|
GDALColorTable *color_table = red->GetColorTable();
|
||||||
|
|
||||||
|
if (!alpha && hasNoData && !color_table)
|
||||||
|
{
|
||||||
|
// first read the data in and create an alpha channel from the nodata values
|
||||||
|
float *imageData = (float*)image.getBytes();
|
||||||
|
red->RasterIO(GF_Read, x_off, y_off, width, height,
|
||||||
|
imageData, image.width(), image.height(),
|
||||||
|
GDT_Float32, 0, 0);
|
||||||
|
|
||||||
|
int len = image.width() * image.height();
|
||||||
|
|
||||||
|
for (int i=0; i<len; ++i)
|
||||||
|
{
|
||||||
|
if (nodata == imageData[i])
|
||||||
|
*reinterpret_cast<unsigned *> (&imageData[i]) = 0;
|
||||||
|
else
|
||||||
|
*reinterpret_cast<unsigned *> (&imageData[i]) = 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
red->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 0,
|
red->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 0,
|
||||||
image.width(),image.height(),GDT_Byte,4,4*image.width());
|
image.width(),image.height(),GDT_Byte,4,4*image.width());
|
||||||
green->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 1,
|
green->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 1,
|
||||||
image.width(),image.height(),GDT_Byte,4,4*image.width());
|
image.width(),image.height(),GDT_Byte,4,4*image.width());
|
||||||
blue->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 2,
|
blue->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 2,
|
||||||
image.width(),image.height(),GDT_Byte,4,4*image.width());
|
image.width(),image.height(),GDT_Byte,4,4*image.width());
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (grey)
|
else if (grey)
|
||||||
{
|
{
|
||||||
#ifdef MAPNIK_DEBUG
|
#ifdef MAPNIK_DEBUG
|
||||||
std::clog << "GDAL Plugin: processing gray band..." << std::endl;
|
std::clog << "GDAL Plugin: processing gray band..." << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
int hasNoData;
|
||||||
|
float nodata = grey->GetNoDataValue(&hasNoData);
|
||||||
|
GDALColorTable *color_table = grey->GetColorTable();
|
||||||
|
|
||||||
|
if (hasNoData && !color_table)
|
||||||
|
{
|
||||||
|
#ifdef MAPNIK_DEBUG
|
||||||
|
std::clog << "\tno data value for layer: " << nodata << std::endl;
|
||||||
|
#endif
|
||||||
|
// first read the data in and create an alpha channel from the nodata values
|
||||||
|
float *imageData = (float*)image.getBytes();
|
||||||
|
grey->RasterIO(GF_Read, x_off, y_off, width, height,
|
||||||
|
imageData, image.width(), image.height(),
|
||||||
|
GDT_Float32, 0, 0);
|
||||||
|
|
||||||
|
int len = image.width() * image.height();
|
||||||
|
|
||||||
|
for (int i=0; i<len; ++i)
|
||||||
|
{
|
||||||
|
if (nodata == imageData[i])
|
||||||
|
*reinterpret_cast<unsigned *> (&imageData[i]) = 0;
|
||||||
|
else
|
||||||
|
*reinterpret_cast<unsigned *> (&imageData[i]) = 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 0,
|
grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 0,
|
||||||
image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
|
image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
|
||||||
|
@ -310,9 +360,11 @@ feature_ptr gdal_featureset::get_feature(mapnik::query const& q)
|
||||||
grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 2,
|
grey->RasterIO(GF_Read,x_off,y_off,width,height,image.getBytes() + 2,
|
||||||
image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
|
image.width(),image.height(),GDT_Byte, 4, 4 * image.width());
|
||||||
|
|
||||||
GDALColorTable *color_table = grey->GetColorTable();
|
|
||||||
if (color_table)
|
if (color_table)
|
||||||
{
|
{
|
||||||
|
#ifdef MAPNIK_DEBUG
|
||||||
|
std::clog << "GDAL Plugin: Loading colour table..." << std::endl;
|
||||||
|
#endif
|
||||||
for (unsigned y = 0; y < image.height(); ++y)
|
for (unsigned y = 0; y < image.height(); ++y)
|
||||||
{
|
{
|
||||||
unsigned int* row = image.getRow(y);
|
unsigned int* row = image.getRow(y);
|
||||||
|
|
Loading…
Reference in a new issue