OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimNitfMapModel.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 //
3 // License: See top level LICENSE.txt file.
4 //
5 // AUTHOR: Doug Shibla (dshibla@imagelinks.com)
6 //
7 // DESCRIPTION:
8 //
9 // LIMITATIONS:
10 //
11 //*****************************************************************************
12 
13 #include <cstdio>
14 #include <cstdlib>
18 #include <ossim/base/ossimTrace.h>
19 
20 RTTI_DEF1(ossimNitfMapModel, "ossimNitfMapModel", ossimSensorModel);
21 
22 //***
23 // Define Trace flags for use within this file:
24 //***
25 static ossimTrace traceExec ("ossimNitfMapModel:exec");
26 static ossimTrace traceDebug ("ossimNitfMapModel:debug");
27 
28 static const char* PIAIMC_TAG = "PIAIMC";
29 static const char* USE26A_TAG = "USE26A";
30 static const char* USE00A_TAG = "USE00A";
31 static const char* IMAGE_ID_KW = "image_id";
32 
33 //*****************************************************************************
34 // DEFAULT CONSTRUCTOR: ossimNitfMapModel()
35 //
36 //*****************************************************************************
39 {
40  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::ossimNitfMapModel: entering..." << std::endl;
41 
42  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::ossimNitfMapModel: returning..." << std::endl;
43 }
44 
45 //*****************************************************************************
46 // CONSTRUCTOR: ossimNitfMapModel(filename)
47 //
48 // Constructs model from a filename. The file can be either a FF header file
49 // or a KWL file.
50 //
51 //*****************************************************************************
53 {
54  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::ossimNitfMapModel(init_file): entering..." << std::endl;
55 
56  //***
57  // Open the NITF file:
58  //***
59  FILE* fptr = fopen (init_file.chars(), "r");
60  if (!fptr)
61  {
62  if(traceDebug())
63  {
64  ossimNotify(ossimNotifyLevel_FATAL) << "FATAL ossimNitfMapModel::ossimNitfMapModel(init_file): Could not open NITF file at: <" << init_file << ">."
65  << " Aborting with error..." << std::endl;
66  }
67  theErrorStatus = 1;
68  return;
69  }
70 
71  //***
72  // Read a sufficient number of bytes to include USE tag:
73  //***
74  char* header = new char [6000];
75  fread(header, 6000, 1, fptr);
76  fclose(fptr);
77  fptr = 0;
78  //***
79  // Validate correct NITF version:
80  //***
81  if (strncmp(header, "NITF02.00", 9))
82  {
83  if (traceDebug())
84  {
85  ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::ossimNitfMapModel(init_file):"
86  << "\n\tFailed attempt to open <" << init_file
87  << "> as NITF2.00."<<endl;
88  }
89  theErrorStatus = 1;
90  delete [] header;
91  return;
92  }
93 
94  //***
95  // Fetch Image ID:
96  //***
97  char charbuf[80];
98  strncpy(charbuf, &header[447], 28);
99  charbuf[28] = '\0';
100  theImageID = charbuf;
101 
102  //***
103  // Fetch Image Size:
104  //***
105  strncpy(charbuf, &header[737], 8);
106  charbuf[8] = '\0';
107  theImageSize.line = atoi(charbuf);
108  strncpy(charbuf, &header[745], 8);
109  charbuf[8] = '\0';
110  theImageSize.samp = atoi(charbuf);
111 
112 
113  // Fetch Image Size:
114  ossimString coord;
115  strncpy(charbuf, &header[775], 1);
116  charbuf[1] = '\0';
117  coord = charbuf;
118  if (coord == "G")
119  {
120  double degreeLat;
121  double degreeLon;
122  double minute;
123  double second;
124  ossimString hemis;
125 
126  strncpy(charbuf, &header[780], 2);
127  charbuf[2] = '\0';
128  second = atof(charbuf);
129  second = second / 60;
130  strncpy(charbuf, &header[778], 2);
131  charbuf[2] = '\0';
132  minute = atof(charbuf);
133  minute = (minute + second) / 60;
134  strncpy(charbuf, &header[776], 2);
135  charbuf[2] = '\0';
136  degreeLat = atof(charbuf);
137  degreeLat = degreeLat + minute;
138  strncpy(charbuf, &header[782], 1);
139  charbuf[1] = '\0';
140  hemis = charbuf;
141  if (hemis == "S")
142  degreeLat = 0 - degreeLat;
143  strncpy(charbuf, &header[788], 2);
144  charbuf[2] = '\0';
145  second = atof(charbuf);
146  second = second / 60;
147  strncpy(charbuf, &header[786], 2);
148  charbuf[2] = '\0';
149  minute = atof(charbuf);
150  minute = (minute + second) / 60;
151  strncpy(charbuf, &header[783], 3);
152  charbuf[3] = '\0';
153  degreeLon = atof(charbuf);
154  degreeLon = degreeLon + minute;
155  strncpy(charbuf, &header[790], 1);
156  charbuf[1] = '\0';
157  hemis = charbuf;
158  if (hemis == "W")
159  degreeLon = 0 - degreeLon;
160  ossimDpt ip0 (degreeLon, degreeLat);
161  strncpy(charbuf, &header[795], 2);
162  charbuf[2] = '\0';
163  second = atof(charbuf);
164  second = second / 60;
165  strncpy(charbuf, &header[793], 2);
166  charbuf[2] = '\0';
167  minute = atof(charbuf);
168  minute = (minute + second) / 60;
169  strncpy(charbuf, &header[791], 2);
170  charbuf[2] = '\0';
171  degreeLat = atof(charbuf);
172  degreeLat = degreeLat + minute;
173  strncpy(charbuf, &header[797], 1);
174  charbuf[1] = '\0';
175  hemis = charbuf;
176  if (hemis == "S")
177  degreeLat = 0 - degreeLat;
178  strncpy(charbuf, &header[803], 2);
179  charbuf[2] = '\0';
180  second = atof(charbuf);
181  second = second / 60;
182  strncpy(charbuf, &header[801], 2);
183  charbuf[2] = '\0';
184  minute = atof(charbuf);
185  minute = (minute + second) / 60;
186  strncpy(charbuf, &header[798], 3);
187  charbuf[3] = '\0';
188  degreeLon = atof(charbuf);
189  degreeLon = degreeLon + minute;
190  strncpy(charbuf, &header[805], 1);
191  charbuf[1] = '\0';
192  hemis = charbuf;
193  if (hemis == "W")
194  degreeLon = 0 - degreeLon;
195  ossimDpt ip1 (degreeLon, degreeLat);
196  strncpy(charbuf, &header[810], 2);
197  charbuf[2] = '\0';
198  second = atof(charbuf);
199  second = second / 60;
200  strncpy(charbuf, &header[808], 2);
201  charbuf[2] = '\0';
202  minute = atof(charbuf);
203  minute = (minute + second) / 60;
204  strncpy(charbuf, &header[806], 2);
205  charbuf[2] = '\0';
206  degreeLat = atof(charbuf);
207  degreeLat = degreeLat + minute;
208  strncpy(charbuf, &header[812], 1);
209  charbuf[1] = '\0';
210  hemis = charbuf;
211  if (hemis == "S")
212  degreeLat = 0 - degreeLat;
213  strncpy(charbuf, &header[818], 2);
214  charbuf[2] = '\0';
215  second = atof(charbuf);
216  second = second / 60;
217  strncpy(charbuf, &header[816], 2);
218  charbuf[2] = '\0';
219  minute = atof(charbuf);
220  minute = (minute + second) / 60;
221  strncpy(charbuf, &header[813], 3);
222  charbuf[3] = '\0';
223  degreeLon = atof(charbuf);
224  degreeLon = degreeLon + minute;
225  strncpy(charbuf, &header[820], 1);
226  charbuf[1] = '\0';
227  hemis = charbuf;
228  if (hemis == "W")
229  degreeLon = 0 - degreeLon;
230  ossimDpt ip2 (degreeLon, degreeLat);
231  strncpy(charbuf, &header[825], 2);
232  charbuf[2] = '\0';
233  second = atof(charbuf);
234  second = second / 60;
235  strncpy(charbuf, &header[823], 2);
236  charbuf[2] = '\0';
237  minute = atof(charbuf);
238  minute = (minute + second) / 60;
239  strncpy(charbuf, &header[821], 2);
240  charbuf[2] = '\0';
241  degreeLat = atof(charbuf);
242  degreeLat = degreeLat + minute;
243  strncpy(charbuf, &header[827], 1);
244  charbuf[1] = '\0';
245  hemis = charbuf;
246  if (hemis == "S")
247  degreeLat = 0 - degreeLat;
248  strncpy(charbuf, &header[833], 2);
249  charbuf[2] = '\0';
250  second = atof(charbuf);
251  second = second / 60;
252  strncpy(charbuf, &header[831], 2);
253  charbuf[2] = '\0';
254  minute = atof(charbuf);
255  minute = (minute + second) / 60;
256  strncpy(charbuf, &header[828], 3);
257  charbuf[3] = '\0';
258  degreeLon = atof(charbuf);
259  degreeLon = degreeLon + minute;
260  strncpy(charbuf, &header[835], 1);
261  charbuf[1] = '\0';
262  hemis = charbuf;
263  if (hemis == "W")
264  degreeLon = 0 - degreeLon;
265  ossimDpt ip3 (degreeLon, degreeLat);
266 
268  = ossimPolygon (ip0, ip1, ip2, ip3);
269  }
270  else
271  {
272  if(traceDebug())
273  {
274  ossimNotify(ossimNotifyLevel_WARN) << "WARNING ossimNitfMapModel::ossimNitfMapModel(init_file): Could not find the corner coordinates!! "
275  << " Aborting with error..." << std::endl;
276  }
277  theErrorStatus = 1;
278  delete [] header;
279  return;
280  }
281 
282 
283  // Search for the PIAIMC Tag to fetch GSD:
284  const char* tag_ptr = strstr(header, PIAIMC_TAG);
285  if (tag_ptr)
286  {
287  //***
288  // Parse the tag for GSD (in inches):
289  //***
290  strncpy(charbuf, &tag_ptr[348], 7);
291  charbuf[7] = '\0';
292  theGSD.line = atof(charbuf)/12.0 * MTRS_PER_FT;
294  }
295  else
296  {
297  if(traceDebug())
298  {
299  ossimNotify(ossimNotifyLevel_WARN) << "WARNING ossimNitfMapModel::ossimNitfMapModel(init_file): Could not find the <" << PIAIMC_TAG
300  << "> tag in the NITF file at: <" << init_file << "> to extract GSD."
301  << " Searching for alternate <" << USE26A_TAG << ">... "<< std::endl;
302  }
303 
304 
305  //***
306  // Search USE26A tag:
307  //***
308  const char* tag_ptr = strstr(header, USE26A_TAG);
309  if (tag_ptr)
310  {
311  //***
312  // Parse the tag for GSD (in inches):
313  //***
314  strncpy(charbuf, &tag_ptr[15], 5);
315  charbuf[6] = '\0';
316  theGSD.line = atof(charbuf)/12.0 * MTRS_PER_FT;
318  }
319  else
320  {
321  if(traceDebug())
322  {
323  ossimNotify(ossimNotifyLevel_WARN) << "WARNING ossimNitfMapModel::ossimNitfMapModel(init_file): Could not find the <" << USE26A_TAG
324  << "> tag in the NITF file at: <" << init_file << "> to extract GSD."
325  << " Searching for alternate <" << USE00A_TAG << ">... "<< std::endl;
326  }
327 
328  //***
329  // Search USE00A tag:
330  //***
331  const char* tag_ptr = strstr(header, USE00A_TAG);
332  if (!tag_ptr)
333  {
334  if(traceDebug())
335  {
336  ossimNotify(ossimNotifyLevel_DEBUG) << "WARNING ossimNitfMapModel::ossimNitfMapModel(init_file): Could not find the <" << USE00A_TAG
337  << "> tag in the NITF file at: <"
338  << init_file << ">." << " Aborting with error..." << std::endl;
339  }
340  theErrorStatus = 1;
341  delete [] header;
342  return;
343  }
344 
345  //***
346  // Parse the tag for GSD (in inches):
347  //***
348  strncpy(charbuf, &tag_ptr[15], 5);
349  charbuf[6] = '\0';
350  theGSD.line = atof(charbuf)/12.0 * MTRS_PER_FT;
352  }
353  }
354 
355  ossimString drivePart;
356  ossimString pathPart;
357  ossimString filePart;
358  ossimString extPart;
359  init_file.split(drivePart,
360  pathPart,
361  filePart,
362  extPart);
363  //***
364  // Save current state:
365  //***
366  ossimFilename geom_filename;
367  geom_filename.merge(drivePart,
368  pathPart,
369  filePart,
370  "geom");
371  ossimKeywordlist geom_kwl;
372  saveState(geom_kwl);
373  geom_kwl.write(geom_filename.chars());
374 
375  delete [] header;
376 
377  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::ossimNitfMapModel: Exited..." << std::endl;
378 }
379 
380 
381 
382 //*****************************************************************************
383 // CONSTRUCTOR: ossimNitfMapModel(kwl)
384 //
385 // Constructs model from keywordlist geometry file
386 //
387 //*****************************************************************************
389  : ossimSensorModel()
390 {
391  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::ossimNitfMapModel(geom_file): entering..." << std::endl;
392 
393  //***
394  // Parse keywordlist for geometry:
395  //***
396  loadState(geom_kwl);
397 
398  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::ossimNitfMapModel(geom_file): Exited..." << std::endl;
399 }
400 
401 //*****************************************************************************
402 // DESTRUCTOR: ~ossimNitfMapModel()
403 //
404 //*****************************************************************************
406 {
407  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::~ossimNitfMapModel: entering..." << std::endl;
408  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::~ossimNitfMapModel: returning..." << std::endl;
409 }
410 
411 //*****************************************************************************
412 // METHOD: ossimNitfMapModel::lineSampleHeightToWorld()
413 //
414 // Performs reverse projection of image line/sample to ground point.
415 // The imaging ray is intersected with a level plane at height above ellipsoid.
416 //
417 //*****************************************************************************
419  const double& /* height */,
420  ossimGpt& /* gpt */) const
421 {
422  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::lineSampleHeightToWorld: entering..." << std::endl;
423 
424  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::lineSampleHeightToWorld: exiting..." << std::endl;
425 }
426 
427 //*****************************************************************************
428 // METHOD: ossimNitfMapModel::print()
429 //
430 // Formatted dump of data members.
431 //
432 //*****************************************************************************
434 {
435  out << "\nDump of ossimNitfMapModel object at " << hex << this << ":"
436  << endl;
437 
438  return ossimSensorModel::print(out);
439 }
440 
441 //*****************************************************************************
442 // METHOD: ossimNitfMapModel::saveState()
443 //
444 // Saves the model state to the KWL. This KWL also serves as a geometry file.
445 //
446 //*****************************************************************************
448  const char* prefix) const
449 {
450  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::saveState: entering..." << std::endl;
451 
452 
453  // Hand off to base class for common stuff:
454  ossimSensorModel::saveState(kwl, prefix);
455 
456  kwl.add(prefix,
457  IMAGE_ID_KW,
458  theImageID.chars());
459 
460  kwl.add(prefix,
463  true);
464 
465  kwl.add(prefix,
468  true);
469 
470  kwl.add(prefix,
472  theGSD.line,
473  true);
474 
475  kwl.add(prefix,
477  theGSD.samp,
478  true);
479 
480  kwl.add(prefix,
482  0,
483  true);
484 
485  kwl.add(prefix,
487  0,
488  true);
489 
490  kwl.add(prefix,
492  theImageSize.line - 1,
493  true);
494 
495  kwl.add(prefix,
497  theImageSize.samp - 1,
498  true);
499 
500  ossimDpt ulcorner;
501  if(!theBoundGndPolygon.vertex(0, ulcorner))
502  {
503  ulcorner = ossimDpt(0,0);
504  }
505 
506  kwl.add(prefix,
508  ulcorner.lat,
509  true);
510 
511  kwl.add(prefix,
513  ulcorner.lon,
514  true);
515 
516  kwl.add(prefix,
518  ulcorner.lat,
519  true);
520 
521  kwl.add(prefix,
523  ulcorner.lon,
524  true);
525 
526  ossimDpt corner;
527  if(!theBoundGndPolygon.nextVertex(corner))
528  {
529  corner = ossimDpt(0,0);
530  }
531  kwl.add(prefix,
533  corner.lat,
534  true);
535 
536  kwl.add(prefix,
538  corner.lon,
539  true);
540 
541  ossimDpt lrcorner;
542  if(!theBoundGndPolygon.nextVertex(lrcorner))
543  {
544  lrcorner = ossimDpt(0,0);
545  }
546  kwl.add(prefix,
548  lrcorner.lat,
549  true);
550  kwl.add(prefix,
552  lrcorner.lon,
553  true);
554 
555 
556  if(!theBoundGndPolygon.nextVertex(corner))
557  {
558  corner = ossimDpt(0,0);
559  }
560  kwl.add(prefix,
562  corner.lat,
563  true);
564  kwl.add(prefix,
566  corner.lon,
567  true);
568 
569  kwl.add(prefix,
571  (ulcorner.lat + lrcorner.lat)/2,
572  true);
573  kwl.add(prefix,
575  (lrcorner.lon + ulcorner.lon)/2,
576  true);
577 
578  kwl.add(prefix,
580  fabs((ulcorner.lat - lrcorner.lat))/(theImageSize.line - 1),
581  true);
582  kwl.add(prefix,
584  fabs((lrcorner.lon - ulcorner.lon))/(theImageSize.samp - 1),
585  true);
586 
587  kwl.add(prefix, ossimKeywordNames::TYPE_KW, "ossimEquDistCylProjection");
588 // kwl.add(prefix, ossimKeywordNames::TYPE_KW, TYPE_NAME(this));
589 
590  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::saveState: returning..." << std::endl;
591  return true;
592 }
593 
594 //*****************************************************************************
595 // METHOD: ossimNitfMapModel::loadState()
596 //
597 // Restores the model's state from the KWL. This KWL also serves as a
598 // geometry file.
599 //
600 //*****************************************************************************
602  const char* prefix)
603 {
604  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::loadState: entering..." << std::endl;
605 
606  if (traceDebug())
607  {
608  ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::loadState:"
609  << "\nInput kwl: " << kwl
610  << std::endl;
611  }
612 
613  const char* value = 0;
614  const char* keyword = 0;
615  bool success = false;
616 
617  //***
618  // Assure this keywordlist contains correct type info:
619  //***
620  value = kwl.find(prefix, ossimKeywordNames::TYPE_KW);
621  if (!value || (strcmp(value, TYPE_NAME(this))))
622  goto loadStateError;
623 
624  //***
625  // Pass on to the base-class for parsing first:
626  //***
627  success = ossimSensorModel::loadState(kwl, prefix);
628  if (!success) goto loadStateError;
629 
630  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::loadState: returning..." << std::endl;
631  return true;
632 
633  //***
634  // Local error handling:
635  //***
636  loadStateError:
637  theErrorStatus++;
638  ossimNotify(ossimNotifyLevel_FATAL) << "FATAL ossimNitfMapModel::loadState: encountered parsing the following required keyword: "
639  << "<" << keyword << ">. Check the keywordlist for proper syntax."
640  << std::endl;
641 
642  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::loadState: returning with error..." << std::endl;
643  return false;
644 }
645 
646 //*****************************************************************************
647 // STATIC METHOD: ossimNitfMapModel::writeGeomTemplate
648 //
649 // Writes a sample kwl to output stream.
650 //
651 //*****************************************************************************
653 {
654  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::writeGeomTemplate: entering..." << std::endl;
655 
656  os <<
657  "//**************************************************************\n"
658  "// Template for LandSat model keywordlist\n"
659  "//**************************************************************\n"
660  << ossimKeywordNames::TYPE_KW << ": " << "ossimNitfMapModel" << endl;
661 
663 
664  if (traceExec()) ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG ossimNitfMapModel::writeGeomTemplate: returning..." << std::endl;
665  return;
666 }
667 
RTTI_DEF1(ossimNitfMapModel, "ossimNitfMapModel", ossimSensorModel)
static const char * DECIMAL_DEGREES_PER_PIXEL_LAT
#define TYPE_NAME(p)
Definition: ossimRtti.h:326
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
static const char * CENTRAL_MERIDIAN_KW
Represents serializable keyword/value map.
virtual void lineSampleHeightToWorld(const ossimDpt &image_point, const double &heightEllipsoid, ossimGpt &worldPoint) const
static const char * UL_LAT_KW
static const char * LR_X_KW
bool nextVertex(ossimDpt &tbd_vertex) const
METHOD: nextVertex() Assigns the ossimDpt tbd_vertex following the current vertex.
static void writeGeomTemplate(ostream &os)
const char * find(const char *key) const
ossimString theImageID
double samp
Definition: ossimDpt.h:164
static const char * NUMBER_LINES_KW
static const char * TIE_POINT_LON_KW
void split(ossimString &drivePart, ossimString &pathPart, ossimString &filePart, ossimString &extPart) const
static const char * LR_LON_KW
virtual bool write(const char *file, const char *comment=0) const
Methods to dump the ossimKeywordlist to a file on disk.
bool vertex(int index, ossimDpt &tbd_vertex) const
METHOD: vertex(index) Returns the ossimDpt vertex given the index.
static const char * METERS_PER_PIXEL_Y_KW
static const char * TYPE_KW
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
static const char * LR_Y_KW
static const char * LR_LAT_KW
double line
Definition: ossimDpt.h:165
double lat
Definition: ossimDpt.h:165
static const char * UL_X_KW
static const char * LL_LON_KW
const char * chars() const
For backward compatibility.
Definition: ossimString.h:77
ossimPolygon theBoundGndPolygon
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
static const char * DECIMAL_DEGREES_PER_PIXEL_LON
static const char * LL_LAT_KW
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
virtual std::ostream & print(std::ostream &out) const
static const char * UL_Y_KW
double lon
Definition: ossimDpt.h:164
static void writeGeomTemplate(ostream &os)
static const char * ORIGIN_LATITUDE_KW
#define MTRS_PER_FT
virtual std::ostream & print(std::ostream &out) const
ossim_int32 samp
Definition: ossimIpt.h:141
static const char * UL_LON_KW
static const char * UR_LAT_KW
void merge(const ossimString &drivePart, const ossimString &pathPart, const ossimString &filePart, const ossimString &extPart)
static const char * UR_LON_KW
ossim_int32 line
Definition: ossimIpt.h:142
static const char * TIE_POINT_LAT_KW
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
static const char * METERS_PER_PIXEL_X_KW
static const char * NUMBER_SAMPLES_KW
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23