1 #include <ossim/base/ossimNadconNarDatum.h>
2 
3 RTTI_DEF1(ossimNadconNarDatum, "ossimNadconNarDatum", ossimNadconGridDatum);
ossimNadconNarDatum(const ossimFilename & nadconDirectory)4 ossimNadconNarDatum::ossimNadconNarDatum(const ossimFilename& nadconDirectory)
5    :
6       ossimNadconGridDatum(nadconDirectory,
7                            ossimString("NAR"),
8                            ossimString("NORTH AMERICAN 1983 NADCON, CONUS GRID"),
9                            ossimEllipsoidFactory::instance()->create(ossimString("RF")),
10                            2.000000000000000, 2.000000000000000, 2.000000000000000,
11                            -135.0, -60.0, 15.0, 60.0,
12                            0.000000000000000, 0.000000000000000, 0.000000000000000)
13 {
14 }
15 
shift(const ossimGpt & aPt) const16 ossimGpt ossimNadconNarDatum::shift(const ossimGpt    &aPt)const
17 {
18   const ossimDatum* datum = aPt.datum();
19   ossimString code = datum->code();
20   ossimString subCode(code.begin(),
21 		      code.begin() + 3);
22   if(subCode == "NAR")
23   {
24      return aPt;
25   }
26   else
27   {
28      if(subCode == "NAS")
29      {
30 	checkGrid(aPt);
31 	if(!theLatGrid.getFileOkFlag()||
32 	   !theLonGrid.getFileOkFlag())
33         {
34            return ossimThreeParamDatum::shift(aPt);
35         }
36 
37         double shiftLat = theLatGrid.getShiftAtLatLon(aPt.latd(), aPt.lond());
38         double shiftLon = theLonGrid.getShiftAtLatLon(aPt.latd(), aPt.lond());
39 
40         if( (ossim::isnan(shiftLat)) || (ossim::isnan(shiftLon)) )
41         {
42            return ossimThreeParamDatum::shift(aPt);
43         }
44         else
45         {
46            // Note the shifts are stored in the file
47            // as seconds.
48            //
49            // convert the seconds into decimal degrees.
50            //
51            shiftLat /= 3600.0;
52            shiftLon /= 3600.0;
53            return ossimGpt(aPt.latd() + shiftLat,
54                            aPt.lond() - shiftLon,
55                            aPt.height(),
56                            this);
57         }
58      }
59      else
60      {
61         return ossimThreeParamDatum::shift(aPt);
62      }
63   }
64 
65   return ossimThreeParamDatum::shift(aPt);
66 }
67