- initial implementation of the geotiff output by using libgeotiff, not complete (issue #967)
This commit is contained in:
parent
68356d5d4e
commit
784ec6f22e
1 changed files with 71 additions and 15 deletions
|
@ -29,7 +29,16 @@
|
||||||
|
|
||||||
extern "C"
|
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 {
|
namespace mapnik {
|
||||||
|
@ -103,7 +112,7 @@ void save_as_tiff(T1 & file, T2 const& image)
|
||||||
const int height = image.height();
|
const int height = image.height();
|
||||||
const int scanline_size = sizeof(unsigned char) * width * 3;
|
const int scanline_size = sizeof(unsigned char) * width * 3;
|
||||||
|
|
||||||
TIFF* output = TIFFClientOpen("mapnik_tiff_stream",
|
TIFF* output = RealTIFFOpen("mapnik_tiff_stream",
|
||||||
"w",
|
"w",
|
||||||
(thandle_t)&file,
|
(thandle_t)&file,
|
||||||
tiff_dummy_read_proc,
|
tiff_dummy_read_proc,
|
||||||
|
@ -113,6 +122,10 @@ void save_as_tiff(T1 & file, T2 const& image)
|
||||||
tiff_size_proc,
|
tiff_size_proc,
|
||||||
tiff_dummy_map_proc,
|
tiff_dummy_map_proc,
|
||||||
tiff_dummy_unmap_proc);
|
tiff_dummy_unmap_proc);
|
||||||
|
if (! output)
|
||||||
|
{
|
||||||
|
// throw ?
|
||||||
|
}
|
||||||
|
|
||||||
TIFFSetField(output, TIFFTAG_IMAGEWIDTH, width);
|
TIFFSetField(output, TIFFTAG_IMAGEWIDTH, width);
|
||||||
TIFFSetField(output, TIFFTAG_IMAGELENGTH, height);
|
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_SAMPLESPERPIXEL, 3);
|
||||||
TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, 1);
|
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;
|
int next_scanline = 0;
|
||||||
unsigned char* row = reinterpret_cast<unsigned char*>(::operator new(scanline_size));
|
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)
|
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] >> 24) & 0xff;
|
||||||
row[index++] = (imageRow[i] >> 16) & 0xff;
|
row[index++] = (imageRow[i] >> 16) & 0xff;
|
||||||
row[index++] = (imageRow[i] >> 8) & 0xff;
|
row[index++] = (imageRow[i] >> 8) & 0xff;
|
||||||
#else
|
#else
|
||||||
row[index++] = (imageRow[i]) & 0xff;
|
row[index++] = (imageRow[i]) & 0xff;
|
||||||
row[index++] = (imageRow[i] >> 8) & 0xff;
|
row[index++] = (imageRow[i] >> 8) & 0xff;
|
||||||
row[index++] = (imageRow[i] >> 16) & 0xff;
|
row[index++] = (imageRow[i] >> 16) & 0xff;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TIFFWriteScanline(output, row, next_scanline, 0);
|
TIFFWriteScanline(output, row, next_scanline, 0);
|
||||||
|
@ -149,7 +200,12 @@ void save_as_tiff(T1 & file, T2 const& image)
|
||||||
|
|
||||||
::operator delete(row);
|
::operator delete(row);
|
||||||
|
|
||||||
TIFFClose(output);
|
#ifdef HAVE_GEOTIFF
|
||||||
|
GTIFWriteKeys(geotiff);
|
||||||
|
GTIFFree(geotiff);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
RealTIFFClose(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue