12 #ifdef OSSIM_ENABLE_MRSID_WRITE 31 #include <lt_fileSpec.h> 32 #include <lt_ioFileStream.h> 33 #include <lti_imageReader.h> 34 #include <lti_pixel.h> 35 #include <lti_scene.h> 36 #include <lti_sceneBuffer.h> 37 #include <lt_fileSpec.h> 38 #include <lti_geoCoord.h> 39 #include <lt_ioFileStream.h> 40 #include <lti_pixelLookupTable.h> 41 #include <lti_utils.h> 42 #include <lti_metadataDatabase.h> 43 #include <lti_metadataRecord.h> 44 #include <lt_utilStatusStrings.h> 45 #include <ogr_spatialref.h> 55 static ossimTrace traceDebug(
"ossimMrSidWriter:debug");
62 static const char OSSIM_ID[] =
"$Id: ossimMrSidWriter.cpp 2645 2011-05-26 15:21:34Z oscar.kramer $";
66 class LTIDLLPixel :
public T
69 LTIDLLPixel(LTIColorSpace colorSpace, lt_uint16 numBands,
70 LTIDataType dataType) : T(colorSpace,numBands,dataType) {}
71 virtual ~LTIDLLPixel() {};
74 ossimMrSidWriter::ossimMrSidWriter()
77 m_makeWorldFile(false)
83 ossimMrSidWriter::~ossimMrSidWriter()
108 if( theInputConnection.valid() &&
114 if(theInputConnection->isMaster())
122 result = writeStream();
128 theInputConnection->slaveProcessTiles();
136 bool ossimMrSidWriter::writeStream()
138 static const char MODULE[] =
"ossimMrSidWriter::writeStream";
143 << MODULE <<
" entered..." << endl;
149 theInputConnection->setTileSize(theAreaOfInterest.width(), 32);
150 theInputConnection->initialize();
152 theInputConnection->setAreaOfInterest(theAreaOfInterest);
153 theInputConnection->setToStartOfSequence();
155 MrSIDDummyImageReader imageReader(theInputConnection);
156 if (!LT_SUCCESS(imageReader.initialize()))
159 << MODULE <<
": Failed to open the input image!" << endl;
162 LTIMetadataDatabase& metadataDatabase =
163 const_cast<LTIMetadataDatabase&
>(imageReader.getMetadata());
164 writeMetaDatabase(metadataDatabase);
166 MG3ImageWriter imageWriter;
167 if (!LT_SUCCESS(imageWriter.initialize(&imageReader)))
173 if (!LT_SUCCESS(imageWriter.setOutputFileSpec(theFilename)))
178 LT_STATUS stat = imageWriter.setEncodingApplication(getShortName(),
"1.0");
180 if ( LT_FAILURE(stat) )
183 <<
"ossimMrSidWriter::writeMetaDatabase ERROR:" 184 <<
"\nMG3ImageWriter.setEncodingApplication() failed. " 185 << getLastStatusString(stat)
193 #ifdef MRSID_DISABLE_CARTRIDGE_CHECK 194 imageWriter.setUsageMeterEnabled(
false);
198 imageWriter.setUsageMeterEnabled(
true);
201 imageWriter.setStripHeight(32);
202 if (!LT_SUCCESS(imageWriter.params().setBlockSize(imageWriter.params().getBlockSize())))
209 imageWriter.setWorldFileSupport(m_makeWorldFile);
214 imageWriter.params().setTargetFilesize(m_fileSize);
217 const LTIScene scene(0, 0, theInputConnection->getAreaOfInterest().width(),
218 theInputConnection->getAreaOfInterest().height(), 1.0);
219 if (!LT_SUCCESS(imageWriter.write(scene)))
222 <<
"ossimMrSidWriter::writeMetaDatabase ERROR:" 223 <<
"\nFailed to write SID file. Is cartridge installed correctly?" 232 const char* prefix)
const 243 bool ossimMrSidWriter::isOpen()
const 245 if (theFilename.size() > 0)
252 bool ossimMrSidWriter::open()
257 if (theFilename.size())
265 <<
"ossimMrSidWriter::open()\n" 266 <<
"File " << theFilename << (result ?
" opened" :
" not opened")
273 void ossimMrSidWriter::close()
277 void ossimMrSidWriter::getImageTypeList(std::vector<ossimString>& imageTypeList)
const 279 imageTypeList.push_back(getShortName());
287 bool ossimMrSidWriter::hasImageType(
const ossimString& imageType)
const 290 if ( (imageType == getShortName()) ||
291 (imageType ==
"image/mrsid") )
302 if(property->
getName() ==
"FILESIZE")
304 m_fileSize =
property->valueToString().toInt32();
307 if(property->
getName() ==
"WORLDFILE")
311 m_makeWorldFile =
true;
326 void ossimMrSidWriter::getPropertyNames(
327 std::vector<ossimString>& propertyNames)
const 332 void ossimMrSidWriter::writeMetaDatabase(LTIMetadataDatabase& metadataDatabase)
336 if (!image_geom.
valid())
339 <<
"ossimMrSidWriter::writeMetaDatabase WARNING:" 340 <<
"\ntheInputConnection->getImageGeometry returned NULL." 349 <<
"ossimMrSidWriter::writeMetaDatabase WARNING:" 350 <<
"\nFailed to create projection!" 359 <<
"ossimMrSidWriter::writeMetaDatabase WARNING:" 360 <<
"\nProjection failed to cast to map projection!" 371 LTIMetadataRecord mrGeoCSType(
"GEOTIFF_NUM::2048::GeographicTypeGeoKey",
372 LTI_METADATA_DATATYPE_SINT32, &epsg_code);
373 metadataDatabase.add(mrGeoCSType);
375 const char* angularUnit = NULL;
378 angularUnit =
"Angular_Degree";
382 angularUnit =
"Angular_Minute";
386 angularUnit =
"Angular_Second";
389 LTIMetadataRecord mrGeogAngularUnitsStr(
"GEOTIFF_CHAR::GeogAngularUnitsGeoKey",
390 LTI_METADATA_DATATYPE_ASCII, &angularUnit);
391 metadataDatabase.add(mrGeogAngularUnitsStr);
395 LTIMetadataRecord mrProjectedCSType(
"GEOTIFF_NUM::3072::ProjectedCSTypeGeoKey",
396 LTI_METADATA_DATATYPE_SINT32, &epsg_code);
397 metadataDatabase.add(mrProjectedCSType);
399 const char* projLinearUnitsStr = NULL;
402 projLinearUnitsStr =
"Linear_Meter";
406 projLinearUnitsStr =
"Linear_Foot";
410 projLinearUnitsStr =
"Linear_Foot_US_Survey";
412 LTIMetadataRecord mrProjLinearUnitsStr(
"GEOTIFF_CHAR::ProjLinearUnitsGeoKey",
413 LTI_METADATA_DATATYPE_ASCII, &projLinearUnitsStr );
414 metadataDatabase.add( mrProjLinearUnitsStr );
417 const char* GTRasterType =
"RasterPixelIsArea";
418 LTIMetadataRecord mrGTRasterType(
"GEOTIFF_CHAR::GTRasterTypeGeoKey",
419 LTI_METADATA_DATATYPE_ASCII, >RasterType );
420 metadataDatabase.add( mrGTRasterType );
425 theInputSource(theInputConnection)
430 MrSIDDummyImageReader::~MrSIDDummyImageReader()
438 LT_STATUS MrSIDDummyImageReader::initialize()
440 if ( !LT_SUCCESS(LTIImageReader::init()) )
441 return LT_STS_Failure;
443 lt_uint16 numBands = (lt_uint16)theInputSource->getNumberOfOutputBands();
444 LTIColorSpace colorSpace = LTI_COLORSPACE_RGB;
448 colorSpace = LTI_COLORSPACE_GRAYSCALE;
451 colorSpace = LTI_COLORSPACE_RGB;
454 colorSpace = LTI_COLORSPACE_MULTISPECTRAL;
463 sampleType = LTI_DATATYPE_UINT16;
466 sampleType = LTI_DATATYPE_SINT16;
469 sampleType = LTI_DATATYPE_UINT32;
472 sampleType = LTI_DATATYPE_SINT32;
475 sampleType = LTI_DATATYPE_FLOAT32;
478 sampleType = LTI_DATATYPE_FLOAT64;
481 sampleType = LTI_DATATYPE_UINT8;
485 ltiPixel =
new LTIDLLPixel<LTIPixel>( colorSpace, numBands, sampleType );
487 if ( !LT_SUCCESS(setPixelProps(*ltiPixel)) )
488 return LT_STS_Failure;
490 if ( !LT_SUCCESS(setDimensions(theInputSource->getAreaOfInterest().width()+1, theInputSource->getAreaOfInterest().height()+1)))
492 return LT_STS_Failure;
496 if (!image_geom.
valid())
498 return LT_STS_Failure;
504 return LT_STS_Failure;
510 return LT_STS_Failure;
515 double perPixelX = 0.0;
516 double perPixelY = 0.0;
519 if(type ==
"ossimLlxyProjection" || type ==
"ossimEquDistCylProjection")
534 LTIGeoCoord geoCoord(ulx + fabs(perPixelX)/2,
535 uly - fabs(perPixelY)/2, perPixelX,perPixelY, 0.0, 0.0, NULL);
540 geoCoord.setWKT(wkt.
c_str());
543 if ( !LT_SUCCESS(setGeoCoord(geoCoord)) )
545 return LT_STS_Failure;
548 setDefaultDynamicRange();
550 return LT_STS_Success;
556 OGRSpatialReference spatialRef;
566 spatialRef.importFromEPSG(code);
568 char* exportString = NULL;
569 spatialRef.exportToWkt(&exportString);
573 wktString = exportString;
581 LT_STATUS MrSIDDummyImageReader::decodeStrip(LTISceneBuffer& stripData,
582 const LTIScene& stripScene)
588 stripData.importDataBSQ(imageData->
getBuf());
590 return LT_STS_Success;
virtual void valueToString(ossimString &valueResult) const =0
ossimUnitType getModelTransformUnitType() const
virtual const ossimDpt & getDecimalDegreesPerPixel() const
Returns decimal degrees per pixel as an ossimDpt with "x" representing longitude and "y" representing...
double lond() const
Will convert the radian measure to degrees.
Represents serializable keyword/value map.
static const ossimErrorCode OSSIM_OK
virtual ossim_uint32 getPcsCode() const
Returns the EPSG PCS code or 32767 if the projection is a custom (non-EPSG) projection.
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
virtual ossimDataObjectStatus getDataObjectStatus() const
Pure virtual base class for image file writers.
double latd() const
Will convert the radian measure to degrees.
virtual void getPropertyNames(std::vector< ossimString > &propertyNames) const
virtual ossimString getShortName() const
virtual ossimString getProjectionName() const
Returns the projection name.
unsigned int ossim_uint32
virtual ossimRefPtr< ossimProperty > getProperty(const ossimString &name) const
virtual const ossimGpt & getUlGpt() const
const ossimProjection * getProjection() const
Access methods for projection (may be NULL pointer).
virtual void setProperty(ossimRefPtr< ossimProperty > property)
virtual const void * getBuf() const
const char * getClassName(int idx)
const char * c_str() const
Returns a pointer to a null-terminated array of characters representing the string's contents...
virtual const ossimDpt & getUlEastingNorthing() const
#define RTTI_DEF1(cls, name, b1)
virtual ossimDpt getMetersPerPixel() const
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
const ossimString & getName() const