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