From 8b5592a23607832799f54144ec3a92dbae570d6c Mon Sep 17 00:00:00 2001
From: Cyrille Valladeau <cyrille.valladeau@c-s.fr>
Date: Wed, 2 Jan 2008 12:03:33 +0000
Subject: [PATCH] =?UTF-8?q?~~~~~~~~~~~~~~~~BTO=20ENNOB=20,EENNA=20ENNOB~~~?=
 =?UTF-8?q?~~~~~~~~~~~~~~~~=C3=A9=20.MISSO=20noitcerroC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ossim/base/ossimDatumFactoryRegistry.h    |   80 ++
 .../include/ossim/base/ossimException.h       |   45 +
 .../otbossim/include/ossim/base/ossimWms.h    |  506 +++++++
 Utilities/otbossim/src/ossim/CMakeLists.txt   |    5 +-
 .../src/ossim/base/ossimException.cpp         |   30 +
 .../otbossim/src/ossim/base/ossimWms.cpp      |  466 +++++++
 .../ossimPositionQualityEvaluator.cpp         | 1181 +++++++++++++++++
 .../ossimStatePlaneProjectionInfo.inc         |  287 ++++
 8 files changed, 2599 insertions(+), 1 deletion(-)
 create mode 100755 Utilities/otbossim/include/ossim/base/ossimDatumFactoryRegistry.h
 create mode 100755 Utilities/otbossim/include/ossim/base/ossimException.h
 create mode 100755 Utilities/otbossim/include/ossim/base/ossimWms.h
 create mode 100755 Utilities/otbossim/src/ossim/base/ossimException.cpp
 create mode 100755 Utilities/otbossim/src/ossim/base/ossimWms.cpp
 create mode 100755 Utilities/otbossim/src/ossim/projection/ossimPositionQualityEvaluator.cpp
 create mode 100755 Utilities/otbossim/src/ossim/projection/ossimStatePlaneProjectionInfo.inc

diff --git a/Utilities/otbossim/include/ossim/base/ossimDatumFactoryRegistry.h b/Utilities/otbossim/include/ossim/base/ossimDatumFactoryRegistry.h
new file mode 100755
index 0000000000..b1bef3eb07
--- /dev/null
+++ b/Utilities/otbossim/include/ossim/base/ossimDatumFactoryRegistry.h
@@ -0,0 +1,80 @@
+//----------------------------------------------------------------------------
+//
+// License:  See top level LICENSE.txt file
+//
+// Author:  David Burken
+//
+// Description: Class declaration of Registry (singleton) for datum factories.
+//
+//----------------------------------------------------------------------------
+// $Id$
+
+#ifndef ossimDatumFactoryRegistry_HEADER
+#define ossimDatumFactoryRegistry_HEADER
+
+#include <vector>
+#include <list>
+
+#include <ossim/base/ossimConstants.h> /* for OSSIM_DLL macro */
+
+// Forward class declarations.
+class ossimDatumFactoryInterface;
+class ossimString;
+class ossimDatum;
+
+class OSSIM_DLL ossimDatumFactoryRegistry
+{
+public:
+   
+   /** destructor */
+   ~ossimDatumFactoryRegistry();
+
+   /**
+    * instance method
+    *
+    * @return Point to the instance of the registry.
+    */
+   static ossimDatumFactoryRegistry* instance();
+
+   /**
+    * Method to add factory to registry.
+    * @param factory Factory to register.
+    */
+   void registerFactory(ossimDatumFactoryInterface* factory);
+   
+   /**
+    * create method
+    *
+    * Implements pure virtual ossimDatumFactoryInterface::create.
+    *
+    * @return const pointer to a datum.
+    */
+   const ossimDatum* create(const ossimString& code)const;
+
+   /**
+    * getList method to return a combined list of all datums from registered
+    * datum factories.
+    *
+    * @param list The list to add to.
+    */
+   void getList(std::list<ossimString>& list) const;
+   
+private:
+
+   /** hidden from use default constructor */
+   ossimDatumFactoryRegistry();
+
+   /** hidden from use copy constructor */
+   ossimDatumFactoryRegistry(const ossimDatumFactoryRegistry& obj);
+
+   /** hidden from use assignment operator */
+   const ossimDatumFactoryRegistry& operator=(
+      const ossimDatumFactoryRegistry& rhs);
+
+   /** Single static instance of this class. */
+   static ossimDatumFactoryRegistry* theInstance;
+
+   std::vector<ossimDatumFactoryInterface*> theFactoryList;
+};
+
+#endif /* #ifndef ossimDatumFactoryRegistry_HEADER */
diff --git a/Utilities/otbossim/include/ossim/base/ossimException.h b/Utilities/otbossim/include/ossim/base/ossimException.h
new file mode 100755
index 0000000000..1286860412
--- /dev/null
+++ b/Utilities/otbossim/include/ossim/base/ossimException.h
@@ -0,0 +1,45 @@
+//----------------------------------------------------------------------------
+// License:  See top level LICENSE.txt file.
+//
+// Author:  David Burken
+//
+// Description:  Generic OSSIM Exception that is a std::exception with a
+// what() method implemented.
+//----------------------------------------------------------------------------
+// $Id: ossimException.h 10029 2006-12-04 23:23:11Z dburken $
+#ifndef ossimException_HEADER
+#define ossimException_HEADER
+
+#include <exception>
+#include <string>
+#include <ossim/base/ossimConstants.h>
+
+class OSSIM_DLL ossimException : public std::exception
+{
+public:
+
+   /** @brief default construction */
+   ossimException() throw();
+
+   /**
+    * @brief construction that takes an error string.
+    * @param errorMessage The error message.
+    */
+   ossimException(const std::string& errorMessage) throw();
+
+   /** @brief virtual destructor. */
+   virtual ~ossimException() throw();
+
+   /**
+    * @brief Returns the error message.
+    * @return The error message as a C-style character string.
+    */
+   virtual const char* what() const throw();
+
+private:
+
+   /** This is the error message returned by what(). */
+   std::string theErrorMessage;
+};
+
+#endif /* End of #ifndef ossimException_HEADER */
diff --git a/Utilities/otbossim/include/ossim/base/ossimWms.h b/Utilities/otbossim/include/ossim/base/ossimWms.h
new file mode 100755
index 0000000000..c3e2e24fa8
--- /dev/null
+++ b/Utilities/otbossim/include/ossim/base/ossimWms.h
@@ -0,0 +1,506 @@
+// $Id$
+
+#ifndef ossimWms_HEADER
+#define ossimWms_HEADER
+
+#include <ossim/base/ossimXmlDocument.h>
+#include <ossim/base/ossimXmlNode.h>
+
+#include <queue>
+class ossimWmsStyle;
+class ossimWmsLayer;
+
+typedef std::vector<ossimString> ossimWmsStringListType;
+
+typedef std::vector<ossimRefPtr<ossimWmsStyle> > ossimWmsStyleListType;
+typedef const std::vector<ossimRefPtr<ossimWmsStyle> > ossimConstWmsStyleListType;
+typedef std::vector<ossimRefPtr<ossimWmsLayer> > ossimWmsLayerListType;
+typedef const std::vector<ossimRefPtr<ossimWmsLayer> > ossimConstWmsLayerListType;
+
+class OSSIM_DLL ossimWmsGetMap : public ossimReferenced
+{
+public:
+   ossimWmsGetMap()
+   {
+      clearFields();
+   }
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+
+   ossimWmsStringListType& getFormatTypes()
+   {
+      return theFormatTypes;
+   }
+   const ossimWmsStringListType& getFormatTypes()const
+   {
+      return theFormatTypes;
+   }
+   bool hasFomrats()const
+   {
+      return theFormatTypes.size() > 0;
+   }
+   /**
+    * Will do an exact compare on the input format.  You can also specify if you want case sensitive
+    * compares
+    */ 
+   bool hasFormat(const ossimString& format, bool caseSensitive=true)const;
+
+   /**
+    * Will not do an exact compare but instead will test if the passed in string is contained within
+    * the formats.  You can also specify case sensitive.
+    */ 
+   bool containsFormat(const ossimString& format, bool caseSensitive=true)const;
+   void clearFields()
+   {
+      theUrl = "";
+      thePostUrl = "";
+      theFormatTypes.clear();
+   }
+   const ossimString& getUrl()const
+   {
+      return theUrl;
+   }
+   const ossimString& getPostUrl()const
+   {
+      return thePostUrl;
+   }
+protected:
+   ossimString            theUrl; 
+   ossimString            thePostUrl; 
+   ossimWmsStringListType theFormatTypes;
+};
+
+class OSSIM_DLL ossimWmsGetCapabilities : public ossimReferenced
+{
+public:
+   ossimWmsGetCapabilities()
+   {
+   }
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+
+   const ossimString& getUrl()const
+   {
+      return theUrl;
+   }
+protected:
+   ossimString        theUrl; 
+  
+};
+
+class OSSIM_DLL ossimWmsRequest : public ossimReferenced
+{
+public:
+   ossimWmsRequest()
+   {
+   }
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+
+   ossimRefPtr<ossimWmsGetCapabilities> getCapabilities()
+   {
+      return theGetCapabilities;
+   }
+   const ossimRefPtr<ossimWmsGetCapabilities> getCapabilities()const
+   {
+      return theGetCapabilities;
+   }
+   ossimRefPtr<ossimWmsGetMap> getMap()
+   {
+      return theGetMap;
+   }
+   const ossimRefPtr<ossimWmsGetMap> getMap()const
+   {
+      return theGetMap;
+   }
+   
+protected:
+   ossimRefPtr<ossimWmsGetCapabilities> theGetCapabilities;
+   ossimRefPtr<ossimWmsGetMap> theGetMap;
+};
+class OSSIM_DLL ossimWmsContactAdress : public ossimReferenced
+{
+public:
+   ossimWmsContactAdress()
+      {}
+protected:
+   ossimString theAddressType;
+   ossimString theAddress;
+   ossimString theCity;
+   ossimString theStateOrProvince;
+   ossimString thePostCode;
+   ossimString theCountry;
+};
+
+class OSSIM_DLL ossimWmsContactInformation : public ossimReferenced
+{
+public:
+   virtual bool read(ossimRefPtr<ossimXmlNode> /* node */ )
+      {
+         return true;
+      }
+   
+protected:
+   ossimString thePrimaryContactPerson;
+   ossimString thePrimaryContactOrganization;
+   ossimString theContactPosition;
+   ossimRefPtr<ossimWmsContactAdress> theContactAddress;
+   ossimString theContactVoiceTelephone;
+   ossimString theContactEmailAddress;
+};
+
+class OSSIM_DLL ossimWmsService : public ossimReferenced
+{
+public:
+   ossimWmsService()
+      {
+      }
+
+   virtual bool read(ossimRefPtr<ossimXmlNode> /* xml */ )
+      {
+         return true;
+      }
+
+protected:
+   ossimString theName;
+   ossimString theTitle;
+   ossimString theAbstract;
+   std::vector<ossimString> theKeywordList;
+   ossimString theOnlineResource;
+   ossimRefPtr<ossimWmsContactInformation> theContactInformation;
+   ossimString theFees;
+   ossimString theAccessConstraints;
+};
+
+
+class OSSIM_DLL ossimWmsTimeExtent : public ossimReferenced
+{
+public:
+   ossimWmsTimeExtent()
+      {
+      }
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+
+   void clearFields()
+      {
+         theDefaultValue = "";
+         theTimes.clear();
+      }
+protected:
+   ossimString theDefaultValue;
+   std::vector<ossimString> theTimes;
+};
+
+
+class OSSIM_DLL ossimWmsMetadataUrl : public ossimReferenced
+{
+public:
+   ossimWmsMetadataUrl()
+      {
+      }
+
+protected:
+   ossimString theFormat;
+   ossimString theOnlineResourceHref;
+};
+
+class OSSIM_DLL ossimWmsDataUrl : public ossimReferenced
+{
+public:
+protected:
+   ossimString theFormat;
+   ossimString theOnlineResourceHref;
+};
+
+class OSSIM_DLL ossimWmsStyle : public ossimReferenced
+{
+public:
+   ossimWmsStyle()
+      {}
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+   void clearFields()
+      {
+         theName  = "";
+         theTitle = "";
+         theAbstract = "";
+      }
+
+   const ossimString& getName()const
+      {
+         return theName;
+      }
+   
+   const ossimString& getTitle()const
+      {
+         return theTitle;
+      }
+
+   const ossimString& getAbstract()const
+   {
+      return theAbstract;
+   }
+protected:
+   ossimString theName;
+   ossimString theTitle;
+   ossimString theAbstract;
+};
+
+class OSSIM_DLL ossimWmsScaleHint : public ossimReferenced
+{
+public:
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+
+   void clearFields()
+      {
+         theMin = 0.0;
+         theMax = 0.0;
+      }
+   void getMinMax(double& min, double& max)
+   {
+      min = theMin;
+      max = theMax;
+   }
+   double getMin()const
+   {
+      return theMin;
+   }
+   double getMax()const
+   {
+      return theMax;
+   }
+protected:
+   double theMin;
+   double theMax;
+};
+
+class OSSIM_DLL ossimWmsBoundingBox : public ossimReferenced
+{
+public:
+   ossimWmsBoundingBox()
+      {
+      }
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+   void clearFields()
+      {
+         theSrs = "";
+         theMinX = 0.0;
+         theMinY = 0.0;
+         theMaxX = 0.0;
+         theMaxY = 0.0;
+      }
+   bool isGeographic()const
+      {
+         return theSrs.contains("4326");
+      }
+   const ossimString& getSrs()const
+      {
+         return theSrs;
+      }
+   double getMinX()const
+      {
+         return theMinX;
+      }
+   double getMinY()const
+      {
+         return theMinY;
+      }
+   double getMaxX()const
+      {
+         return theMaxX;
+      }
+   double getMaxY()const
+      {
+         return theMaxY;
+      }
+protected:
+   ossimString theSrs;
+   double theMinX;
+   double theMinY;
+   double theMaxX;
+   double theMaxY;
+};
+
+class OSSIM_DLL ossimWmsLayer : public ossimReferenced
+{
+public:
+   
+   ossimWmsLayer()
+      :theParent(0)
+      {
+         clearFields();
+      }
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+
+   void clearFields()
+      {
+         theName           = "";
+         theTitle           = "";
+         theAbstract       = "";
+         theSrs            = "";
+         theTimeExtent     = 0;
+         theDimensionUnits = "";
+         theDimensionName  = "";
+         theBoundingBox    = 0;
+         theScaleHint      = 0;
+         theStyles.clear();
+         theLayers.clear();
+      }
+   const ossimWmsLayer* getParent()const
+      {
+         return theParent;
+      }
+
+   ossimWmsLayer* getParent()
+      {
+         return theParent;
+      }
+   
+    void setParent(ossimWmsLayer* parent)
+      {
+         theParent = parent;
+      }
+   const ossimRefPtr<ossimWmsBoundingBox> findBoundingBox()const
+      {
+         const ossimWmsLayer* currentLayer = this;
+
+         while(currentLayer)
+         {
+            if(currentLayer->theBoundingBox.valid())
+            {
+               return currentLayer->theBoundingBox;
+            }
+            currentLayer = currentLayer->theParent;
+         }
+         
+         return 0;
+      }
+
+   void getNamedLayers(ossimWmsLayerListType& namedLayers);
+
+   const ossimString& getName()const
+      {
+         return theName;
+      }
+   const ossimString& getTitle()const
+      {
+         return theTitle;
+      }
+   const ossimString& getAbstract()const
+      {
+         return theAbstract;
+      }
+   const ossimString& getSrs()const
+      {
+         return theSrs;
+      }
+   const ossimRefPtr<ossimWmsTimeExtent> getTimeExtent()
+      {
+         return theTimeExtent;
+      }
+   const ossimString& getDimensionUnits()const
+      {
+         return theDimensionUnits;
+      }
+   const ossimString& getDimensionName()const
+      {
+         return theDimensionName;
+      }
+   const ossimRefPtr<ossimWmsBoundingBox> getBoundingBox()const
+      {
+         return theBoundingBox;
+      }
+   const ossimRefPtr<ossimWmsScaleHint> getScaleHint()const
+      {
+         return theScaleHint;
+      }
+   const ossimWmsStyleListType& getStyles()const
+      {
+         return theStyles;
+      }
+   ossimWmsStyleListType& getStyles()
+      {
+         return theStyles;
+      }
+   const ossimWmsLayerListType& getLayers()const
+      {
+         return theLayers;
+      }
+   ossimWmsLayerListType& getLayers()
+   {
+      return theLayers;
+   }
+
+   ossim_uint32 getNumberOfChildren()const
+   {
+      return (ossim_uint32)theLayers.size();
+   }
+   ossim_uint32 getNumberOfStyles()const
+   {
+      return (ossim_uint32)theStyles.size();
+   }
+protected:
+   ossimWmsLayer* theParent;
+   ossimString theName;
+   ossimString theTitle;
+   ossimString theAbstract;
+   ossimString theSrs;
+   ossimRefPtr<ossimWmsTimeExtent> theTimeExtent;
+   ossimString theDimensionUnits;
+   ossimString theDimensionName;
+   ossimRefPtr<ossimWmsBoundingBox> theBoundingBox;
+   ossimRefPtr<ossimWmsScaleHint>          theScaleHint;
+   ossimWmsStyleListType theStyles;
+   ossimWmsLayerListType theLayers;
+};
+
+class OSSIM_DLL ossimWmsCapability : public ossimReferenced
+{
+public:
+   virtual bool read(const ossimRefPtr<ossimXmlNode> node);
+   void getNamedLayers(ossimWmsLayerListType&  layers);
+   ossimRefPtr<ossimWmsRequest> getRequest()
+   {
+      return theRequest;
+   }
+   const ossimRefPtr<ossimWmsRequest> getRequest()const
+   {
+      return theRequest;
+   }
+protected:
+   ossimRefPtr<ossimWmsRequest>             theRequest;
+   std::vector<ossimRefPtr<ossimWmsLayer> > theLayers;
+};
+
+class OSSIM_DLL ossimWmsCapabilitiesDocument : public ossimReferenced
+{
+public:
+   ossimWmsCapabilitiesDocument()
+      {
+         
+      }
+
+   bool read(const std::string& inString);
+   virtual bool read(ossimRefPtr<ossimXmlNode> node);
+   void clearFields()
+      {
+         theVersion = "";
+         theCapability=0;
+      }
+   ossimRefPtr<ossimWmsCapability> getCapability()
+   {
+      return theCapability;
+   }
+   const ossimRefPtr<ossimWmsCapability> getCapability()const
+   {
+      return theCapability;
+   }
+
+   ossimRefPtr<ossimWmsGetMap> getRequestGetMap();
+   const ossimRefPtr<ossimWmsGetMap> getRequestGetMap()const;
+
+   ossimRefPtr<ossimWmsGetCapabilities> getRequestGetCapabilities();
+   const ossimRefPtr<ossimWmsGetCapabilities> getRequestGetCapabilities()const;
+
+protected:
+   ossimString theVersion;
+   ossimRefPtr<ossimWmsCapability> theCapability;
+};
+
+#endif
diff --git a/Utilities/otbossim/src/ossim/CMakeLists.txt b/Utilities/otbossim/src/ossim/CMakeLists.txt
index a44ee9a35e..f269cb141c 100644
--- a/Utilities/otbossim/src/ossim/CMakeLists.txt
+++ b/Utilities/otbossim/src/ossim/CMakeLists.txt
@@ -57,7 +57,10 @@ TARGET_LINK_LIBRARIES(otbossimElevation otbossimSupportData)
 #ADD_LIBRARY(otbossimImaging ${ossim_imaging_SRCS} ${ossim_parallel_SRCS})
 #TARGET_LINK_LIBRARIES(otbossimImaging otbossimProjection itktiff itkjpeg8 itkjpeg12 itkjpeg16)
 
-ADD_LIBRARY(otbossimProjectionImaging ${ossim_imaging_SRCS} ${ossim_projection_SRCS} ${ossim_parallel_SRCS})
+#################ADD_LIBRARY(otbossimProjectionImaging ${ossim_imaging_SRCS} ${ossim_projection_SRCS} ${ossim_parallel_SRCS})
+#################TARGET_LINK_LIBRARIES(otbossimProjectionImaging otbossimElevation itktiff itkjpeg8 itkjpeg12 itkjpeg16)
+################# CYRILLE MODIF POUR ESSAYER DE FAIRE MARCHE LE BOUSIN !!! #################
+ADD_LIBRARY(otbossimProjectionImaging ${ossim_imaging_SRCS} ${ossim_projection_SRCS} ${ossim_parallel_SRCS} ${ossim_base_SRCS})
 TARGET_LINK_LIBRARIES(otbossimProjectionImaging otbossimElevation itktiff itkjpeg8 itkjpeg12 itkjpeg16)
 
 
diff --git a/Utilities/otbossim/src/ossim/base/ossimException.cpp b/Utilities/otbossim/src/ossim/base/ossimException.cpp
new file mode 100755
index 0000000000..9e00c602fd
--- /dev/null
+++ b/Utilities/otbossim/src/ossim/base/ossimException.cpp
@@ -0,0 +1,30 @@
+//----------------------------------------------------------------------------
+// License:  See top level LICENSE.txt file.
+//
+// Author:  David Burken
+//
+// Description:  Generic OSSIM Exception that is a std::exception with a
+// what() method implemented.
+//----------------------------------------------------------------------------
+// $Id: ossimException.cpp 10029 2006-12-04 23:23:11Z dburken $
+
+#include <ossim/base/ossimException.h>
+
+ossimException::ossimException() throw()
+   : theErrorMessage()
+{
+}
+
+ossimException::ossimException(const std::string& errorMessage) throw()
+   : theErrorMessage(errorMessage)
+{
+}
+
+ossimException::~ossimException() throw()
+{
+}
+
+const char* ossimException::what() const throw()
+{
+   return theErrorMessage.c_str();
+}
diff --git a/Utilities/otbossim/src/ossim/base/ossimWms.cpp b/Utilities/otbossim/src/ossim/base/ossimWms.cpp
new file mode 100755
index 0000000000..e733a83967
--- /dev/null
+++ b/Utilities/otbossim/src/ossim/base/ossimWms.cpp
@@ -0,0 +1,466 @@
+// $Id$
+
+#include <ossim/base/ossimWms.h>
+#include <ossim/base/ossimXmlString.h>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include <ossim/base/ossimCommon.h>
+
+bool ossimWmsGetMap::read(ossimRefPtr<ossimXmlNode> node)
+{
+   clearFields();
+   const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
+   ossim_uint32 idx = 0;
+   
+   for(idx = 0; idx < childNodes.size();++idx)
+   {
+      if(childNodes[idx]->getTag() == "Format")
+      {
+         ossimString text = childNodes[idx]->getText();
+         text = text.trim();
+         if(!text.empty())
+         {
+            theFormatTypes.push_back(text);
+         }
+         else
+         {
+            const vector<ossimRefPtr<ossimXmlNode> >& childFormatNodes =  childNodes[idx]->getChildNodes();
+            if(childFormatNodes.size())
+            {
+               ossim_uint32 childIdx = 0;
+               for(childIdx = 0; childIdx < childFormatNodes.size();++childIdx)
+               {
+                  text = childFormatNodes[childIdx]->getTag();
+                  text = text.trim();
+                  if(!text.empty())
+                  {
+                     theFormatTypes.push_back(text);
+                  }
+               }
+            }
+         }
+      }
+      else if(childNodes[idx]->getTag() == "DCPType")
+      {
+         ossimRefPtr<ossimXmlNode> node = childNodes[idx]->findFirstNode("HTTP/Get/OnlineResource");
+         if(node.valid())
+         {
+            node->getAttributeValue(theUrl, "xlink:href");
+         }
+         else
+         {
+            node = childNodes[idx]->findFirstNode("HTTP/Get");
+            if(node.valid())
+            {
+               node->getAttributeValue(theUrl, "onlineResource");
+               theUrl = ossim::convertHtmlSpecialCharactersToNormalCharacter(theUrl);
+            }
+         }
+      }
+   }
+   
+   return true;
+}
+
+bool ossimWmsGetMap::hasFormat(const ossimString& format, bool caseSensitive)const
+{
+   if(theFormatTypes.empty()) return false;
+   ossimString tempFormat = format;
+   if(!caseSensitive) tempFormat = tempFormat.downcase();
+
+   ossim_uint32 idx = 0;
+   for(idx = 0; idx < theFormatTypes.size();++idx)
+   {
+      ossimString temp = theFormatTypes[idx];
+      if(!caseSensitive)
+      {
+         temp = temp.downcase();
+      }
+      if(temp==tempFormat)
+      {
+         return true;
+      }
+   }
+
+   return false;
+}
+
+bool ossimWmsGetMap::containsFormat(const ossimString& format, bool caseSensitive)const
+{
+   if(theFormatTypes.empty()) return false;
+   ossimString tempFormat = format;
+   if(!caseSensitive) tempFormat = tempFormat.downcase();
+
+   ossim_uint32 idx = 0;
+   for(idx = 0; idx < theFormatTypes.size();++idx)
+   {
+      ossimString temp = theFormatTypes[idx];
+      if(!caseSensitive)
+      {
+         temp = temp.downcase();
+      }
+      if(temp.contains(tempFormat))
+      {
+         return true;
+      }
+   }
+
+   return false;
+}
+
+bool ossimWmsGetCapabilities::read(ossimRefPtr<ossimXmlNode> node)
+{
+   ossimRefPtr<ossimXmlNode> childNode = node->findFirstNode("DCPType/HTTP/Get/OnlineResource");
+
+   if(childNode.valid())
+   {
+      childNode->getAttributeValue(theUrl, "xlink:href");
+   }
+
+   return true;
+}
+
+bool ossimWmsRequest::read(ossimRefPtr<ossimXmlNode> node)
+{
+   const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
+   ossim_uint32 idx = 0;
+   
+   for(idx = 0; idx < childNodes.size();++idx)
+   {
+      if((childNodes[idx]->getTag() == "GetCapabilities")||
+         (childNodes[idx]->getTag() == "Capabilities"))
+      {
+         theGetCapabilities = new ossimWmsGetCapabilities;
+         theGetCapabilities->read(childNodes[idx]);
+      }
+      else if((childNodes[idx]->getTag() == "GetMap")||
+              (childNodes[idx]->getTag() == "Map"))
+      {
+         theGetMap = new ossimWmsGetMap;
+         theGetMap->read(childNodes[idx]);
+      }
+   }
+   
+   return true;
+}
+
+bool ossimWmsTimeExtent::read(ossimRefPtr<ossimXmlNode> node)
+{
+   clearFields();
+   node->getAttributeValue(theDefaultValue, "default");
+   ossimString timeValues = node->getText();
+
+   timeValues.split(theTimes, "/");
+
+   return true;
+}
+
+bool ossimWmsStyle::read(ossimRefPtr<ossimXmlNode> node)
+{
+   const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
+   ossim_uint32 idx = 0;
+   for(idx = 0; idx < childNodes.size();++idx)
+   {
+      if(childNodes[idx]->getTag() == "Name")
+      {
+         theName = childNodes[idx]->getText();
+      }
+      else if(childNodes[idx]->getTag() == "Title")
+      {
+         theTitle = childNodes[idx]->getText();
+      }
+      else if(childNodes[idx]->getTag() == "Abstract")
+      {
+         theAbstract = childNodes[idx]->getText();
+      }
+   }
+
+   return true;
+}
+
+bool ossimWmsScaleHint::read(ossimRefPtr<ossimXmlNode> node)
+{
+   ossimString minScale, maxScale;
+
+   if(node->getAttributeValue(minScale, "min")&&
+      node->getAttributeValue(maxScale, "max"))
+   {
+
+      theMin = minScale.toDouble();
+      theMax = maxScale.toDouble();
+      
+      return true;
+   }
+   
+   return false;
+}
+
+bool ossimWmsBoundingBox::read(ossimRefPtr<ossimXmlNode> node)
+{
+   ossimString minx, miny, maxx, maxy;
+
+   bool result = (node->getAttributeValue(minx, "minx")&&
+                  node->getAttributeValue(miny, "miny")&&
+                  node->getAttributeValue(maxx, "maxx")&&
+                  node->getAttributeValue(maxy, "maxy"));
+   
+   node->getAttributeValue(theSrs, "SRS");
+   
+   if(node->getTag() == "LatLonBoundingBox")
+   {
+      theSrs = "EPSG:4326";
+   }
+
+   theMinX = minx.toDouble();
+   theMinY = miny.toDouble();
+   theMaxX = maxx.toDouble();
+   theMaxY = maxy.toDouble();
+
+   return result;
+}
+
+bool ossimWmsLayer::read(ossimRefPtr<ossimXmlNode> node)
+{
+   clearFields();
+   const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
+   ossim_uint32 idx = 0;
+   for(idx = 0; idx < childNodes.size();++idx)
+   {
+      if(childNodes[idx]->getTag() == "Name")
+      {
+         theName = childNodes[idx]->getText();
+      }
+      else if(childNodes[idx]->getTag() == "Title")
+      {
+         theTitle = childNodes[idx]->getText();
+      }
+      else if(childNodes[idx]->getTag() == "Abstract")
+      {
+         theAbstract = childNodes[idx]->getText();
+      }
+      else if(childNodes[idx]->getTag() == "Extent")
+      {
+         ossimString name;
+         if(childNodes[idx]->getAttributeValue(name, "name"))
+         {
+            if(name == "time")
+            {
+               theTimeExtent = new ossimWmsTimeExtent;
+               if(!theTimeExtent->read(childNodes[idx]))
+               {
+                  theTimeExtent = 0;
+               }
+            }
+         }
+      }
+      else if(childNodes[idx]->getTag() == "SRS")
+      {
+         theSrs = childNodes[idx]->getText();
+      }
+      else if(childNodes[idx]->getTag() == "Dimension")
+      {
+         childNodes[idx]->getAttributeValue(theDimensionUnits, "units");
+         childNodes[idx]->getAttributeValue(theDimensionName,  "name");
+      }
+      else if(childNodes[idx]->getTag() == "Style")
+      {
+         ossimRefPtr<ossimWmsStyle> style = new ossimWmsStyle;
+         style->read(childNodes[idx]);
+         theStyles.push_back(style);
+      }
+      else if(childNodes[idx]->getTag() == "ScaleHint")
+      {
+         theScaleHint = new ossimWmsScaleHint;
+         if(!theScaleHint->read(childNodes[idx]))
+         {
+            theScaleHint = 0;
+         }
+      }
+      else if(childNodes[idx]->getTag() == "LatLonBoundingBox"||
+              childNodes[idx]->getTag() == "BoundingBox")
+      {
+         theBoundingBox = new ossimWmsBoundingBox;
+         if(!theBoundingBox->read(childNodes[idx]))
+         {
+            theBoundingBox = 0;
+         }
+      }
+      else if(childNodes[idx]->getTag() == "Layer")
+      {
+         ossimRefPtr<ossimWmsLayer> layer = new ossimWmsLayer;
+         if(!layer->read(childNodes[idx]))
+         {
+            return false;
+         }
+         layer->setParent(this);
+         theLayers.push_back(layer.get());
+      }
+   }
+
+   return true;
+}
+
+void ossimWmsLayer::getNamedLayers(ossimWmsLayerListType& namedLayers)
+{
+   if(theLayers.empty()) return;
+   
+   std::deque<ossimRefPtr<ossimWmsLayer> > layers(theLayers.begin(), theLayers.end());
+   
+   while(!layers.empty())
+   {
+      ossimRefPtr<ossimWmsLayer> layer = layers.front();
+      layers.pop_front();
+      if(!layer->getName().empty())
+      {
+         namedLayers.push_back(layer);
+      }
+      if(layer->getNumberOfChildren()>0)
+      {
+         ossimWmsLayerListType& layerList = layer->getLayers();
+         layers.insert(layers.end(), layerList.begin(), layerList.end());
+      }
+   }
+}
+
+bool ossimWmsCapability::read(const ossimRefPtr<ossimXmlNode> node)
+{
+   const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
+   
+   ossim_uint32 idx = 0;
+   for(idx = 0; idx < childNodes.size();++idx)
+   {
+      if(childNodes[idx]->getTag() == "Layer")
+      {
+         ossimRefPtr<ossimWmsLayer> layer = new ossimWmsLayer;
+         if(!layer->read(childNodes[idx]))
+         {
+            return false;
+         }
+         theLayers.push_back(layer.get());
+      }
+      else if(childNodes[idx]->getTag() == "Request")
+      {
+         theRequest = new ossimWmsRequest;
+         theRequest->read(childNodes[idx]);
+      }
+   }
+   
+   return true;
+}
+
+void ossimWmsCapability::getNamedLayers(ossimWmsLayerListType&  layers)
+{
+   ossim_uint32 idx = 0;
+
+   for(idx = 0; idx < theLayers.size(); ++idx)
+   {
+      if(!theLayers[idx]->getName().empty())
+      {
+         layers.push_back(theLayers[idx]);
+      }
+      theLayers[idx]->getNamedLayers(layers);
+   }
+   
+}
+
+bool ossimWmsCapabilitiesDocument:: read(const std::string& inString)
+{
+   std::istringstream in(inString);
+   ossimRefPtr<ossimXmlDocument> document = new ossimXmlDocument;
+   if(!document->read(in))
+   {
+//       std::cout << "Couldn't parse XML!!!!!" << std::endl;
+      return false;
+   }
+   if(!read(document->getRoot()))
+   {
+      return false;
+   }
+   
+//   std::cout << *document << std::endl;
+   return true;
+}
+
+bool ossimWmsCapabilitiesDocument::read(ossimRefPtr<ossimXmlNode> node)
+{
+   const vector<ossimRefPtr<ossimXmlNode> >& childNodes = node->getChildNodes();
+   clearFields();
+   if(!node.valid()) return false;
+   node->getAttributeValue(theVersion, "version");
+   ossim_uint32 idx = 0;
+   for(idx = 0; idx < childNodes.size();++idx)
+   {
+      if(childNodes[idx]->getTag() == "Capability")
+      {
+         theCapability = new ossimWmsCapability;
+         if(!theCapability->read(childNodes[idx]))
+         {
+            return false;
+         }
+      }
+   }
+
+   return theCapability.valid();
+}
+
+ossimRefPtr<ossimWmsGetMap> ossimWmsCapabilitiesDocument::getRequestGetMap()
+{
+   ossimRefPtr<ossimWmsGetMap> result;
+
+   if(theCapability.valid())
+   {
+      ossimRefPtr<ossimWmsRequest> request = theCapability->getRequest();
+      if(request.valid())
+      {
+         result = request->getMap();
+      }
+   }
+   
+   return result;
+}
+
+const ossimRefPtr<ossimWmsGetMap> ossimWmsCapabilitiesDocument::getRequestGetMap()const
+{
+
+   if(theCapability.valid())
+   {
+      const ossimRefPtr<ossimWmsRequest> request = theCapability->getRequest();
+      if(request.valid())
+      {
+         return request->getMap();
+      }
+   }
+   
+   return 0;
+}
+
+ossimRefPtr<ossimWmsGetCapabilities> ossimWmsCapabilitiesDocument::getRequestGetCapabilities()
+{
+   ossimRefPtr<ossimWmsGetCapabilities> result;
+
+   if(theCapability.valid())
+   {
+      ossimRefPtr<ossimWmsRequest> request = theCapability->getRequest();
+      if(request.valid())
+      {
+         result = request->getCapabilities();
+      }
+   }
+   
+   return result;
+}
+
+const ossimRefPtr<ossimWmsGetCapabilities> ossimWmsCapabilitiesDocument::getRequestGetCapabilities()const
+{
+   if(theCapability.valid())
+   {
+      const ossimRefPtr<ossimWmsRequest> request = theCapability->getRequest();
+      if(request.valid())
+      {
+         return request->getCapabilities();
+      }
+   }
+   
+   return 0;
+}
diff --git a/Utilities/otbossim/src/ossim/projection/ossimPositionQualityEvaluator.cpp b/Utilities/otbossim/src/ossim/projection/ossimPositionQualityEvaluator.cpp
new file mode 100755
index 0000000000..8e24569708
--- /dev/null
+++ b/Utilities/otbossim/src/ossim/projection/ossimPositionQualityEvaluator.cpp
@@ -0,0 +1,1181 @@
+//----------------------------------------------------------------------------
+//
+// License:  See top level LICENSE.txt file.
+//
+// Author:  David Hicks
+//
+// Description: Base class for position quality evaluation operations.
+//
+//----------------------------------------------------------------------------
+
+#include <ossim/projection/ossimPositionQualityEvaluator.h>
+#include <ossim/elevation/ossimHgtRef.h>
+#include <ossim/base/ossimDatum.h>
+#include <ossim/base/ossimEllipsoid.h>
+#include <ossim/base/ossimDms.h>
+#include <ossim/base/ossimTrace.h>
+#include <ossim/base/ossimString.h>
+#include <ossim/base/ossimNotify.h>
+#include <ossim/base/ossimLsrSpace.h>
+
+static ossimTrace traceDebug(ossimString("ossimPositionQualityEvaluator:debug"));
+static ossimTrace traceExec(ossimString("ossimPositionQualityEvaluator:exec"));
+
+#ifdef OSSIM_ID_ENABLED
+static const char OSSIM_ID[] = "$Id: ossimPositionQualityEvaluator.cpp";
+#endif
+
+// 2D 90% function coefficients
+const ossim_uint32 nTableEntries = 21;
+const ossim_uint32 nMultiplier = nTableEntries-1;
+const ossim_float64 table90[nTableEntries]=
+  {1.644854,1.645623,1.647912,1.651786,1.657313,
+   1.664580,1.673829,1.685227,1.699183,1.716257,
+   1.737080,1.762122,1.791522,1.825112,1.862530,
+   1.903349,1.947158,1.993595,2.042360,2.093214,2.145966};
+   
+// 1D conversion factors relative to ONE_SIGMA
+const ossim_float64 Fac1D[NUM_PROB_LEVELS] =
+   {1.0, 0.6745, 1.6449, 1.96};
+   
+// 2D conversion factors relative to ONE_SIGMA
+const ossim_float64 Fac2D[NUM_PROB_LEVELS] =
+   {1.0, 1.1774, 2.1460, 2.4477};
+   
+// 2D conversion factors relative to P90
+const ossim_float64 Fac2D90[NUM_PROB_LEVELS] =
+   {0.46598, 0.54865, 1.0, 1.14059};
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::ossimPositionQualityEvaluator()
+//  
+//  Constructor.
+//  
+//*****************************************************************************
+ossimPositionQualityEvaluator::ossimPositionQualityEvaluator()
+{
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << "\nossimPositionQualityEvaluator::ossimPositionQualityEvaluator DEBUG:" << std::endl;
+#ifdef OSSIM_ID_ENABLED
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << "OSSIM_ID:  " << OSSIM_ID << std::endl;
+#endif 
+   }
+   
+   theEvaluatorValid = false;
+   theRpcModel.theType = 'N';
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::ossimPositionQualityEvaluator()
+//  
+//  Covariance matrix-based constructor.
+//  
+//*****************************************************************************
+ossimPositionQualityEvaluator::
+ossimPositionQualityEvaluator(const ossimEcefPoint& pt,const NEWMAT::Matrix& covMat)
+{
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << "\nossimPositionQualityEvaluator::ossimPositionQualityEvaluator DEBUG:" << std::endl;
+#ifdef OSSIM_ID_ENABLED
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << "OSSIM_ID:  " << OSSIM_ID << std::endl;
+#endif 
+   }
+   theRpcModel.theType = 'N';
+
+   // Set the point
+   ossimGpt ptG(pt);
+   thePtG = ptG;
+   
+   // Define the local frame centered on the point
+   ossimLsrSpace enu(ptG);
+   theLocalFrame = enu;
+   
+   // Propagate input ECF cov matrix to local
+   theCovMat = theLocalFrame.ecefToLsrRotMatrix()*covMat*
+               theLocalFrame.lsrToEcefRotMatrix();
+
+   // Compute evaluation parameters
+   theEvaluatorValid = decomposeMatrix();
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::ossimPositionQualityEvaluator()
+//  
+//  LOS error/geometry-based constructor.
+//  
+//*****************************************************************************
+ossimPositionQualityEvaluator::
+ossimPositionQualityEvaluator(const ossimEcefPoint&      pt,
+                              const ossim_float64&       errBiasLOS,
+                              const ossim_float64&       errRandLOS,
+                              const ossim_float64&       elevAngleLOS,
+                              const ossim_float64&       azimAngleLOS,
+                              const ossimColumnVector3d& surfN,
+                              const NEWMAT::Matrix&      surfCovMat)
+{
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << "\nossimPositionQualityEvaluator::ossimPositionQualityEvaluator DEBUG:" << std::endl;
+#ifdef OSSIM_ID_ENABLED
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << "OSSIM_ID:  " << OSSIM_ID << std::endl;
+#endif 
+   }
+   theRpcModel.theType = 'N';
+
+   // Set the point
+   ossimGpt ptG(pt);
+   thePtG = ptG;
+    
+   // Define the local frame centered on the point
+   ossimLsrSpace enu(ptG);
+   theLocalFrame = enu;
+
+   // Form the covariance matrix
+   if (constructMatrix
+      (errBiasLOS, errRandLOS, elevAngleLOS, azimAngleLOS, surfN, surfCovMat))
+   {
+      // Compute evaluation parameters
+      theEvaluatorValid = decomposeMatrix();
+   }
+   else
+   {
+      theEvaluatorValid = false;
+   }
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::ossimPositionQualityEvaluator()
+//  
+//  LOS error/coefficient-based constructor.
+//  
+//*****************************************************************************
+ossimPositionQualityEvaluator::
+ossimPositionQualityEvaluator(const ossimEcefPoint&      pt,
+                              const ossim_float64&       errBiasLOS,
+                              const ossim_float64&       errRandLOS,
+                              const pqeRPCModel&         rpc,
+                              const ossimColumnVector3d& surfN,
+                              const NEWMAT::Matrix&      surfCovMat)
+{
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << "\nossimPositionQualityEvaluator::ossimPositionQualityEvaluator DEBUG:" << std::endl;
+#ifdef OSSIM_ID_ENABLED
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         << "OSSIM_ID:  " << OSSIM_ID << std::endl;
+#endif 
+   }
+
+   // Set the point
+   ossimGpt ptG(pt);
+   thePtG = ptG;
+    
+   // Define the local frame centered on the point
+   ossimLsrSpace enu(ptG);
+   theLocalFrame = enu;
+   
+   // Set the model parameters
+   theRpcModel = rpc;
+   
+   // Compute the target elevation & azimuth angles
+   double elevAngleLOS;
+   double azimAngleLOS;
+   computeElevAzim(rpc, elevAngleLOS, azimAngleLOS);
+   
+   // Form the covariance matrix
+   if (constructMatrix
+      (errBiasLOS, errRandLOS, elevAngleLOS, azimAngleLOS, surfN, surfCovMat))
+   {
+      // Compute evaluation parameters
+      theEvaluatorValid = decomposeMatrix();
+   }
+   else
+   {
+      theEvaluatorValid = false;
+   }
+}
+
+
+//*****************************************************************************
+//  DESTRUCTOR: ~ossimPositionQualityEvaluator()
+//  
+//*****************************************************************************
+ossimPositionQualityEvaluator::~ossimPositionQualityEvaluator()
+{
+   if (traceExec())  ossimNotify(ossimNotifyLevel_DEBUG)
+      << "DEBUG: ~ossimPositionQualityEvaluator(): entering..." << std::endl;
+   if (traceExec())  ossimNotify(ossimNotifyLevel_DEBUG)
+      << "DEBUG: ~ossimPositionQualityEvaluator(): returning..." << std::endl;
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::print()
+//  
+//  Print info.
+//  
+//*****************************************************************************
+std::ostream& ossimPositionQualityEvaluator::
+print(std::ostream& out) const
+{
+   out << "\nPositionQualityEvaluator Summary..."<<std::endl;
+   out << " theEvaluatorValid: ";
+   if (theEvaluatorValid)
+      out<<"True"<<std::endl;
+   else
+      out<<"False"<<std::endl;
+   out << " thePtG: "<<thePtG<<std::endl;
+   out << " theCovMat [m]:\n"<<theCovMat;
+   out << fixed << setprecision(1);
+   out << " theEllipse: "<<theEllipse.theSemiMajorAxis<<"  "
+                         <<theEllipse.theSemiMinorAxis
+                         <<" [m, 1 sigma] at ";
+   out << theEllipse.theAzimAngle*DEG_PER_RAD<<" [deg] azimuth"<<endl;
+
+   return out;
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::getCovMatrix()
+//  
+//  Access the covariance matrix.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::getCovMatrix(NEWMAT::Matrix& covMat) const
+{
+   if (theEvaluatorValid)
+   {
+      covMat = theCovMat;
+   }
+
+   return theEvaluatorValid;
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::addContributingCovariance()
+//  
+//  Sum in a contributing covariance matrix.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+addContributingCovariance(NEWMAT::Matrix& covMat)
+{
+   bool matrixOK = (covMat.Nrows()==3) && (covMat.Nrows()==3);
+   if (theEvaluatorValid && matrixOK)
+   {
+      // Add contribution
+      theCovMat += covMat;
+   
+      // Update the ellipse parameters
+      theEvaluatorValid = decomposeMatrix();
+   }
+
+   return (theEvaluatorValid && matrixOK);
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::addContributingCE_LE()
+//  
+//  Sum in a contributing CE/LE.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+addContributingCE_LE(const ossim_float64& cCE, const ossim_float64& cLE)
+{
+   NEWMAT::Matrix covMat(3,3);
+   
+   formCovMatrixFromCE_LE(cCE, cLE, covMat);
+
+   return addContributingCovariance(covMat);
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::subtractContributingCovariance()
+//  
+//  Subtract out a contributing covariance matrix.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+subtractContributingCovariance(NEWMAT::Matrix& covMat)
+{
+   bool matrixOK = (covMat.Nrows()==3) && (covMat.Nrows()==3);
+   if (theEvaluatorValid && matrixOK)
+   {
+      // Subtract contribution
+      theCovMat -= covMat;
+   
+      // Update the ellipse parameters
+      theEvaluatorValid = decomposeMatrix();
+   }
+
+   return (theEvaluatorValid && matrixOK);
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::subtractContributingCE_LE()
+//  
+//  Subtract out a contributing CE/LE.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+subtractContributingCE_LE(const ossim_float64& cCE, const ossim_float64& cLE)
+{
+   NEWMAT::Matrix covMat(3,3);
+   
+   formCovMatrixFromCE_LE(cCE, cLE, covMat);
+
+   return subtractContributingCovariance(covMat);
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::computeCE_LE()
+//  
+//  Compute CE/LE (ft) @ pLev probability level.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+computeCE_LE(const pqeProbLev_t pLev, ossim_float64& CE, ossim_float64& LE) const
+{
+   if (theEvaluatorValid)
+   {
+      // Compute 1D LE
+      LE = sqrt(theCovMat(3,3)) * (ossim_float64)Fac1D[pLev];
+
+      // Compute 2D CE
+      CE = (ossim_float64)Fac2D90[pLev] * compute90PCE();
+   }
+   
+   return theEvaluatorValid;
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::extractErrorEllipse()
+//  
+//  Extract error ellipse parameters @ pLev probability level.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+extractErrorEllipse(const pqeProbLev_t pLev, pqeErrorEllipse& ellipse)
+{
+   if (theEvaluatorValid)
+   {
+      // Scale the axes
+      ellipse.theSemiMinorAxis =
+         (ossim_float64)Fac2D[pLev] * theEllipse.theSemiMinorAxis;
+      ellipse.theSemiMajorAxis =
+         (ossim_float64)Fac2D[pLev] * theEllipse.theSemiMajorAxis;
+      
+      // Orientation angle
+      ellipse.theAzimAngle = theEllipse.theAzimAngle;
+      
+      // Center position
+      ellipse.theCenter = thePtG;
+   }
+
+   return theEvaluatorValid;
+}
+
+
+//*****************************************************************************
+//  METHOD: ossimPositionQualityEvaluator::extractErrorEllipse()
+//  
+//  Extract error ellipse parameters @ pLev probability level.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+extractErrorEllipse(const pqeProbLev_t     pLev,
+                    const ossim_float64&   angularIncrement,
+                          pqeErrorEllipse& ellipse,
+                          pqeImageErrorEllipse_t& ellImage)
+{
+   bool computeImageEllipse = true;
+   
+   if (theRpcModel.theType == 'N')
+      computeImageEllipse = false;
+      
+   if (theEvaluatorValid && computeImageEllipse)
+   {
+      // Get object space ellipse parameters
+      extractErrorEllipse(pLev, ellipse);
+      
+      //***
+      // Generate the image space ellipse point at 'angularIncrement' spacing
+      //***
+      int numSteps = 360/(int)angularIncrement;
+
+      // Semi-axes components
+      double dxMaj = ellipse.theSemiMajorAxis*sin(ellipse.theAzimAngle);
+      double dyMaj = ellipse.theSemiMajorAxis*cos(ellipse.theAzimAngle);
+      double dxMin = ellipse.theSemiMinorAxis*sin(ellipse.theAzimAngle+M_PI/2.0);
+      double dyMin = ellipse.theSemiMinorAxis*cos(ellipse.theAzimAngle+M_PI/2.0);
+      
+      for (int j = 0; j<=numSteps; ++j)
+      {
+      
+         // Compute current ENU ellipse point
+         double ang = TWO_PI*j/numSteps;
+         double sang = sin(ang);
+         double cang = cos(ang);
+         double x = dxMaj*cang + dxMin*sang;
+         double y = dyMaj*cang + dyMin*sang;
+         double z = 0.0;
+         
+         ossimLsrPoint cpLSR(x, y, z, theLocalFrame);
+         ossimEcefPoint cp = ossimEcefPoint(cpLSR);
+         ossimGpt cpG(cp);
+         double lat = cpG.latd();
+         double lon = cpG.lond();
+         double hgt = cpG.height();
+      
+         // Normalize the lat, lon, hgt:
+         double nlat = (lat - theRpcModel.theLatOffset) /
+                        theRpcModel.theLatScale;
+         double nlon = (lon - theRpcModel.theLonOffset) /
+                        theRpcModel.theLonScale;
+         double nhgt;
+
+         if( ossim::isnan(hgt) )
+         {
+            nhgt = (theRpcModel.theHgtScale - theRpcModel.theHgtOffset) /
+                    theRpcModel.theHgtScale;
+         }
+         else
+         {
+            nhgt = (hgt - theRpcModel.theHgtOffset) / theRpcModel.theHgtScale;
+         }
+
+         //***
+         // Compute the normalized line (Un) and sample (Vn)
+         //***
+         double Pu = polynomial(nlat, nlon, nhgt, theRpcModel.theLineNumCoef);
+         double Qu = polynomial(nlat, nlon, nhgt, theRpcModel.theLineDenCoef);
+         double Pv = polynomial(nlat, nlon, nhgt, theRpcModel.theSampNumCoef);
+         double Qv = polynomial(nlat, nlon, nhgt, theRpcModel.theSampDenCoef);
+         double Un  = Pu / Qu;
+         double Vn  = Pv / Qv;
+
+         //***
+         // Compute the actual line (U) and sample (V):
+         //***
+         double U  = Un*theRpcModel.theLineScale + theRpcModel.theLineOffset;
+         double V  = Vn*theRpcModel.theSampScale + theRpcModel.theSampOffset;
+
+         ossimDpt img(V,U);
+         ellImage.push_back(img);
+      
+      }
+   }
+
+   return (theEvaluatorValid && computeImageEllipse);
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::decomposeMatrix()
+//  
+//  Perform eigenvector decomposition and extract ellipse parameters.
+//  Compute eigenvalues (D) of horizontal 2X2 sub-matrix
+//  Note: eigenvectors (columns of V) contain unit vectors
+//        defining orientation of pMin/pMax error ellipse axes
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::decomposeMatrix()
+{
+      // Decompose upper left 2X2 partition
+      NEWMAT::SymmetricMatrix S(2);
+      S<<theCovMat(1,1)<<theCovMat(1,2)<<theCovMat(2,2);
+      NEWMAT::DiagonalMatrix D;
+      NEWMAT::Matrix V;
+      NEWMAT::Jacobi(S,D,V);
+      theEllipse.theSemiMinorAxis = sqrt(D(1,1));
+      theEllipse.theSemiMajorAxis = sqrt(D(2,2));
+      theEigenvectors = V;
+
+      // Compute error ellipse orientation
+      //    (ccw rotation of major axis from x-axis)
+      ossim_float64 sin2theta = 2.0*theCovMat(1,2);
+      ossim_float64 cos2theta = theCovMat(1,1)-theCovMat(2,2);
+      if (cos2theta == 0.0)
+      {
+         return false;
+      }
+      else
+      {
+         // Convert "ccw from x-axis" to "cw from y-axis(N)"
+         double rotAngle = atan3(sin2theta, cos2theta)/2.0;
+         theEllipse.theAzimAngle = -(rotAngle - M_PI/2.0);
+         if (theEllipse.theAzimAngle < 0.0)
+            theEllipse.theAzimAngle += TWO_PI;
+      }
+
+      return true;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::constructMatrix()
+//  
+//  Construct covariance matrix from LOS-centered error components
+//  and target acxquistion geometry.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+constructMatrix(const ossim_float64&       errBiasLOS,
+                const ossim_float64&       errRandLOS,
+                const ossim_float64&       elevAngleLOS,
+                const ossim_float64&       azimAngleLOS,
+                const ossimColumnVector3d& surfN,
+                const NEWMAT::Matrix&      surfCovMat)
+{
+   bool constructOK = true;
+   ossimColumnVector3d lsrNorm(0.0,0.0,1.0);
+   
+   // Set the total error
+   ossim_float64 eTot = sqrt(errBiasLOS*errBiasLOS + errRandLOS*errRandLOS);
+   if (eTot == 0.0)
+      eTot = 0.001;
+   
+   // Set the LOS vector
+   double elC = elevAngleLOS;
+   double azC = azimAngleLOS;
+   ossimColumnVector3d  LOS(sin(azC)*cos(elC), cos(azC)*cos(elC), sin(elC));
+
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)<<"DEBUG: constructMatrix..."<<endl;
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         <<"  tEl,tAz: "<<elC*DEG_PER_RAD<<"  "<<azC*DEG_PER_RAD<<endl;
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         <<"  LOS:     "<<LOS<<endl;
+   }
+
+   
+   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   // Set ENU-referenced terrain slope normal
+   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   ossimColumnVector3d tSlopeN = surfN.unit();
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG) <<"   tSlopeN: "<<tSlopeN<<endl;
+   }
+   
+   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   // Compute normal to plane containing LOS and terrain normal
+   //   this is direction of minor axis
+   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   ossimColumnVector3d pMinU(0,1,0);
+   ossimColumnVector3d pMinAxis = LOS.cross(tSlopeN);
+   if (pMinAxis.magnitude() > DBL_EPSILON)
+   {
+      pMinU = pMinAxis.unit();
+   }
+   
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG) <<"   pMinU: "<<pMinU<<endl;
+   }
+   
+   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   // Compute major axis direction from cross product of
+   // minor axis vector and terrain slope normal
+   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   ossimColumnVector3d pMaxU = (tSlopeN.cross(pMinU)).unit();
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG) <<"   pMaxU: "<<pMaxU<<endl;
+   }
+   
+   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   // Compute angles related to terrain slope
+   //    [1] slope normal -> LOS
+   //    [2] LOS -> slope plane
+   //    [3] slope plane
+   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   // Compute angle between slope normal and LOS
+   ossimColumnVector3d  LOSh = LOS;
+   LOSh[2] = 0.0;
+   double tSlopeNormElev;
+   if (LOSh.magnitude() > DBL_EPSILON)
+   {
+      // Case 1: not nadir
+      tSlopeNormElev = acos(tSlopeN.dot(LOSh.unit()));
+   }
+   else
+   {
+      // Case 2: nadir, so use horizontal projection of tSlopeN instead
+      ossimColumnVector3d  tSlopeNh = tSlopeN;
+      tSlopeNh[2] = 0.0;
+      if (tSlopeNh.magnitude() > DBL_EPSILON)
+      {
+         // Case 3: nadir, not flat surface
+         tSlopeNormElev = acos(tSlopeN.dot(tSlopeNh.unit()));
+      }
+      else
+      {
+         // Case 4: nadir and flat surface
+         tSlopeNormElev = M_PI/2.0;
+      }
+   }
+   double tSlopeLOSAngleDelta = tSlopeNormElev - elC;
+
+   if (traceDebug())
+   {
+        ossimNotify(ossimNotifyLevel_DEBUG)
+         <<"   tSlopeNormElev:            "<<tSlopeNormElev*DEG_PER_RAD<<endl;
+      ossimNotify(ossimNotifyLevel_DEBUG)
+         <<"   tSlopeNorm - LOSAngle ang: "<<tSlopeLOSAngleDelta*DEG_PER_RAD<<endl;
+   }
+
+   // Compute elevation angle relative to terrain plane and check for positive
+   double elevAngTerr = M_PI/2.0 - tSlopeLOSAngleDelta;
+   
+   if (elevAngTerr > 0.0)
+   {
+
+      // Terrain slope angle
+      double tSlope = elevAngTerr - elC;
+
+      if (traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            <<"   terrain-referenced elev ang: "<<elevAngTerr*DEG_PER_RAD<<endl;
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            <<"   tSlope:  "<<tSlope*DEG_PER_RAD<<endl;
+      }
+
+      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+      // Project axes from terrain to horizontal  
+      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+      ossimColumnVector3d prjvc1 = vperp(pMaxU, lsrNorm);
+      ossimColumnVector3d prjvc2 = vperp(pMinU, lsrNorm);
+
+      double angMax = acos(prjvc1.unit().dot(pMaxU));
+      double angMin = acos(prjvc2.unit().dot(pMinU));
+      
+      if (traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            <<" angMax, angMin: "<<angMax*DEG_PER_RAD
+            <<" "<<angMin*DEG_PER_RAD<<endl;
+      }
+
+      prjvc1 = prjvc1 * eTot/sin(elevAngTerr) * cos(angMax);
+      prjvc2 = prjvc2 * eTot                  * cos(angMin);
+      double p1 = prjvc1.magnitude();
+      double p2 = prjvc2.magnitude();
+
+      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+      // Compute vertical component due to intersection geometry 
+      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+      double vComp = p1 * tan(tSlope);
+
+
+      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+      // Now compute the contributions of the surface uncertainty
+      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+      // Vertical & horizontal components from surface covariance matrix
+      double vSig=sqrt(surfCovMat(3,3));
+      double hSig=sqrt((surfCovMat(1,1)+surfCovMat(2,2))/2.0) * tan(tSlope);
+
+      // Effective total vertical error component includes
+      // horizontal uncertainty induced by local slope
+      double vSigTot = sqrt(vSig*vSig + hSig*hSig);
+
+      // Resolve total vertical error to components based on intersection geometry
+      double vSigH = 0.0;
+      double vSigV = 0.0;
+      if (cos(tSlopeLOSAngleDelta) != 0.0)
+      {
+         vSigH = vSigTot*cos(tSlope)*cos(elC) / cos(tSlopeLOSAngleDelta);
+         if (vSigH > 0.001)
+         {
+            vSigV = vSigH * tan(elC);
+         }
+         else
+         {
+            vSigV = vSigTot;
+         }
+      }
+      else
+      {
+         // Bad terrain geometry case
+         constructOK = false;
+      }
+
+      if (traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)<<"----------------------------"<<endl;
+         ossimNotify(ossimNotifyLevel_DEBUG)<<"     vSig: "<<vSig<<endl;
+         ossimNotify(ossimNotifyLevel_DEBUG)<<"     hSig: "<<hSig<<endl;
+         ossimNotify(ossimNotifyLevel_DEBUG)<<"  vSigTot: "<<vSigTot<<endl;
+         ossimNotify(ossimNotifyLevel_DEBUG)<<"    vSigH: "<<vSigH<<endl;
+         ossimNotify(ossimNotifyLevel_DEBUG)<<"    vSigV: "<<vSigV<<endl;
+         ossimNotify(ossimNotifyLevel_DEBUG)<<"----------------------------"<<endl;
+      }
+
+      if (constructOK)
+      {
+
+         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+         // Add vSigH contribution (vSigH in LOS plane)
+         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+         p1 = sqrt(p1*p1 + vSigH*vSigH);
+
+         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+         // Compute the axes magnitudes & rotation angle
+         //    These parameters represent the horizontal error
+         //    due to acquisition geometry & terrain slope
+         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+         double theta;
+         double pMax, pMin;
+         if (p1 > p2)
+         {
+            pMax = p1;
+            pMin = p2;
+            theta = atan3(prjvc1[1],prjvc1[0]);
+         }
+         else
+         {
+            pMax = p2;
+            pMin = p1;
+            theta = atan3(prjvc2[1],prjvc2[0]);
+         }
+
+         if (traceDebug())
+         {
+            ossimNotify(ossimNotifyLevel_DEBUG)
+               <<" p1,p2,pMax, pMin: "<<p1<<"  "<<p2<<"  "<<pMax<<"  "<<pMin<<endl;
+            ossimNotify(ossimNotifyLevel_DEBUG)
+               <<" prjvc1: "<<prjvc1<<"\n   unit: "<<prjvc1.unit()<<endl;
+            ossimNotify(ossimNotifyLevel_DEBUG)
+               <<" prjvc2: "<<prjvc2<<"\n   unit: "<<prjvc2.unit()<<endl;
+            ossimNotify(ossimNotifyLevel_DEBUG)<<"  theta: "<<theta*DEG_PER_RAD<<endl;
+         }
+
+         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+         // Form final covariance matrix from axes & rotation angle
+         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+         NEWMAT::Matrix Cov(2,2);
+         NEWMAT::Matrix Vcomp(2,2);
+         NEWMAT::DiagonalMatrix Dcomp(2);
+         
+         Dcomp(1,1) = pMax*pMax;
+         Dcomp(2,2) = pMin*pMin;
+         Vcomp(1,1) = cos(theta);
+         Vcomp(2,1) = sin(theta);
+         Vcomp(1,2) = Vcomp(2,1);
+         Vcomp(2,2) =-Vcomp(1,1);
+         Cov = Vcomp*Dcomp*Vcomp.t();
+
+         // Load full 3X3 matrix in local frame
+         NEWMAT::Matrix covMat(3,3);
+         covMat(1,1) = Cov(1,1);   
+         covMat(1,2) = Cov(1,2);   
+         covMat(1,3) = 0.0;   
+         covMat(2,1) = Cov(2,1);
+         covMat(2,2) = Cov(2,2);   
+         covMat(2,3) = 0.0;
+         covMat(3,1) = covMat(1,3);
+         covMat(3,2) = covMat(2,3);
+         covMat(3,3) = vComp*vComp + vSigV*vSigV;
+
+         // Save the matrix in local frame
+         theCovMat = covMat;
+
+      }
+      
+   }  //end if (elevAngTerr > 0.0)
+   else
+   {
+      constructOK = false;
+      ossimNotify(ossimNotifyLevel_WARN)
+         << "WARNING: ossimPositionQualityEvaluator::constructMatrix(): "
+         << "\n   terrain-referenced elev ang: "<<elevAngTerr*DEG_PER_RAD
+         << std::endl;
+   }
+      
+
+   return constructOK;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::formCovMatrixFromCE_LE()
+//  
+//  Form 3X3 ENU covariance matrix from CE/LE.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+formCovMatrixFromCE_LE(const ossim_float64&  CE,
+                       const ossim_float64&  LE,
+                             NEWMAT::Matrix& covMat) const
+{         
+   covMat = 0.0;
+   covMat(1,1) = CE/2.146;
+   covMat(2,2) = CE/2.146;
+   covMat(3,3) = LE/1.6449;
+   covMat(1,1) *= covMat(1,1);
+   covMat(2,2) *= covMat(2,2);
+   covMat(3,3) *= covMat(3,3);
+
+   return true;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::compute90PCE()
+//  
+//  Compute CE @ 90% probability level.
+//  
+//*****************************************************************************
+double ossimPositionQualityEvaluator::compute90PCE() const
+{         
+   // Evaluate CE function via linear interpolation
+   ossim_float64 pRatio = theEllipse.theSemiMinorAxis/
+                          theEllipse.theSemiMajorAxis;
+   ossim_uint32 ndx = int(floor(pRatio*nMultiplier));
+   ossim_float64 alpha;
+   if (ndx == nTableEntries)
+      alpha = table90[ndx];
+   else
+      alpha = (pRatio-float(ndx/nMultiplier))*
+              (table90[ndx+1]-table90[ndx])+table90[ndx];
+   
+   ossim_float64 CE90 = alpha * theEllipse.theSemiMajorAxis;
+   
+   return CE90;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::computeElevAzim()
+//  
+//  Compute elevation and azimuth angles from RPC coefficients.
+//  
+//*****************************************************************************
+bool ossimPositionQualityEvaluator::
+computeElevAzim(const pqeRPCModel     rpc,
+                      ossim_float64&  elevAngleLOS,
+                      ossim_float64&  azimAngleLOS) const
+{
+   //***
+   // Normalize the lat, lon, hgt:
+   //***
+   double nlat = (thePtG.lat - rpc.theLatOffset) / rpc.theLatScale;
+   double nlon = (thePtG.lon - rpc.theLonOffset) / rpc.theLonScale;
+   double nhgt;
+
+   if( ossim::isnan(thePtG.hgt) )
+   {
+      nhgt = (rpc.theHgtScale - rpc.theHgtOffset) / rpc.theHgtScale;
+   }
+   else
+   {
+      nhgt = (thePtG.hgt - rpc.theHgtOffset) / rpc.theHgtScale;
+   }
+   
+   //***
+   // Compute the numerators & denominators
+   //***
+   double Pu = polynomial(nlat, nlon, nhgt, rpc.theLineNumCoef);
+   double Qu = polynomial(nlat, nlon, nhgt, rpc.theLineDenCoef);
+   double Pv = polynomial(nlat, nlon, nhgt, rpc.theSampNumCoef);
+   double Qv = polynomial(nlat, nlon, nhgt, rpc.theSampDenCoef);
+
+   //***
+   // Compute the partials of each polynomial wrt lat, lon, hgt
+   //***
+   double dPu_dLat = dPoly_dLat(nlat, nlon, nhgt, rpc.theLineNumCoef);
+   double dQu_dLat = dPoly_dLat(nlat, nlon, nhgt, rpc.theLineDenCoef);
+   double dPv_dLat = dPoly_dLat(nlat, nlon, nhgt, rpc.theSampNumCoef);
+   double dQv_dLat = dPoly_dLat(nlat, nlon, nhgt, rpc.theSampDenCoef);
+   double dPu_dLon = dPoly_dLon(nlat, nlon, nhgt, rpc.theLineNumCoef);
+   double dQu_dLon = dPoly_dLon(nlat, nlon, nhgt, rpc.theLineDenCoef);
+   double dPv_dLon = dPoly_dLon(nlat, nlon, nhgt, rpc.theSampNumCoef);
+   double dQv_dLon = dPoly_dLon(nlat, nlon, nhgt, rpc.theSampDenCoef);
+   double dPu_dHgt = dPoly_dHgt(nlat, nlon, nhgt, rpc.theLineNumCoef);
+   double dQu_dHgt = dPoly_dHgt(nlat, nlon, nhgt, rpc.theLineDenCoef);
+   double dPv_dHgt = dPoly_dHgt(nlat, nlon, nhgt, rpc.theSampNumCoef);
+   double dQv_dHgt = dPoly_dHgt(nlat, nlon, nhgt, rpc.theSampDenCoef);
+
+   //***
+   // Compute partials of quotients U and V wrt lat, lon, hgt 
+   //***
+   double dU_dLat = (Qu*dPu_dLat - Pu*dQu_dLat)/(Qu*Qu);
+   double dU_dLon = (Qu*dPu_dLon - Pu*dQu_dLon)/(Qu*Qu);
+   double dU_dHgt = (Qu*dPu_dHgt - Pu*dQu_dHgt)/(Qu*Qu);
+   double dV_dLat = (Qv*dPv_dLat - Pv*dQv_dLat)/(Qv*Qv);
+   double dV_dLon = (Qv*dPv_dLon - Pv*dQv_dLon)/(Qv*Qv);
+   double dV_dHgt = (Qv*dPv_dHgt - Pv*dQv_dHgt)/(Qv*Qv);
+   
+    //***
+    // Apply necessary scale factors 
+    //***
+   dU_dLat *= rpc.theLineScale/rpc.theLatScale;
+   dU_dLon *= rpc.theLineScale/rpc.theLonScale;
+   dU_dHgt *= rpc.theLineScale/rpc.theHgtScale;
+   dV_dLat *= rpc.theSampScale/rpc.theLatScale;
+   dV_dLon *= rpc.theSampScale/rpc.theLonScale;
+   dV_dHgt *= rpc.theSampScale/rpc.theHgtScale;
+
+   dU_dLat *= DEG_PER_RAD;
+   dU_dLon *= DEG_PER_RAD;
+   dV_dLat *= DEG_PER_RAD;
+   dV_dLon *= DEG_PER_RAD;
+   
+   // Save the partials referenced to ECF
+   ossimEcefPoint location(thePtG);
+   NEWMAT::Matrix jMat(3,3);
+   thePtG.datum()->ellipsoid()->jacobianWrtEcef(location, jMat);
+   ossimDpt pWRTx;
+   ossimDpt pWRTy;
+   ossimDpt pWRTz;
+   //  Line
+   pWRTx.u = dU_dLat*jMat(1,1)+dU_dLon*jMat(2,1)+dU_dHgt*jMat(3,1);
+   pWRTy.u = dU_dLat*jMat(1,2)+dU_dLon*jMat(2,2)+dU_dHgt*jMat(3,2);
+   pWRTz.u = dU_dLat*jMat(1,3)+dU_dLon*jMat(2,3)+dU_dHgt*jMat(3,3);
+   //  Samp
+   pWRTx.v = dV_dLat*jMat(1,1)+dV_dLon*jMat(2,1)+dV_dHgt*jMat(3,1);
+   pWRTy.v = dV_dLat*jMat(1,2)+dV_dLon*jMat(2,2)+dV_dHgt*jMat(3,2);
+   pWRTz.v = dV_dLat*jMat(1,3)+dV_dLon*jMat(2,3)+dV_dHgt*jMat(3,3);
+
+   // Form required partials in local frame
+   NEWMAT::Matrix jECF(3,2);
+   jECF(1,1) = pWRTx.u;
+   jECF(1,2) = pWRTx.v;
+   jECF(2,1) = pWRTy.u;
+   jECF(2,2) = pWRTy.v;
+   jECF(3,1) = pWRTz.u;
+   jECF(3,2) = pWRTz.v;
+   NEWMAT::Matrix jLSR(3,2);
+   jLSR = theLocalFrame.ecefToLsrRotMatrix()*jECF;
+   double dU_dx = jLSR(1,1);
+   double dU_dy = jLSR(2,1);
+   double dU_dz = jLSR(3,1);
+   double dV_dx = jLSR(1,2);
+   double dV_dy = jLSR(2,2);
+   double dV_dz = jLSR(3,2);
+   
+   // Compute azimuth & elevation angles
+   double den = dU_dy*dV_dx - dV_dy*dU_dx;
+   double dY  = dU_dx*dV_dz - dV_dx*dU_dz;
+   double dX  = dV_dy*dU_dz - dU_dy*dV_dz;
+   double dy_dH = dY / den;
+   double dx_dH = dX / den;
+   
+   azimAngleLOS = atan2(dx_dH, dy_dH);
+   elevAngleLOS = atan2(1.0, sqrt(dy_dH*dy_dH+dx_dH*dx_dH));
+
+   if (traceDebug())
+   {
+      ossimNotify(ossimNotifyLevel_DEBUG)<<"DEBUG: computeElevAzim..."<<endl;
+      ossimNotify(ossimNotifyLevel_DEBUG)<<
+         " el,az = "<<elevAngleLOS*DEG_PER_RAD<<" "<<azimAngleLOS*DEG_PER_RAD<<endl;
+   }
+
+   return true;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::vperp()
+//  
+//  Perpendicular vector component.
+//  
+//*****************************************************************************
+ossimColumnVector3d ossimPositionQualityEvaluator::
+vperp(const ossimColumnVector3d& v1, const ossimColumnVector3d& v2) const
+{
+   
+   ossimColumnVector3d t = v1;
+   ossimColumnVector3d r = v2;
+   
+   double scale = v1.dot(v2)/v2.dot(v2);
+   ossimColumnVector3d v = v2*scale;
+   
+   ossimColumnVector3d p = v1 - v;
+   
+   return p;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::atan3()
+//
+//  arctan 0-360 counter-clockwise from x-axis
+//  
+//*****************************************************************************
+double ossimPositionQualityEvaluator::atan3(const double  y,
+                                            const double  x) const
+{
+   double u,v,pih=0.5*M_PI,result;
+
+   if (x == 0.0)
+      result = M_PI - pih * ossim::sgn(y);
+   else
+   {
+      if (y == 0.0)
+      {
+         if (x > 0.0)
+            result = 0.0;
+         else
+            result = M_PI;
+      }
+      else
+      {
+         u = y/x;
+         v = fabs(u);
+         result = atan(v);
+         result *= v/u;
+         if (x < 0.0)
+            result += M_PI;
+         else
+            if (result < 0.0)
+               result += TWO_PI;
+      }
+   }
+   
+   return result;
+
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::polynomial
+//  
+//  Evaluates polynomial function.
+//  
+//*****************************************************************************
+double ossimPositionQualityEvaluator::polynomial(
+   const double& P,
+   const double& L,
+   const double& H,
+   const double* c) const
+{
+   double r;
+
+   if (theRpcModel.theType == 'A')
+   {
+      r = c[ 0]       + c[ 1]*L     + c[ 2]*P     + c[ 3]*H     +
+          c[ 4]*L*P   + c[ 5]*L*H   + c[ 6]*P*H   + c[ 7]*L*P*H +
+          c[ 8]*L*L   + c[ 9]*P*P   + c[10]*H*H   + c[11]*L*L*L +
+          c[12]*L*L*P + c[13]*L*L*H + c[14]*L*P*P + c[15]*P*P*P +
+          c[16]*P*P*H + c[17]*L*H*H + c[18]*P*H*H + c[19]*H*H*H;
+   }
+   else
+   {
+      r = c[ 0]       + c[ 1]*L     + c[ 2]*P     + c[ 3]*H     +
+          c[ 4]*L*P   + c[ 5]*L*H   + c[ 6]*P*H   + c[ 7]*L*L   +
+          c[ 8]*P*P   + c[ 9]*H*H   + c[10]*L*P*H + c[11]*L*L*L +
+          c[12]*L*P*P + c[13]*L*H*H + c[14]*L*L*P + c[15]*P*P*P +
+          c[16]*P*H*H + c[17]*L*L*H + c[18]*P*P*H + c[19]*H*H*H;
+   }
+   
+   return r;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::dPoly_dLat
+//  
+//  Computes derivative of polynomial WRT normalized latitude P.
+//  
+//*****************************************************************************
+double ossimPositionQualityEvaluator::dPoly_dLat(
+   const double& P,
+   const double& L,
+   const double& H,
+   const double* c) const
+{
+   double dr;
+
+   if (theRpcModel.theType == 'A')
+   {
+      dr = c[2] + c[4]*L + c[6]*H + c[7]*L*H + 2*c[9]*P + c[12]*L*L +
+           2*c[14]*L*P + 3*c[15]*P*P +2*c[16]*P*H + c[18]*H*H;
+   }
+   else
+   {
+      dr = c[2] + c[4]*L + c[6]*H + 2*c[8]*P + c[10]*L*H + 2*c[12]*L*P +
+           c[14]*L*L + 3*c[15]*P*P + c[16]*H*H + 2*c[18]*P*H;
+   }
+   
+   return dr;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::dPoly_dLon
+//  
+//  Computes derivative of polynomial WRT normalized longitude L.
+//  
+//*****************************************************************************
+double ossimPositionQualityEvaluator::dPoly_dLon(
+   const double& P,
+   const double& L,
+   const double& H,
+   const double* c) const
+{
+   double dr;
+
+   if (theRpcModel.theType == 'A')
+   {
+      dr = c[1] + c[4]*P + c[5]*H + c[7]*P*H + 2*c[8]*L + 3*c[11]*L*L +
+           2*c[12]*L*P + 2*c[13]*L*H + c[14]*P*P + c[17]*H*H;
+   }
+   else
+   {
+      dr = c[1] + c[4]*P + c[5]*H + 2*c[7]*L + c[10]*P*H + 3*c[11]*L*L +
+           c[12]*P*P + c[13]*H*H + 2*c[14]*P*L + 2*c[17]*L*H;
+   }
+   return dr;
+}
+
+
+//*****************************************************************************
+//  PRIVATE METHOD: ossimPositionQualityEvaluator::dPoly_dHgt
+//  
+//  Computes derivative of polynomial WRT normalized height H.
+//  
+//*****************************************************************************
+double ossimPositionQualityEvaluator::dPoly_dHgt(
+   const double& P,
+   const double& L,
+   const double& H,
+   const double* c) const
+{
+   double dr;
+
+   if (theRpcModel.theType == 'A')
+   {
+      dr = c[3] + c[5]*L + c[6]*P + c[7]*L*P + 2*c[10]*H + c[13]*L*L +
+           c[16]*P*P + 2*c[17]*L*H + 2*c[18]*P*H + 3*c[19]*H*H;
+   }
+   else
+   {
+      dr = c[3] + c[5]*L + c[6]*P + 2*c[9]*H + c[10]*L*P + 2*c[13]*L*H +
+           2*c[16]*P*H + c[17]*L*L + c[18]*P*P + 3*c[19]*H*H;
+   }
+   return dr;
+}
diff --git a/Utilities/otbossim/src/ossim/projection/ossimStatePlaneProjectionInfo.inc b/Utilities/otbossim/src/ossim/projection/ossimStatePlaneProjectionInfo.inc
new file mode 100755
index 0000000000..80efac767f
--- /dev/null
+++ b/Utilities/otbossim/src/ossim/projection/ossimStatePlaneProjectionInfo.inc
@@ -0,0 +1,287 @@
+struct ossimStatePlanetProjectionInfoFormat1
+{
+   const char* name;
+   int         pcsCode;
+   const char* projCode;
+   const char* param1;
+   const char* param2;
+   const char* param3;
+   const char* param4;
+   double      falseEasting;
+   double      falseNorthing;
+   const char* units;
+};
+struct ossimStatePlanetProjectionInfoFormat2
+{
+   const char* name;
+   int         pcsCode;
+   const char* projCode;
+   const char* param1;
+   const char* param2;
+   double      param3;
+   double      param4;
+   double      falseEasting;
+   double      falseNorthing;
+   const char* units;
+};
+static ossimStatePlanetProjectionInfoFormat2 format2[] = {
+{"NAD27_Alabama_East",26729,"ossimTransMercatorProjection","30 30 n","85 50 w",25000,0,500000,0,"ft"},
+{"NAD27_Alabama_West",26730,"ossimTransMercatorProjection","30 n","87 30 w",15000,0,500000,0,"ft"},
+{"NAD27_Alaska_zone_2",26732,"ossimTransMercatorProjection","54 n","142 w",10000,0,500000,0,"ft"},
+{"NAD27_Alaska_zone_3",26733,"ossimTransMercatorProjection","54 n","146 w",10000,0,500000,0,"ft"},
+{"NAD27_Alaska_zone_4",26734,"ossimTransMercatorProjection","54 n","150 w",10000,0,500000,0,"ft"},
+{"NAD27_Alaska_zone_5",26735,"ossimTransMercatorProjection","54 n","154 w",10000,0,500000,0,"ft"},
+{"NAD27_Alaska_zone_6",26736,"ossimTransMercatorProjection","54 n","158 w",10000,0,500000,0,"ft"},
+{"NAD27_Alaska_zone_7",26737,"ossimTransMercatorProjection","54 n","162 w",10000,0,700000,0,"ft"},
+{"NAD27_Alaska_zone_8",26738,"ossimTransMercatorProjection","54 n","166 w",10000,0,500000,0,"ft"},
+{"NAD27_Alaska_zone_9",26739,"ossimTransMercatorProjection","54 n","170 w",10000,0,600000,0,"ft"},
+{"NAD27_Delaware",26757,"ossimTransMercatorProjection","38 n","75 25 w",200000,0,500000,0,"ft"},
+{"NAD27_Florida_East",26758,"ossimTransMercatorProjection","24 20 n","81 w",17000,0,500000,0,"ft"},
+{"NAD27_Florida_West",26759,"ossimTransMercatorProjection","24 20 n","82 w",17000,0,500000,0,"ft"},
+{"NAD27_Arizona_East",26748,"ossimTransMercatorProjection","31 n","110 10 w",10000,0,500000,0,"ft"},
+{"NAD27_Arizona_Central",26749,"ossimTransMercatorProjection","31 n","111 55 w",10000,0,500000,0,"ft"},
+{"NAD27_Arizona_West",26750,"ossimTransMercatorProjection","31 n","113 45 w",15000,0,500000,0,"ft"},
+{"NAD27_Hawaii_zone_1",26761,"ossimTransMercatorProjection","18 50 n","155 30 w",30000,0,500000,0,"ft"},
+{"NAD27_Hawaii_zone_2",26762,"ossimTransMercatorProjection","20 20 n","156 40 w",30000,0,500000,0,"ft"},
+{"NAD27_Hawaii_zone_3",26763,"ossimTransMercatorProjection","21 10 n","158 w",100000,0,500000,0,"ft"},
+{"NAD27_Hawaii_zone_4",26764,"ossimTransMercatorProjection","21 50 n","159 30 w",100000,0,500000,0,"ft"},
+{"NAD27_Hawaii_zone_5",26765,"ossimTransMercatorProjection","21 40 n","160 10 w",0,0,500000,0,"ft"},
+{"NAD27_Georgia_East",26766,"ossimTransMercatorProjection","30 n","82 10 w",10000,0,500000,0,"ft"},
+{"NAD27_Georgia_West",26767,"ossimTransMercatorProjection","30 n","84 10 w",10000,0,500000,0,"ft"},
+{"NAD27_Idaho_East",26768,"ossimTransMercatorProjection","41 40 n","112 10 w",19000,0,500000,0,"ft"},
+{"NAD27_Idaho_Central",26769,"ossimTransMercatorProjection","41 40 n","114 w",19000,0,500000,0,"ft"},
+{"NAD27_Idaho_West",26770,"ossimTransMercatorProjection","41 40 n","115 45 w",15000,0,500000,0,"ft"},
+{"NAD27_Illinois_East",26771,"ossimTransMercatorProjection","36 40 n","88 20 w",40000,0,500000,0,"ft"},
+{"NAD27_Illinois_West",26772,"ossimTransMercatorProjection","36 40 n","90 10 w",17000,0,500000,0,"ft"},
+{"NAD27_Indiana_East",26773,"ossimTransMercatorProjection","37 30 n","85 40 w",30000,0,500000,0,"ft"},
+{"NAD27_Indiana_West",26774,"ossimTransMercatorProjection","37 30 n","87 05 w",30000,0,500000,0,"ft"},
+{"NAD27_Maine_East",26783,"ossimTransMercatorProjection","43 50 n","68 30 w",10000,0,500000,0,"ft"},
+{"NAD27_Maine_West",26784,"ossimTransMercatorProjection","42 50 n","70 10 w",30000,0,500000,0,"ft"},
+{"NAD27_Mississippi_East",26794,"ossimTransMercatorProjection","29 40 n","88 50 w",25000,0,500000,0,"ft"},
+{"NAD27_Mississippi_West",26795,"ossimTransMercatorProjection","30 30 n","90 20 w",17000,0,500000,0,"ft"},
+{"NAD27_Missouri_East",26796,"ossimTransMercatorProjection","35 50 n","90 30 w",15000,0,500000,0,"ft"},
+{"NAD27_Missouri_Central",26797,"ossimTransMercatorProjection","35 50 n","92 30 w",15000,0,500000,0,"ft"},
+{"NAD27_Missouri_West",26798,"ossimTransMercatorProjection","36 10 n","94 30 w",17000,0,500000,0,"ft"},
+{"NAD_Michigan_Old_East",26801,"ossimTransMercatorProjection","41 30 n","83 40 w",17500,0,500000,0,"ft"},
+{"NAD_Michigan_Old_Centr",26802,"ossimTransMercatorProjection","41 30 n","85 45 w",11000,0,500000,0,"ft"},
+{"NAD_Michigan_Old_West",26803,"ossimTransMercatorProjection","41 30 n","88 45 w",11000,0,500000,0,"ft"},
+{"NAD27_Nevada_East",32007,"ossimTransMercatorProjection","34 45 n","115 35 w",10000,0,500000,0,"ft"},
+{"NAD27_Nevada_Central",32008,"ossimTransMercatorProjection","34 45 n","116 40 w",10000,0,500000,0,"ft"},
+{"NAD27_Nevada_West",32009,"ossimTransMercatorProjection","34 45 n","118 35 w",10000,0,500000,0,"ft"},
+{"NAD27_New_Hampshire",32010,"ossimTransMercatorProjection","42 30 n","71 40 w",30000,0,500000,0,"ft"},
+{"NAD27_New_Jersey",32011,"ossimTransMercatorProjection","38 50 n","74 40 w",40000,0,2000000,0,"ft"},
+{"NAD27_New_Mexico_East",32012,"ossimTransMercatorProjection","31 00 n","104 20 w",11000,0,500000,0,"ft"},
+{"NAD27_New_Mexico_Cent",32013,"ossimTransMercatorProjection","31 00 n","106 15 w",10000,0,500000,0,"ft"},
+{"NAD27_New_Mexico_West",32014,"ossimTransMercatorProjection","31 00 n","107 50 w",12000,0,500000,0,"ft"},
+{"NAD27_New_York_East",32015,"ossimTransMercatorProjection","40 00 n","74 20 w",30000,0,500000,0,"ft"},
+{"NAD27_New_York_Central",32016,"ossimTransMercatorProjection","40 00 n","76 35 w",16000,0,500000,0,"ft"},
+{"NAD27_New_York_West",32017,"ossimTransMercatorProjection","40 00 n","78 35 w",16000,0,500000,0,"ft"},
+{"NAD27_Rhode_Island",32030,"ossimTransMercatorProjection","41 05 n","71 30 w",160000,0,500000,0,"ft"},
+{"NAD27_Vermont",32045,"ossimTransMercatorProjection","42 30 n","72 30 w",28000,0,500000,0,"ft"},
+{"NAD27_Wyoming_East",32055,"ossimTransMercatorProjection","40 40 n","105 10 w",17000,0,500000,0,"ft"},
+{"NAD27_Wyoming_E_Cen",32056,"ossimTransMercatorProjection","40 40 n","107 20 w",17000,0,500000,0,"ft"},
+{"NAD27_Wyoming_W_Cen",32057,"ossimTransMercatorProjection","40 40 n","108 45 w",17000,0,500000,0,"ft"},
+{"NAD27_Wyoming_West",32058,"ossimTransMercatorProjection","40 40 n","110 05 w",17000,0,500000,0,"ft"},
+{"NAD83_Alabama_East",26929,"ossimTransMercatorProjection","30 30 n","85 50 w",25000,0,200000,0,"m"},
+{"NAD83_Alabama_West",26930,"ossimTransMercatorProjection","30 n","87 30 w",15000,0,600000,0,"m"},
+{"NAD83_Alaska_zone_2",26932,"ossimTransMercatorProjection","54 n","142 w",10000,0,500000,0,"m"},
+{"NAD83_Alaska_zone_3",26933,"ossimTransMercatorProjection","54 n","146 w",10000,0,500000,0,"m"},
+{"NAD83_Alaska_zone_4",26934,"ossimTransMercatorProjection","54 n","150 w",10000,0,500000,0,"m"},
+{"NAD83_Alaska_zone_5",26935,"ossimTransMercatorProjection","54 n","154 w",10000,0,500000,0,"m"},
+{"NAD83_Alaska_zone_6",26936,"ossimTransMercatorProjection","54 n","158 w",10000,0,500000,0,"m"},
+{"NAD83_Alaska_zone_7",26937,"ossimTransMercatorProjection","54 n","162 w",10000,0,500000,0,"m"},
+{"NAD83_Alaska_zone_8",26938,"ossimTransMercatorProjection","54 n","166 w",10000,0,500000,0,"m"},
+{"NAD83_Alaska_zone_9",26939,"ossimTransMercatorProjection","54 n","170 w",10000,0,500000,0,"m"},
+{"NAD83_Arizona_East",26948,"ossimTransMercatorProjection","31 n","110 10 w",10000,0,213360,0,"m"},
+{"NAD83_Arizona_Centr",26949,"ossimTransMercatorProjection","31 n","111 55 w",10000,0,213360,0,"m"},
+{"NAD83_Arizona_West",26950,"ossimTransMercatorProjection","31 n","113 45 w",15000,0,213360,0,"m"},
+{"NAD83_Delaware",26957,"ossimTransMercatorProjection","38 n","75 25 w",200000,0,200000,0,"m"},
+{"NAD83_Florida_East",26958,"ossimTransMercatorProjection","24 20 n","81 w",17000,0,200000,0,"m"},
+{"NAD83_Florida_West",26959,"ossimTransMercatorProjection","24 20 n","82 w",17000,0,200000,0,"m"},
+{"NAD83_Hawaii_zone_1",26961,"ossimTransMercatorProjection","18 50 n","155 30 w",30000,0,500000,0,"m"},
+{"NAD83_Hawaii_zone_2",26962,"ossimTransMercatorProjection","20 20 n","156 40 w",30000,0,500000,0,"m"},
+{"NAD83_Hawaii_zone_3",26963,"ossimTransMercatorProjection","21 10 n","158 w",100000,0,500000,0,"m"},
+{"NAD83_Hawaii_zone_4",26964,"ossimTransMercatorProjection","21 50 n","159 30 w",100000,0,500000,0,"m"},
+{"NAD83_Hawaii_zone_5",26965,"ossimTransMercatorProjection","21 40 n","160 10 w",0,0,500000,0,"m"},
+{"NAD83_Georgia_East",26966,"ossimTransMercatorProjection","30 n","82 10 w",10000,0,200000,0,"m"},
+{"NAD83_Georgia_West",26967,"ossimTransMercatorProjection","30 n","84 10 w",10000,0,700000,0,"m"},
+{"NAD83_Idaho_East",26968,"ossimTransMercatorProjection","41 40 n","112 10 w",19000,0,200000,0,"m"},
+{"NAD83_Idaho_Central",26969,"ossimTransMercatorProjection","41 40 n","114 w",19000,0,500000,0,"m"},
+{"NAD83_Idaho_West",26970,"ossimTransMercatorProjection","41 40 n","115 45 w",15000,0,800000,0,"m"},
+{"NAD83_Illinois_East",26971,"ossimTransMercatorProjection","36 40 n","88 20 w",40000,0,300000,0,"m"},
+{"NAD83_Illinois_West",26972,"ossimTransMercatorProjection","36 40 n","90 10 w",17000,0,700000,0,"m"},
+{"NAD83_Indiana_East",26973,"ossimTransMercatorProjection","37 30 n","85 40 w",30000,0,100000,250000,"m"},
+{"NAD83_Indiana_West",26974,"ossimTransMercatorProjection","37 30 n","87 05 w",30000,0,900000,250000,"m"},
+{"NAD83_Maine_East",26983,"ossimTransMercatorProjection","43 40 n","68 30 w",10000,0,300000,0,"m"},
+{"NAD83_Maine_West",26984,"ossimTransMercatorProjection","42 50 n","70 10 w",30000,0,900000,0,"m"},
+{"NAD83_Mississippi_East",26994,"ossimTransMercatorProjection","29 30 n","88 50 w",20000,0,300000,0,"m"},
+{"NAD83_Mississippi_West",26995,"ossimTransMercatorProjection","29 30 n","90 20 w",20000,0,700000,0,"m"},
+{"NAD83_Missouri_East",26996,"ossimTransMercatorProjection","35 50 n","90 30 w",15000,0,250000,0,"m"},
+{"NAD83_Missouri_Central",26997,"ossimTransMercatorProjection","35 50 n","92 30 w",15000,0,500000,0,"m"},
+{"NAD83_Missouri_West",26998,"ossimTransMercatorProjection","36 10 n","94 30 w",17000,0,850000,0,"m"},
+{"NAD83_Nevada_East",32107,"ossimTransMercatorProjection","34 45 n","115 35 w",10000,0,200000,8000000,"m"},
+{"NAD83_Nevada_Central",32108,"ossimTransMercatorProjection","34 45 n","116 40 w",10000,0,500000,6000000,"m"},
+{"NAD83_Nevada_West",32109,"ossimTransMercatorProjection","34 45 n","118 35 w",10000,0,800000,4000000,"m"},
+{"NAD83_New_Hampshire",32110,"ossimTransMercatorProjection","42 30 n","71 40 w",30000,0,300000,0,"m"},
+{"NAD83_New_Jersey",32111,"ossimTransMercatorProjection","38 50 n","74 30 w",10000,0,150000,0,"m"},
+{"NAD83_New_Mexico_East",32112,"ossimTransMercatorProjection","31 00 n","104 20 w",11000,0,165000,0,"m"},
+{"NAD83_New_Mexico_Cent",32113,"ossimTransMercatorProjection","31 00 n","106 15 w",10000,0,500000,0,"m"},
+{"NAD83_New_Mexico_West",32114,"ossimTransMercatorProjection","31 00 n","107 50 w",12000,0,830000,0,"m"},
+{"NAD83_New_York_East",32115,"ossimTransMercatorProjection","38 50 n","74 30 w",10000,0,150000,0,"m"},
+{"NAD83_New_York_Central",32116,"ossimTransMercatorProjection","40 00 n","76 35 w",16000,0,250000,0,"m"},
+{"NAD83_New_York_West",32117,"ossimTransMercatorProjection","40 00 n","78 35 w",16000,0,350000,0,"m"},
+{"NAD83_Rhode_Island",32130,"ossimTransMercatorProjection","41 05 n","71 30 w",160000,0,100000,0,"m"},
+{"NAD83_Vermont",32145,"ossimTransMercatorProjection","42 30 n","72 30 w",28000,0,500000,0,"m"},
+{"NAD83_Wyoming_East",32155,"ossimTransMercatorProjection","40 30 n","105 10 w",16000,0,200000,0,"m"},
+{"NAD83_Wyoming_E_Cen",32156,"ossimTransMercatorProjection","40 30 n","107 20 w",16000,0,400000,100000,"m"},
+{"NAD83_Wyoming_W_Cen",32157,"ossimTransMercatorProjection","40 30 n","108 45 w",16000,0,600000,0,"m"},
+{"NAD83_Wyoming_West",32158,"ossimTransMercatorProjection","40 30 n","110 05 w",16000,0,800000,100000,"m"},
+
+// this is here for a terminator please leave at the end
+{(char*)0,0,"","","",0,0,0,0,""}
+  
+};
+static ossimStatePlanetProjectionInfoFormat1 format1[] = {
+{"NAD27_Alaska_zone_10",26740,"ossimLambertConformalConicProjection","51 n","176 w","51 50 n","53 50 n",3000000,0,"ft"},
+{"NAD27_California_I",26741,"ossimLambertConformalConicProjection","39 20","122 w","40 n","41 40 n",2000000,0,"ft"},
+{"NAD27_California_II",26742,"ossimLambertConformalConicProjection","37 40","122 w","38 20","39 50",2000000,0,"ft"},
+{"NAD27_California_III",26743,"ossimLambertConformalConicProjection","36 30 n","120 30 w","37 04 n","38 26 n",2000000,0,"ft"},
+{"NAD27_California_IV",26744,"ossimLambertConformalConicProjection","35 20 n","119 w","36 n","37 15 n",2000000,0,"ft"},
+{"NAD27_California_V",26745,"ossimLambertConformalConicProjection","33 30 n","118 w","34 02 n","35 28 n",2000000,0,"ft"},
+{"NAD27_California_VI",26746,"ossimLambertConformalConicProjection","32 10","116 15 w","32 47 n","33 53 n",2000000,0,"ft"},
+{"NAD27_California_VII",26747,"ossimLambertConformalConicProjection","34 08 n","118 20 w","33 52 n","34 25 n",4186692.58,4160926.74,"ft"},
+{"NAD27_Arkansas_North",26751,"ossimLambertConformalConicProjection","34 20 n","92 w","34 56 n","36 14 n",2000000,0,"ft"},
+{"NAD27_Arkansas_South",26752,"ossimLambertConformalConicProjection","32 40 n","92 w","33 18 n","34 46 n",2000000,0,"ft"},
+{"NAD27_Colorado_North",26753,"ossimLambertConformalConicProjection","39 20 n","105 30 w","39 43 n","40 47 n",2000000,0,"ft"},
+{"NAD27_Colorado_Central",26754,"ossimLambertConformalConicProjection","37 50 n","105 30 w","38 27 n","39 45 n",2000000,0,"ft"},
+{"NAD27_Colorado_South",26755,"ossimLambertConformalConicProjection","36 40 n","105 30 w","37 14 n","38 26 n",2000000,0,"ft"},
+{"NAD27_Connecticut",26756,"ossimLambertConformalConicProjection","40 50 n","72 45 w","41 12 n","41 52 n",600000,0,"ft"},
+{"NAD27_Florida_North",26760,"ossimLambertConformalConicProjection","29 n","84 30 w","29 35 n","30 45 n",2000000,0,"ft"},
+{"NAD27_Iowa_North",26775,"ossimLambertConformalConicProjection","41 30 n","93 30 w","42 04 n","43 16 n",2000000,0,"ft"},
+{"NAD27_Iowa_South",26776,"ossimLambertConformalConicProjection","40 n","93 30 w","40 37 n","41 47 n",2000000,0,"ft"},
+{"NAD27_Kansas_North",26777,"ossimLambertConformalConicProjection","38 20 n","98 00 w","38 43 n","39 47 n",2000000,0,"ft"},
+{"NAD27_Kansas_South",26778,"ossimLambertConformalConicProjection","36 40 n","98 30 w","37 16 n","38 34 n",2000000,0,"ft"},
+{"NAD27_Kentucky_North",26779,"ossimLambertConformalConicProjection","37 30 n","84 15 w","37 58 n","38 58 n",2000000,0,"ft"},
+{"NAD27_Kentucky_South",26780,"ossimLambertConformalConicProjection","36 20 n","85 45 w","36 44 n","37 56 n",2000000,0,"ft"},
+{"NAD27_Louisiana_North",26781,"ossimLambertConformalConicProjection","30 40 n","92 30 w","31 10 n","32 40 n",2000000,0,"ft"},
+{"NAD27_Louisiana_South",26782,"ossimLambertConformalConicProjection","28 40 n","91 20 w","29 18 n","30 42 n",2000000,0,"ft"},
+{"NAD27_Maryland",26785,"ossimLambertConformalConicProjection","37 50 n","77 00 w","38 18 n","39 27 n",800000,0,"ft"},
+{"NAD27_Massachusetts",26786,"ossimLambertConformalConicProjection","41 00 n","71 30 w","41 43 n","42 41 n",600000,0,"ft"},
+{"NAD27_Massachusetts_Is",26787,"ossimLambertConformalConicProjection","41 00 n","70 30 w","41 17 n","41 29 n",200000,0,"ft"},
+{"NAD27_Michigan_North",26788,"ossimLambertConformalConicProjection","44 47 n","87 w","45 29 n","47 05 n",2000000,0,"ft"},
+{"NAD27_Michigan_Central",26789,"ossimLambertConformalConicProjection","43 19 n","84 20 w","44 11 n","45 42 n",2000000,0,"ft"},
+{"NAD27_Michigan_South",26790,"ossimLambertConformalConicProjection","41 30 n","84 20 w","42 06 n","43 40 n",2000000,0,"ft"},
+{"NAD27_Minnesota_North",26791,"ossimLambertConformalConicProjection","46 30 n","93 06 w","47 02 n","48 38 n",2000000,0,"ft"},
+{"NAD27_Minnesota_Cent",26792,"ossimLambertConformalConicProjection","45 00 n","94 15 w","45 37 n","47 03 n",2000000,0,"ft"},
+{"NAD27_Minnesota_South",26793,"ossimLambertConformalConicProjection","43 00 n","94 00 w","43 47 n","45 13 n",2000000,0,"ft"},
+{"NAD27_Montana_North",32001,"ossimLambertConformalConicProjection","47 00 n","109 30 w","47 51 n","48 43 n",2000000,0,"ft"},
+{"NAD27_Montana_Central",32002,"ossimLambertConformalConicProjection","45 50 n","109 30 w","46 27 n","47 53 n",2000000,0,"ft"},
+{"NAD27_Montana_South",32003,"ossimLambertConformalConicProjection","44 00 n","109 30 w","44 52 n","46 24 n",2000000,0,"ft"},
+{"NAD27_Nebraska_North",32005,"ossimLambertConformalConicProjection","41 20 n","100 00 w","41 51 n","42 49 n",2000000,0,"ft"},
+{"NAD27_Nebraska_South",32006,"ossimLambertConformalConicProjection","39 40 n","99 30 w","40 17 n","41 43 n",2000000,0,"ft"},
+{"NAD27_New_York_Long_Is",32018,"ossimLambertConformalConicProjection","40 30 n","74 w","40 40 n","41 02 n",2000000,100000,"ft"},
+{"NAD27_North_Carolina",32019,"ossimLambertConformalConicProjection","33 45 n","79 00 w","34 20 n","36 10 n",2000000,0,"ft"},
+{"NAD27_North_Dakota_N",32020,"ossimLambertConformalConicProjection","47 00 n","100 30 w","47 26 n","48 44 n",2000000,0,"ft"},
+{"NAD27_North_Dakota_S",32021,"ossimLambertConformalConicProjection","45 40 n","100 30 w","46 11 n","47 29 n",2000000,0,"ft"},
+{"NAD27_Ohio_North",32022,"ossimLambertConformalConicProjection","39 40 n","82 30 w","40 26 n","41 42 n",2000000,0,"ft"},
+{"NAD27_Ohio_South",32023,"ossimLambertConformalConicProjection","38 00 n","82 30 w","38 44 n","40 02 n",2000000,0,"ft"},
+{"NAD27_Oklahoma_North",32024,"ossimLambertConformalConicProjection","35 00 n","98 00 w","35 34 n","36 46 n",2000000,0,"ft"},
+{"NAD27_Oklahoma_South",32025,"ossimLambertConformalConicProjection","33 20 n","98 00 w","33 56 n","35 14 n",2000000,0,"ft"},
+{"NAD27_Oregon_North",32026,"ossimLambertConformalConicProjection","43 40 n","120 30 w","44 20 n","46 00 n",2000000,0,"ft"},
+{"NAD27_Oregon_South",32027,"ossimLambertConformalConicProjection","41 40 n","120 30 w","42 20 n","44 00 n",2000000,0,"ft"},
+{"NAD27_Pennsylvania_N",32028,"ossimLambertConformalConicProjection","40 10 n","77 45 w","40 53 n","41 57 n",2000000,0,"ft"},
+{"NAD27_Pennsylvania_S",32029,"ossimLambertConformalConicProjection","39 20 n","77 45 w","39 56 n","40 58 n",2000000,0,"ft"},
+{"NAD27_South_Carolina_N",32031,"ossimLambertConformalConicProjection","33 00 n","81 00 w","33 46 n","34 58 n",2000000,0,"ft"},
+{"NAD27_South_Carolina_S",32033,"ossimLambertConformalConicProjection","31 50 n","81 00 w","32 20 n","33 40 n",2000000,0,"ft"},
+{"NAD27_South_Dakota_N",32034,"ossimLambertConformalConicProjection","43 50 n","100 00 w","44 25 n","45 41 n",2000000,0,"ft"},
+{"NAD27_South_Dakota_S",32035,"ossimLambertConformalConicProjection","42 20 n","100 20 w","42 50 n","44 24 n",2000000,0,"ft"},
+{"NAD27_Tennessee",32036,"ossimLambertConformalConicProjection","34 40 n","86 00 w","35 15 n","36 25 n",2000000,100000,"ft"},
+{"NAD27_Texas_North",32037,"ossimLambertConformalConicProjection","34 00 n","101 30 w","34 39 n","36 11 n",2000000,0,"ft"},
+{"NAD27_Texas_North_Cen",32038,"ossimLambertConformalConicProjection","31 40 n","97 30 w","32 08 n","33 58 n",2000000,0,"ft"},
+{"NAD27_Texas_Central",32039,"ossimLambertConformalConicProjection","29 40 n","100 20 w","30 07 n","31 53 n",2000000,0,"ft"},
+{"NAD27_Texas_South_Cen",32040,"ossimLambertConformalConicProjection","27 50 n","99 00 w","28 23 n","30 17 n",2000000,0,"ft"},
+{"NAD27_Texas_South",32041,"ossimLambertConformalConicProjection","25 40 n","98 30 w","26 10 n","27 50 n",2000000,0,"ft"},
+{"NAD27_Utah_North",32042,"ossimLambertConformalConicProjection","40 20 n","111 30 w","40 43 n","41 47 n",2000000,0,"ft"},
+{"NAD27_Utah_Central",32043,"ossimLambertConformalConicProjection","38 20 n","111 30 w","39 01 n","40 39 n",2000000,0,"ft"},
+{"NAD27_Utah_South",32044,"ossimLambertConformalConicProjection","36 40 n","111 30 w","37 13 n","38 21 n",2000000,0,"ft"},
+{"NAD27_Virginia_North",32046,"ossimLambertConformalConicProjection","37 40 n","78 30 w","38 02 n","39 12 n",2000000,0,"ft"},
+{"NAD27_Virginia_South",32047,"ossimLambertConformalConicProjection","36 20 n","78 30 w","36 46 n","37 58 n",2000000,0,"ft"},
+{"NAD27_Washington_North",32048,"ossimLambertConformalConicProjection","47 00 n","120 50 w","47 30 n","48 44 n",2000000,0,"ft"},
+{"NAD27_Washington_South",32049,"ossimLambertConformalConicProjection","45 20 n","120 30 w","45 50 n","47 20 n",2000000,0,"ft"},
+{"NAD27_West_Virginia_N",32050,"ossimLambertConformalConicProjection","38 30 n","79 30 w","39 00 n","40 15 n",2000000,0,"ft"},
+{"NAD27_West_Virginia_S",32051,"ossimLambertConformalConicProjection","37 00 n","81 00 w","37 29 n","38 53 n",2000000,0,"ft"},
+{"NAD27_Wisconsin_North",32052,"ossimLambertConformalConicProjection","45 10 n","90 00 w","45 34 n","46 46 n",2000000,0,"ft"},
+{"NAD27_Wisconsin_Cen",32053,"ossimLambertConformalConicProjection","43 50 n","90 00 w","44 15 n","45 30 n",2000000,0,"ft"},
+{"NAD27_Wisconsin_South",32054,"ossimLambertConformalConicProjection","42 00 n","90 00 w","42 44 n","44 04 n",2000000,0,"ft"},
+{"NAD27_Puerto_Rico",32059,"ossimLambertConformalConicProjection","17 50 n","66 26 w","18 02 n","18 26 n",500000,0,"ft"},
+{"NAD27_St_Croix",32060,"ossimLambertConformalConicProjection","17 50 n","66 26 w","18 02 n","18 26 n",500000,100000,"ft"},
+{"NAD83_Alaska_zone_10",26940,"ossimLambertConformalConicProjection","51 n","176 w","51 50 n","53 50 n",1000000,0,"m"},
+{"NAD83_California_1",26941,"ossimLambertConformalConicProjection","39 20 n","122 w","40 n","41 40 n",2000000,500000,"m"},
+{"NAD83_California_2",26942,"ossimLambertConformalConicProjection","37 40 n","122 w","38 20 n","39 50 n",2000000,500000,"m"},
+{"NAD83_California_3",26943,"ossimLambertConformalConicProjection","36 30 n","120 30 w","37 04 n","38 26 n",2000000,500000,"m"},
+{"NAD83_California_4",26944,"ossimLambertConformalConicProjection","35 20 n","119 w","36 n","37 15 n",2000000,500000,"m"},
+{"NAD83_California_5",26945,"ossimLambertConformalConicProjection","33 30 n","118 w","34 02 n","35 28 n",2000000,500000,"m"},
+{"NAD83_California_6",26946,"ossimLambertConformalConicProjection","32 10","116 15 w","32 47 n","33 53 n",2000000,500000,"m"},
+{"NAD83_Arkansas_North",26951,"ossimLambertConformalConicProjection","34 20 n","92 w","34 56 n","36 14 n",400000,0,"m"},
+{"NAD83_Arkansas_South",26952,"ossimLambertConformalConicProjection","32 40 n","92 w","33 18 n","34 46 n",400000,400000,"m"},
+{"NAD83_Colorado_North",26953,"ossimLambertConformalConicProjection","39 20 n","105 30 w","39 43 n","40 47 n",914401.8289,304800.6096,"m"},
+{"NAD83_Colorado_Centr",26954,"ossimLambertConformalConicProjection","37 50 n","105 30 w","38 27 n","39 45 n",914401.8289,304800.6096,"m"},
+{"NAD83_Colorado_South",26955,"ossimLambertConformalConicProjection","36 40 n","105 30 w","37 14 n","38 26 n",914401.8289,304800.6096,"m"},
+{"NAD83_Connecticut",26956,"ossimLambertConformalConicProjection","40 50 n","72 45 w","41 12 n","41 52 n",304800.6096,152400.3048,"m"},
+{"NAD83_Florida_North",26960,"ossimLambertConformalConicProjection","29 n","84 30 w","29 35 n","30 45 n",600000,0,"m"},
+{"NAD83_Iowa_North",26975,"ossimLambertConformalConicProjection","41 30 n","93 30 w","42 04 n","43 16 n",1500000,1000000,"m"},
+{"NAD83_Iowa_South",26976,"ossimLambertConformalConicProjection","40 n","93 30 w","40 37 n","41 47 n",500000,0,"m"},
+{"NAD83_Kansas_North",26977,"ossimLambertConformalConicProjection","38 20 n","98 00 w","38 43 n","39 47 n",400000,0,"m"},
+{"NAD83_Kansas_South",26978,"ossimLambertConformalConicProjection","36 40 n","98 30 w","37 16 n","38 34 n",400000,400000,"m"},
+{"NAD83_Kentucky_North",26979,"ossimLambertConformalConicProjection","37 30 n","84 15 w","37 58 n","38 58 n",500000,0,"m"},
+{"NAD83_Kentucky_South",26980,"ossimLambertConformalConicProjection","36 20 n","85 45 w","36 44 n","37 56 n",500000,500000,"m"},
+{"NAD83_Louisiana_North",26981,"ossimLambertConformalConicProjection","30 30 n","92 30 w","31 10 n","32 40 n",1000000,0,"m"},
+{"NAD83_Louisiana_South",26982,"ossimLambertConformalConicProjection","28 30 n","91 20 w","29 18 n","30 42 n",1000000,0,"m"},
+{"NAD83_Maryland",26985,"ossimLambertConformalConicProjection","37 40 n","77 00 w","38 18 n","39 27 n",400000,0,"m"},
+{"NAD83_Massachusetts",26986,"ossimLambertConformalConicProjection","41 00 n","71 30 w","41 43 n","42 41 n",200000,750000,"m"},
+{"NAD83_Massachusetts_Is",26987,"ossimLambertConformalConicProjection","41 00 n","70 30 w","41 17 n","41 29 n",500000,0,"m"},
+{"NAD83_Michigan_North",26988,"ossimLambertConformalConicProjection","44 47 n","87 w","45 29 n","47 05 n",8000000,0,"m"},
+{"NAD83_Michigan_Central",26989,"ossimLambertConformalConicProjection","43 19 n","84 22 w","44 11 n","45 42 n",6000000,0,"m"},
+{"NAD83_Michigan_South",26990,"ossimLambertConformalConicProjection","41 30 n","84 22 w","42 06 n","43 40 n",4000000,0,"m"},
+{"NAD83_Minnesota_North",26991,"ossimLambertConformalConicProjection","46 30 n","93 06 w","47 02 n","48 38 n",800000,100000,"m"},
+{"NAD83_Minnesota_Cent",26992,"ossimLambertConformalConicProjection","45 00 n","94 15 w","45 37 n","47 03 n",800000,100000,"m"},
+{"NAD83_Minnesota_South",26993,"ossimLambertConformalConicProjection","43 00 n","94 00 w","43 47 n","45 13 n",800000,100000,"m"},
+{"NAD83_Montana",32100,"ossimLambertConformalConicProjection","44 15 n","109 30 w","45 00 n","49 00 n",600000,0,"m"},
+{"NAD83_Nebraska",32104,"ossimLambertConformalConicProjection","39 50 n","100 00 w","40 00 n","43 00 n",500000,0,"m"},
+{"NAD83_New_York_Long_Is",32118,"ossimLambertConformalConicProjection","40 10 n","74 w","40 40 n","41 02 n",300000,0,"m"},
+{"NAD83_North_Carolina",32119,"ossimLambertConformalConicProjection","33 45 n","79 00 w","34 20 n","36 10 n",609601.22,0,"m"},
+{"NAD83_North_Dakota_N",32120,"ossimLambertConformalConicProjection","47 00 n","100 30 w","47 26 n","48 44 n",600000,0,"m"},
+{"NAD83_North_Dakota_S",32121,"ossimLambertConformalConicProjection","45 40 n","100 30 w","46 11 n","47 29 n",600000,0,"m"},
+{"NAD83_Ohio_North",32122,"ossimLambertConformalConicProjection","39 40 n","82 30 w","40 26 n","41 42 n",600000,0,"m"},
+{"NAD83_Ohio_South",32123,"ossimLambertConformalConicProjection","38 00 n","82 30 w","38 44 n","40 02 n",600000,0,"m"},
+{"NAD83_Oklahoma_North",32124,"ossimLambertConformalConicProjection","35 00 n","98 00 w","35 34 n","36 46 n",600000,0,"m"},
+{"NAD83_Oklahoma_South",32125,"ossimLambertConformalConicProjection","33 20 n","98 00 w","33 56 n","35 14 n",600000,0,"m"},
+{"NAD83_Oregon_North",32126,"ossimLambertConformalConicProjection","43 40 n","120 30 w","44 20 n","46 00 n",2500000,0,"m"},
+{"NAD83_Oregon_South",32127,"ossimLambertConformalConicProjection","41 40 n","120 30 w","42 20 n","44 00 n",1500000,0,"m"},
+{"NAD83_Pennsylvania_N",32128,"ossimLambertConformalConicProjection","40 10 n","77 45 w","40 53 n","41 57 n",600000,0,"m"},
+{"NAD83_Pennsylvania_S",32129,"ossimLambertConformalConicProjection","39 20 n","77 45 w","39 56 n","40 58 n",600000,0,"m"},
+{"NAD83_South_Carolina",32133,"ossimLambertConformalConicProjection","31 50 n","81 00 w","32 30 n","34 50 n",609600,0,"m"},
+{"NAD83_South_Dakota_N",32134,"ossimLambertConformalConicProjection","43 50 n","100 00 w","44 25 n","45 41 n",600000,0,"m"},
+{"NAD83_South_Dakota_S",32135,"ossimLambertConformalConicProjection","42 20 n","100 20 w","42 50 n","44 24 n",600000,0,"m"},
+{"NAD83_Tennessee",32136,"ossimLambertConformalConicProjection","34 20 n","86 00 w","35 15 n","36 25 n",600000,0,"m"},
+{"NAD83_Texas_North",32137,"ossimLambertConformalConicProjection","34 00 n","101 30 w","34 39 n","36 11 n",200000,1000000,"m"},
+{"NAD83_Texas_North_Cen",32138,"ossimLambertConformalConicProjection","31 40 n","98 30 w","32 08 n","33 58 n",600000,2000000,"m"},
+{"NAD83_Texas_Central",32139,"ossimLambertConformalConicProjection","29 40 n","100 20 w","30 07 n","31 53 n",700000,3000000,"m"},
+{"NAD83_Texas_South_Cen",32140,"ossimLambertConformalConicProjection","27 50 n","99 00 w","28 23 n","30 17 n",600000,4000000,"m"},
+{"NAD83_Texas_South",32141,"ossimLambertConformalConicProjection","25 40 n","98 30 w","26 10 n","27 50 n",300000,5000000,"m"},
+{"NAD83_Utah_North",32142,"ossimLambertConformalConicProjection","40 20 n","111 30 w","40 43 n","41 47 n",500000,1000000,"m"},
+{"NAD83_Utah_Central",32143,"ossimLambertConformalConicProjection","38 20 n","111 30 w","39 01 n","40 39 n",500000,2000000,"m"},
+{"NAD83_Utah_South",32144,"ossimLambertConformalConicProjection","36 40 n","111 30 w","37 13 n","38 21 n",500000,3000000,"m"},
+{"NAD83_Virginia_North",32146,"ossimLambertConformalConicProjection","37 40 n","78 30 w","38 02 n","39 12 n",3500000,2000000,"m"},
+{"NAD83_Virginia_South",32147,"ossimLambertConformalConicProjection","36 20 n","78 30 w","36 46 n","37 58 n",3500000,1000000,"m"},
+{"NAD83_Washington_North",32148,"ossimLambertConformalConicProjection","47 00 n","120 50 w","47 30 n","48 44 n",500000,0,"m"},
+{"NAD83_Washington_South",32149,"ossimLambertConformalConicProjection","45 20 n","120 30 w","45 50 n","47 20 n",500000,0,"m"},
+{"NAD83_West_Virginia_N",32150,"ossimLambertConformalConicProjection","38 30 n","79 30 w","39 00 n","40 15 n",600000,0,"m"},
+{"NAD83_West_Virginia_S",32151,"ossimLambertConformalConicProjection","37 00 n","81 00 w","37 29 n","38 53 n",600000,0,"m"},
+{"NAD83_Wisconsin_North",32152,"ossimLambertConformalConicProjection","45 10 n","90 00 w","45 34 n","46 46 n",600000,0,"m"},
+{"NAD83_Wisconsin_Cen",32153,"ossimLambertConformalConicProjection","43 50 n","90 00 w","44 15 n","45 30 n",600000,0,"m"},
+{"NAD83_Wisconsin_South",32154,"ossimLambertConformalConicProjection","42 00 n","90 00 w","42 44 n","44 04 n",600000,0,"m"},
+{"NAD83_Puerto_Rico",32161,"ossimLambertConformalConicProjection","17 50 n","66 26 w","18 02 n","18 26 n",200000,200000,"m"},
+// this is here for a terminator please leave at the end
+{(char*)0,0,"","","","","",0,0,""}
+};
-- 
GitLab