- initial implementation of the geotiff output by using libgeotiff, not complete (issue #967)

This commit is contained in:
kunitoki 2011-12-05 11:10:13 +01:00
parent 68356d5d4e
commit 784ec6f22e

View file

@ -29,7 +29,16 @@
extern "C"
{
#include <tiffio.h>
#ifdef HAVE_GEOTIFF
#include <xtiffio.h>
#include <geotiffio.h>
#define RealTIFFOpen XTIFFClientOpen
#define RealTIFFClose XTIFFClose
#else
#include <tiffio.h>
#define RealTIFFOpen TIFFClientOpen
#define RealTIFFClose TIFFClose
#endif
}
namespace mapnik {
@ -103,7 +112,7 @@ void save_as_tiff(T1 & file, T2 const& image)
const int height = image.height();
const int scanline_size = sizeof(unsigned char) * width * 3;
TIFF* output = TIFFClientOpen("mapnik_tiff_stream",
TIFF* output = RealTIFFOpen("mapnik_tiff_stream",
"w",
(thandle_t)&file,
tiff_dummy_read_proc,
@ -113,6 +122,10 @@ void save_as_tiff(T1 & file, T2 const& image)
tiff_size_proc,
tiff_dummy_map_proc,
tiff_dummy_unmap_proc);
if (! output)
{
// throw ?
}
TIFFSetField(output, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(output, TIFFTAG_IMAGELENGTH, height);
@ -123,6 +136,44 @@ void save_as_tiff(T1 & file, T2 const& image)
TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, 3);
TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, 1);
// TODO - handle palette images
// std::vector<mapnik::rgb> const& palette
/*
unsigned short r[256], g[256], b[256];
for (int i = 0; i < (1 << 24); ++i)
{
r[i] = (unsigned short)palette[i * 3 + 0] << 8;
g[i] = (unsigned short)palette[i * 3 + 1] << 8;
b[i] = (unsigned short)palette[i * 3 + 2] << 8;
}
TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE);
TIFFSetField(output, TIFFTAG_COLORMAP, r, g, b);
*/
#ifdef HAVE_GEOTIFF
GTIF* geotiff = GTIFNew(output);
if (! geotiff)
{
// throw ?
}
GTIFKeySet(geotiff, GTModelTypeGeoKey, TYPE_SHORT, 1, ModelGeographic);
GTIFKeySet(geotiff, GTRasterTypeGeoKey, TYPE_SHORT, 1, RasterPixelIsPoint);
GTIFKeySet(geotiff, GeographicTypeGeoKey, TYPE_SHORT, 1, 4326); // parameter needed !
GTIFKeySet(geotiff, GeogAngularUnitsGeoKey, TYPE_SHORT, 1, Angular_Degree);
GTIFKeySet(geotiff, GeogLinearUnitsGeoKey, TYPE_SHORT, 1, Linear_Meter);
double lowerLeftLon = 130.0f; // parameter needed !
double upperRightLat = 32.0; // parameter needed !
double tiepoints[] = { 0.0, 0.0, 0.0, lowerLeftLon, upperRightLat, 0.0 };
TIFFSetField(output, TIFFTAG_GEOTIEPOINTS, sizeof(tiepoints)/sizeof(double), tiepoints);
double pixelScaleX = 0.0001; // parameter needed !
double pixelScaleY = 0.0001; // parameter needed !
double pixscale[] = { pixelScaleX, pixelScaleY, 0.0 };
TIFFSetField(output, TIFFTAG_GEOPIXELSCALE, sizeof(pixscale)/sizeof(double), pixscale);
#endif
int next_scanline = 0;
unsigned char* row = reinterpret_cast<unsigned char*>(::operator new(scanline_size));
@ -132,15 +183,15 @@ void save_as_tiff(T1 & file, T2 const& image)
for (int i = 0, index = 0; i < width; ++i)
{
#ifdef MAPNIK_BIG_ENDIAN
#ifdef MAPNIK_BIG_ENDIAN
row[index++] = (imageRow[i] >> 24) & 0xff;
row[index++] = (imageRow[i] >> 16) & 0xff;
row[index++] = (imageRow[i] >> 8) & 0xff;
#else
#else
row[index++] = (imageRow[i]) & 0xff;
row[index++] = (imageRow[i] >> 8) & 0xff;
row[index++] = (imageRow[i] >> 16) & 0xff;
#endif
#endif
}
TIFFWriteScanline(output, row, next_scanline, 0);
@ -149,7 +200,12 @@ void save_as_tiff(T1 & file, T2 const& image)
::operator delete(row);
TIFFClose(output);
#ifdef HAVE_GEOTIFF
GTIFWriteKeys(geotiff);
GTIFFree(geotiff);
#endif
RealTIFFClose(output);
}
}