OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimElevImageSource.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 // Copyright (C) 2002 ImageLinks Inc.
3 //
4 // License: LGPL
5 //
6 // See LICENSE.txt file in the top level directory for more details.
7 //
8 // Author: David Burken
9 //
10 // Description: Class provides an elevation image source from the elevation
11 // manager.
12 //
13 //*******************************************************************
14 // $Id: ossimElevImageSource.cpp 21631 2012-09-06 18:10:55Z dburken $
15 
20 #include <ossim/base/ossimTrace.h>
23 #include <ctime>
24 
25 RTTI_DEF1(ossimElevImageSource, "ossimElevImageSource", ossimImageSource)
26 
27 // Static trace for debugging
28 static ossimTrace traceDebug("ossimElevImage:debug");
29 
31  :
32  ossimImageSource(NULL,
33  0,
34  0,
35  true,
36  false),// output list is not fixed
37  theElevManager(NULL),
38  theTile(NULL),
39  theTiePoint(),
40  theLatSpacing(0.0),
41  theLonSpacing(0.0),
42  theNumberOfLines(0),
43  theNumberOfSamps(0)
44 {}
45 
47  :
48  ossimImageSource(owner,
49  0,
50  0,
51  true,
52  false),// output list is not fixed
53  theElevManager(NULL),
54  theTile(NULL),
55  theTiePoint(),
56  theLatSpacing(0.0),
57  theLonSpacing(0.0),
58  theNumberOfLines(0),
59  theNumberOfSamps(0)
60 {}
61 
63  const ossimGpt& tie,
64  double latSpacing,
65  double lonSpacing,
66  ossim_uint32 numberLines,
67  ossim_uint32 numberSamples)
68  :
69  ossimImageSource(owner,
70  0,
71  0,
72  true,
73  false),// output list is not fixed
74  theElevManager(NULL),
75  theTile(NULL),
76  theTiePoint(tie),
77  theLatSpacing(latSpacing),
78  theLonSpacing(lonSpacing),
79  theNumberOfLines(numberLines),
80  theNumberOfSamps(numberSamples)
81 {
82  initialize();
83 }
84 
86  const ossimKeywordlist& kwl,
87  const char* prefix)
88  :
89  ossimImageSource(owner,
90  0,
91  0,
92  true,
93  false),
94  theElevManager(NULL),
95  theTile(NULL),
96  theTiePoint(),
97  theLatSpacing(0),
98  theLonSpacing(0),
99  theNumberOfLines(0),
100  theNumberOfSamps(0)
101 {
102  if (loadState(kwl, prefix) == false)
103  {
104  setErrorStatus();
105  }
106 }
107 
109 {
110 }
111 
113  const ossimIrect& tile_rect,
114  ossim_uint32 resLevel)
115 {
116  if (!theTile.get())
117  {
118  return theTile;
119  }
120 
121  // First make sure our tile is the right size.
122  ossim_int32 w = tile_rect.width();
123  ossim_int32 h = tile_rect.height();
124  ossim_int32 tileW = theTile->getWidth();
125  ossim_int32 tileH = theTile->getHeight();
126  if( (w != tileW) || (h != tileH) )
127  {
128  theTile->setWidth(w);
129  theTile->setHeight(h);
130  if((w*h)!=(tileW*tileH))
131  {
132  theTile->initialize();
133 
134  //***
135  // Initialize can reset the min max to defaults if the min happens
136  // to be "0" so reset it just in case.
137  // NOTE: We need to fix initialize!
138  //***
141  }
142  }
143 
144  // Set the origin.
145  theTile->setOrigin(tile_rect.ul());
146 
147 
148  if(!isSourceEnabled())
149  {
150  // This tile source bypassed.
151  theTile->makeBlank();
152  return theTile;
153  }
154 
155  //***
156  // No overview support yet...
157  //***
158  if (resLevel)
159  {
160  // NOTE: Need to add overview support.
161  cerr << "ossimElevImageSource::getTile ERROR:\nOverviews not supported!"
162  << endl;
163  theTile->makeBlank();
164  return theTile;
165  }
166 
167  ossimIrect image_rect = getImageRectangle(0);
168 
169  if ( !tile_rect.intersects(image_rect) )
170  {
171  // No point in the tile falls within the set boundaries of this source.
172  theTile->makeBlank();
173  return theTile;
174  }
175 
176  // Ok fill the tile with the data from the post...
177  ossimIrect clip_rect = tile_rect.clipToRect(image_rect);
178 
179  if ( !tile_rect.completely_within(clip_rect) )
180  {
181  // Start with a blank tile since it won't be filled all the way.
182  theTile->makeBlank();
183  }
184 
185 
186  // Move the buffer pointer to the first valid pixel.
187  ossim_uint32 tile_width = theTile->getWidth();
188 
189  ossim_int32 start_offset = (clip_rect.lr().y - tile_rect.ul().y) * tile_width +
190  clip_rect.ul().x - tile_rect.ul().x;
191 
192  //***
193  // Since most elevation formats have posts organized positive line up,
194  // start at the lower left side of the cell so all reads are going
195  // forward in the file.
196  //***
197  double start_lat = theTiePoint.latd() - theLatSpacing *
198  (clip_rect.lr().y - image_rect.ul().y);
199  if (start_lat < -90.0)
200  {
201  start_lat = -(start_lat + 180.0); // Wrapped around the south poll.
202  }
203 
204  double lon = theTiePoint.lond() + theLonSpacing *
205  (clip_rect.ul().x - image_rect.ul().x);
206  if (lon > 180.0)
207  {
208  lon -= 360.0; // Went across the central meridian.
209  }
210 
211  // Copy the data.
212  ossim_uint32 clipHeight = clip_rect.height();
213  ossim_uint32 clipWidth = clip_rect.width();
214 
215  // Get a pointer to the tile buffer.
216  ossim_float32* buf = static_cast<ossim_float32*>(theTile->getBuf());
217 
218  for (ossim_uint32 sample = 0; sample < clipWidth; ++sample)
219  {
220  double lat = start_lat;
221  ossim_int32 offset = start_offset;
222  for (ossim_uint32 line = 0; line < clipHeight; ++line)
223  {
224  ossimGpt gpt(lat, lon);
225  buf[offset+sample] = theElevManager->getHeightAboveMSL(gpt);
226 
227  lat += theLatSpacing;
228  if (lat > 90) lat = 180.0 - lat;
229 
230  offset -= tile_width;
231  }
232 
233  lon += theLonSpacing;
234  if (lon > 180.0) lon = lon - 360.0; // Went across the central meridian.
235  }
236 
237 #if 0
238  for (ossim_uint32 line = 0; line < clipHeight; ++line)
239  {
240  double lon = start_lon;
241  for (ossim_uint32 sample = 0; sample < clipWidth; ++sample)
242  {
243  ossimGpt gpt(lat, lon);
244  buf[sample] = theElevManager->getHeightAboveMSL(gpt);
245  lon += theLonSpacing;
246  if (start_lon > 180.0)
247  {
248  start_lon -= 360.0; // Went across the central meridian.
249  }
250  }
251 
252  buf += tile_width;
253  lat -= theLatSpacing;
254  if (lat < -90.0) lat = -(lat + 180.0);// Wrapped around the south poll.
255  }
256 #endif
257 
258  theTile->validate();
259  return theTile;
260 }
261 
263  const char* prefix) const
264 {
265  static const char MODULE[] = "ossimElevImageSource::saveState";
266 
268  {
269  cerr << MODULE
270  << " ERROR detected in keyword list! State not saved."
271  << endl;
272  return false;
273  }
274 
275  // Save the state of the base class.
276  ossimImageSource::saveState(kwl, prefix);
277 
278  // Save the tie point.
279  kwl.add(prefix,
281  theTiePoint.latd(),
282  true);
283  kwl.add(prefix,
285  theTiePoint.lond(),
286  true);
287 
288  // Save the post spacing.
289  kwl.add(prefix,
292  true);
293  kwl.add(prefix,
296  true);
297 
298  // Save the image size
299  kwl.add(prefix,
302  true);
303  kwl.add(prefix,
306  true);
307 
308  // Save the min / max pixel values.
309  kwl.add(prefix,
311  getMinPixelValue(0),
312  true);
313  kwl.add(prefix,
315  getMaxPixelValue(0),
316  true);
317 
318  return true;
319 }
320 
321 //*******************************************************************
322 // Public method:
323 //*******************************************************************
325  const char* prefix)
326 {
327  static const char MODULE[] = "ossimElevImageSource::loadState";
328 
330  {
331  cerr << MODULE
332  << " ERROR detected in keyword list! State not load."
333  << endl;
334  return false;
335  }
336 
337  // Base class...
338  ossimImageSource::loadState(kwl, prefix);
339 
340  const char* lookup;
341 
342  // Get the tie point.
343  lookup = kwl.find(prefix, ossimKeywordNames::TIE_POINT_LAT_KW);
344  if (lookup)
345  {
346  theTiePoint.latd(ossimString(lookup).toDouble());
347  }
348  else
349  {
350  if (traceDebug())
351  {
352  CLOG << "DEBUG:"
353  << "\nRequired keyword not found: "
355  << "\nReturning false"
356  << endl;
357  }
358 
359  return false;
360  }
361 
362  lookup = kwl.find(prefix, ossimKeywordNames::TIE_POINT_LON_KW);
363  if (lookup)
364  {
365  theTiePoint.lond(ossimString(lookup).toDouble());
366  }
367  else
368  {
369  if (traceDebug())
370  {
371  CLOG << "DEBUG:"
372  << "\nRequired keyword not found: "
374  << "\nReturning false"
375  << endl;
376  }
377 
378  return false;
379  }
380 
381  // Get the post spacing.
383  if (lookup)
384  {
385  theLatSpacing = ossimString(lookup).toDouble();
386  }
387  else
388  {
389  if (traceDebug())
390  {
391  CLOG << "DEBUG:"
392  << "\nRequired keyword not found: "
394  << "\nReturning false"
395  << endl;
396  }
397 
398  return false;
399  }
400 
402  if (lookup)
403  {
404  theLonSpacing = ossimString(lookup).toDouble();
405  }
406  else
407  {
408  if (traceDebug())
409  {
410  CLOG << "DEBUG:"
411  << "\nRequired keyword not found: "
413  << "\nReturning false"
414  << endl;
415  }
416 
417  return false;
418  }
419 
420  // Get the image size.
421  lookup = kwl.find(prefix, ossimKeywordNames::NUMBER_LINES_KW);
422  if (lookup)
423  {
425  }
426  else
427  {
428  if (traceDebug())
429  {
430  CLOG << "DEBUG:"
431  << "\nRequired keyword not found: "
433  << "\nReturning false"
434  << endl;
435  }
436 
437  return false;
438  }
439 
440  lookup = kwl.find(prefix, ossimKeywordNames::NUMBER_SAMPLES_KW);
441  if (lookup)
442  {
444  }
445  else
446  {
447  if (traceDebug())
448  {
449  CLOG << "DEBUG:"
450  << "\nRequired keyword not found: "
452  << "\nReturning false"
453  << endl;
454  }
455 
456  return false;
457  }
458 
459  initialize();
460 
461  //***
462  // See if the min / max keyword was set and reset it.
463  // Note this must be done after initialize since it sets the min / max from
464  // the elevation manager.
465  //***
466  lookup = kwl.find(prefix, ossimKeywordNames::MIN_VALUE_KW);
467  if (lookup)
468  {
469  setMinPixelValue(ossimString(lookup).toDouble());
470  }
471  lookup = kwl.find(prefix, ossimKeywordNames::MAX_VALUE_KW);
472  if (lookup)
473  {
474  setMaxPixelValue(ossimString(lookup).toDouble());
475  }
476 
478  {
479  return false;
480  }
481 
482  //***
483  // Reset the base class to have a fixed input list of "0" size.
484  // Note: To not do this will result in a core dump destroying objects
485  // connected to this output.
486  //***
487  theInputObjectList.clear();
489  theOutputListIsFixedFlag = false;
490 
491  return true;
492 }
493 
495 {
496  static const char MODULE[] = "ossimElevImageSource::initialize";
497 
498  if (traceDebug()) CLOG << " Entered..." << endl;
499 
500  //***
501  // First see if the manager pointer has been captured.
502  //***
504 
505  if (!theElevManager)
506  {
507  setErrorStatus();
508  cerr << MODULE << "ERROR:\nNULL elevation manager pointer!"
509  << "\nObject not initialized!" << endl;
510  return;
511  }
512 
513  // Basic sanity checks.
514  if (!theLatSpacing || !theLonSpacing ||
516  {
517  setErrorStatus();
518  cerr << MODULE << "ERROR:"
519  << "\nMust set latitude/longitude spacing and number of line and"
520  << " samples."
521  << "Object not initialized!" << endl;
522  return;
523 
524  }
525 
526  // Check the ground point.
527  if ( theTiePoint.latd() > 90.0 || theTiePoint.latd() < -90.0 ||
528  theTiePoint.lond() > 180.0 || theTiePoint.lond() < -180.0 )
529  {
530  setErrorStatus();
531  cerr << MODULE << "ERROR:\nBogus tie point."
532  << "\nObject not initialized!" << endl;
533  return;
534  }
535 
536  if (traceDebug())
537  {
538  CLOG << "DEBUG:"
539  << "\nTie point: " << theTiePoint
540  << "\nLatitude spacing: " << theLatSpacing
541  << "\nLongitude spacing: " << theLonSpacing
542  << "\nLines: " << theNumberOfLines
543  << "\nSamples: " << theNumberOfSamps
544  << endl;
545  }
546 
547  //***
548  // Since this will return float data we need to set the min / max values
549  // of the data so that anybody who remaps it to eight bit will do it
550  // properly. So scan the entire image rectangle using the manager.
551  // This will do two things, force the elevation manager to load all the
552  // cells, and at the same time the min / max elevation value will be set.
553  // NOTE:
554  // ??? Should the elevation manager clear the list of sources prior to
555  // the code segment so that the min / max is only from the cells we
556  // need!
557  //***
558 
559  cout << "Initializing elevation manager..." << endl;
560 
561 #if 0
562  // Loop in the longitude or sample direction.
563  time_t start_t = time(NULL);
564  double lon = theTiePoint.lond();
565  for (ossim_uint32 samp = 0; samp < theNumberOfSamps; ++samp)
566  {
567  double lat = theTiePoint.latd() - theLatSpacing * (theNumberOfLines - 1);
568  if (lat < -90.0) lat = -(lat + 180.0); // Wrapped around the south poll.
569 
570  for (ossim_uint32 line = 0; line < theNumberOfLines; ++line)
571  {
572  ossimGpt gpt(lat, lon);
574 
575  lat += theLatSpacing;
576  if (lat > 90) lat = 180 - lat; // Went across poll.
577  }
578 
579  lon += theLonSpacing;
580  if (lon > 180.0) lon -= 360.0; // Went across the central meridian.
581  }
582  time_t stop_t = time(NULL);
583  cout << "Finished loop two..." << endl;
584  cout << "Elapsed time for loop two: " << (stop_t - start_t) << endl;
585 #endif
586 
587  theTile = new ossimImageData(this,
588  OSSIM_FLOAT);
589  theTile->initialize();
590 
591  // Set the min / max for any normalization down the chain...
594 
595  if (traceDebug())
596  {
597  CLOG << "DEBUG:"
598  << "\nMin pix: " << theTile->getMinPix(0)
599  << "\nMax pix: " << theTile->getMaxPix(0)
600  << endl;
601  }
602 }
603 
605 {
606  ossimIrect result(0, 0, theNumberOfSamps-1, theNumberOfLines-1);
607 
608  if (reduced_res_level != 0)
609  {
610  cerr << "ossimElevImageSource::getImageRectangle ERROR:"
611  << "\nOnly R0 is supported." << endl;
612  }
613 
614  return result;
615 }
616 
618  const char* prefix)
619 {
620  // Save off the image dimensions.
621  kwl.add(prefix,
624  true);
625  kwl.add(prefix,
628  true);
629 
630  // Save off the projection info (tie and post spacing).
632  return proj.saveState(kwl, prefix);
633 }
634 
636 {
637  if (resLevel)
638  {
639  cerr << "ossimElevImageSource::getDecimationFactor ERROR:"
640  << "\nReduced res sets currently not supported!"
641  << endl;
642  }
643 
644  result.line = 1.0;
645  result.samp = 1.0;
646 }
647 
648 void ossimElevImageSource::getDecimationFactors(vector<ossimDpt>& decimations) const
649 {
650  ossimDpt pt(1.0, 1.0);
651  decimations.clear();
652  decimations.push_back(pt);
653 }
654 
656 {
657  return 1;
658 }
659 
661 {
662  return 1;
663 }
664 
666 {
667  return OSSIM_FLOAT;
668 }
669 
671 {
672  if (theTile.get()) return theTile->getWidth();
673 
674  return 0;
675 }
676 
678 {
679  if (theTile.get()) return theTile->getHeight();
680 
681  return 0;
682 }
683 
685 {
686  if (traceDebug())
687  {
688  cout << "ossimElevImageSource::changeTileSize DEBUG:"
689  << "\nx size: " << size.x
690  << "\ny size: " << size.y
691  << endl;
692  }
693 
694  if (!theTile)
695  {
696  cerr << "ossimElevImageSource::changeTileSize ERROR:"
697  << "\nObject not initialized! Returning..." << endl;
698  return;
699  }
700 
701  theTile = new ossimImageData(this,
702  OSSIM_FLOAT,
703  1,
704  size.x,
705  size.y);
706  theTile->initialize();
707 
708  // Set the min / max for any normalization down the chain...
711 }
712 
714 {
715  if (reduced_res_level)
716  {
717  cerr << "ossimElevImageSource::getNumberOfLines ERROR:"
718  << "\nReduced res sets currently not supported!"
719  << endl;
720  return 0;
721  }
722 
723  return theNumberOfLines;
724 }
725 
727 {
728  if (reduced_res_level)
729  {
730  cerr << "ossimElevImageSource::getNumberOfSamples ERROR:"
731  << "\nReduced res sets currently not supported!"
732  << endl;
733  return 0;
734  }
735 
736  return theNumberOfSamps;
737 }
738 
740 {
741  if (band)
742  {
743  cerr << "ossimElevImageSource::getMinPixelValue ERROR:"
744  << "\nReduced res sets currently not supported!"
745  << endl;
746  return 0.0;
747  }
748 
749  if (theTile.get())
750  {
751  return theTile->getMinPix(0);
752  }
753  else if (theElevManager)
754  {
756  }
757 
758  return 0.0;
759 }
760 
762 {
763  if (band)
764  {
765  cerr << "ossimElevImageSource::getMaxPixelValue ERROR:"
766  << "\nReduced res sets currently not supported!"
767  << endl;
768  return 0.0;
769  }
770 
771  if (theTile.get())
772  {
773  return theTile->getMaxPix(0);
774  }
775  else if (theElevManager)
776  {
778  }
779 
780  return 0.0;
781 }
782 
784 {
785  if (theTile.get())
786  {
787  theTile->setMinPix(min_pix, 0);
788  if (traceDebug())
789  {
790  cout << "ossimElevImageSource::setMinPixelValue DEBUG:"
791  << "\nMin pixel value: " << min_pix
792  << endl;
793  }
794  }
795  else
796  {
797  cerr << "ossimElevImageSource::setMinPixelValue ERROR:"
798  << "\nObject not initialized!"
799  << endl;
800  }
801 }
802 
804 {
805  if (theTile.get())
806  {
807  theTile->setMaxPix(max_pix, 0);
808  if (traceDebug())
809  {
810  cout << "ossimElevImageSource::setMaxPixelValue DEBUG:"
811  << "\nMax pixel value: " << max_pix
812  << endl;
813  }
814  }
815  else
816  {
817  cerr << "ossimElevImageSource::setMinPixelValue ERROR:"
818  << "\nObject not initialized!"
819  << endl;
820  }
821 }
virtual ossim_uint32 getWidth() const
virtual bool isSourceEnabled() const
Definition: ossimSource.cpp:79
static const char * MIN_VALUE_KW
virtual double getHeightAboveMSL(const ossimGpt &)=0
Height access methods:
static const char * DECIMAL_DEGREES_PER_PIXEL_LAT
virtual const ossim_float64 * getMaxPix() const
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
#define CLOG
Definition: ossimTrace.h:23
virtual double getMinPixelValue(ossim_uint32 band=0) const
Returns the min pixel of the band.
ossimRefPtr< ossimImageData > theTile
double lond() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:97
Represents serializable keyword/value map.
virtual void changeTileSize(const ossimIpt &size)
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
static const ossimErrorCode OSSIM_OK
virtual ossim_uint32 getNumberOfInputBands() const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of an object from a keyword list.
const char * find(const char *key) const
double samp
Definition: ossimDpt.h:164
float ossim_float32
virtual ossim_uint32 getTileHeight() const
Returns the default processing tile height.
static const char * MAX_VALUE_KW
ossim_uint32 height() const
Definition: ossimIrect.h:487
static const char * NUMBER_LINES_KW
static const char * TIE_POINT_LON_KW
const ossimIpt & ul() const
Definition: ossimIrect.h:274
virtual ossim_uint32 getHeight() const
static const ossimErrorCode OSSIM_ERROR
static ossimElevManager * instance()
METHOD: instance() Implements singelton pattern.
virtual ossimIrect getImageRectangle(ossim_uint32 reduced_res_level=0) const
bool intersects(const ossimIrect &rect) const
Definition: ossimIrect.cpp:183
virtual void getDecimationFactors(vector< ossimDpt > &decimations) const
double latd() const
Will convert the radian measure to degrees.
Definition: ossimGpt.h:87
virtual void initialize()
Initialize the data buffer.
bool completely_within(const ossimIrect &rect) const
Definition: ossimIrect.cpp:425
double ossim_float64
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
virtual void setHeight(ossim_uint32 height)
double line
Definition: ossimDpt.h:165
virtual ossimRefPtr< ossimImageData > getTile(const ossimIrect &rect, ossim_uint32 resLevel=0)
virtual ossim_uint32 getNumberOfLines(ossim_uint32 reduced_res_level=0) const
yy_size_t size
virtual ossimDataObjectStatus validate() const
ossimElevSource * theElevManager
unsigned int ossim_uint32
double toDouble() const
virtual double getMaxPixelValue(ossim_uint32 band=0) const
Returns the max pixel of the band.
unsigned long toULong() const
virtual void setWidth(ossim_uint32 width)
static const char * DECIMAL_DEGREES_PER_PIXEL_LON
const ossimIpt & lr() const
Definition: ossimIrect.h:276
ossim_uint32 width() const
Definition: ossimIrect.h:500
ossimIrect clipToRect(const ossimIrect &rect) const
Definition: ossimIrect.cpp:501
virtual ossimRefPtr< ossimImageGeometry > getImageGeometry()
Returns the image geometry object associated with this tile source or NULL if not defined...
ossimScalarType
virtual double getMinHeightAboveMSL() const
Access methods for the bounding elevations:
virtual void setOrigin(const ossimIpt &origin)
virtual const ossim_float64 * getMinPix() const
virtual void makeBlank()
Initializes data to null pixel values.
virtual ossim_uint32 getTileWidth() const
Returns the default processing tile width.
ConnectableObjectList theInputObjectList
Holds a list of input objects.
virtual void setMaxPixelValue(ossim_float64 max_pix)
virtual void setMaxPix(ossim_float64 max_pix)
virtual ossimErrorCode getErrorStatus() const
virtual double getMaxHeightAboveMSL() const
ossim_int32 y
Definition: ossimIpt.h:142
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save the state of an object to a keyword list.
virtual const void * getBuf() const
bool theInputListIsFixedFlag
Indicates whether the theInputObjectList is fixed.
ossim_int32 x
Definition: ossimIpt.h:141
static const char * TIE_POINT_LAT_KW
virtual void getDecimationFactor(ossim_uint32 resLevel, ossimDpt &result) const
#define RTTI_DEF1(cls, name, b1)
Definition: ossimRtti.h:485
virtual ossim_uint32 getNumberOfSamples(ossim_uint32 reduced_res_level=0) const
bool theOutputListIsFixedFlag
Indicates whether the theOutputObjectList is fixed.
virtual ossim_uint32 getNumberOfDecimationLevels() const
Will return the number of resolution levels.
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
32 bit floating point
virtual void setMinPix(ossim_float64 min_pix)
virtual void setMinPixelValue(ossim_float64 min_pix)
static const char * NUMBER_SAMPLES_KW
virtual ossimScalarType getOutputScalarType() const
This will be used to query the output pixel type of the tile source.
int ossim_int32