From b0e0a6e18897dd1099feb24d100b2177a15d7721 Mon Sep 17 00:00:00 2001 From: Otmane Lahlou <otmane.lahlou@c-s.fr> Date: Fri, 3 Dec 2010 17:10:29 +0100 Subject: [PATCH] ENH : Move Projections out of Legacy and wrap otbBundleToSensorModel --- Projections/otbConvertCartoToGeoPoint.cxx | 257 ++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 Projections/otbConvertCartoToGeoPoint.cxx diff --git a/Projections/otbConvertCartoToGeoPoint.cxx b/Projections/otbConvertCartoToGeoPoint.cxx new file mode 100644 index 0000000000..1f3638f669 --- /dev/null +++ b/Projections/otbConvertCartoToGeoPoint.cxx @@ -0,0 +1,257 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE, See the above copyright notices for more information. + +=========================================================================*/ + + +#if defined(_MSC_VER) +#pragma warning ( disable : 4786 ) +#endif + +#include <iostream> +#include <iomanip> + +#include "otbCommandLineArgumentParser.h" +#include "otbImageFileReader.h" +#include "otbMapProjections.h" +#include "otbImage.h" +#include "otbMacro.h" + +#include "itkExceptionObject.h" +#include "itkMacro.h" + +#include "init/ossimInit.h" + + +template<typename TMapProjection> +int generic_main_carto_geo(TMapProjection* mapProjection, otb::CommandLineArgumentParseResult* parseResult) +{ + + try + { + + typedef TMapProjection MapProjectionType; + + typename MapProjectionType::InputPointType cartoPoint; + typename MapProjectionType::OutputPointType geoPoint; + + cartoPoint[0]=parseResult->GetParameterDouble("--XCarto"); + cartoPoint[1]=parseResult->GetParameterDouble("--YCarto"); + + geoPoint = mapProjection->TransformPoint(cartoPoint); + + if (!parseResult->IsOptionPresent("--OTBTesting")) + { + std::cout << std::setprecision(10) << "Cartographic Point (x , y) : (" << cartoPoint[0] << ", " << cartoPoint[1] << ")" << std::endl; + std::cout << std::setprecision(10) << "Geographic Point (Lat,Lon) : (" << geoPoint[1] << ", " << geoPoint[0] << ")" << std::endl; + } + else + { + std::string outputTestFileName = parseResult->GetParameterString("--OTBTesting",0); + + ofstream outputTestFile; + outputTestFile.open(outputTestFileName.c_str()); + + outputTestFile << std::setprecision(10) << "Cartographic Point (x , y) : (" << cartoPoint[0] << "," << cartoPoint[1] << ")" << std::endl; + outputTestFile << std::setprecision(10) << "Geographic Point (Lat,Lon) : (" << geoPoint[1] << "," << geoPoint[0] << ")" << std::endl; + + outputTestFile.close(); + } + + + } + catch ( itk::ExceptionObject & err ) + { + std::cout << "Exception itk::ExceptionObject raised !" << std::endl; + std::cout << err << std::endl; + return EXIT_FAILURE; + } + catch ( std::bad_alloc & err ) + { + std::cout << "Exception bad_alloc : "<<(char*)err.what()<< std::endl; + return EXIT_FAILURE; + } + catch ( ... ) + { + std::cout << "Unknown exception raised !" << std::endl; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; + +}//End main() + + + + +int main(int argc, char* argv[]) +{ + try + { + ossimInit::instance()->initialize(argc, argv); + + // Parse command line parameters + typedef otb::CommandLineArgumentParser ParserType; + ParserType::Pointer parser = ParserType::New(); + + parser->SetProgramDescription("Cartographic to geographic coordinates conversion"); + parser->AddOption("--XCarto","X cartographic value of desired point","-x"); + parser->AddOption("--YCarto","Y cartographic value of desired point","-y"); + parser->AddOptionNParams("--MapProjectionType","Type (UTM/LAMBERT/LAMBERT2/LAMBERT93/SINUS/ECKERT4/TRANSMERCATOR/MOLLWEID/SVY21) and parameters of map projection used","-mapProj"); + + typedef otb::CommandLineArgumentParseResult ParserResultType; + ParserResultType::Pointer parseResult = ParserResultType::New(); + + try + { + parser->ParseCommandLine(argc,argv,parseResult); + } + catch ( itk::ExceptionObject & err ) + { + std::string descriptionException = err.GetDescription(); + if (descriptionException.find("ParseCommandLine(): Help Parser") != std::string::npos) + { + std::cout << "WARNING : output file pixels are converted in 'unsigned char'" << std::endl; + return EXIT_SUCCESS; + } + if (descriptionException.find("ParseCommandLine(): Version Parser") != std::string::npos) + { + return EXIT_SUCCESS; + } + return EXIT_FAILURE; + } + + // Code + + std::string typeMap = parseResult->GetParameterString("--MapProjectionType",0); + int nbParams = parseResult->GetNumberOfParameters("--MapProjectionType"); + nbParams--; + + if ((typeMap == "UTM")&&(nbParams==2)) + { + int numZone = parseResult->GetParameterUInt("--MapProjectionType",1); + char hemisphere = parseResult->GetParameterChar("--MapProjectionType",2); + + typedef otb::UtmInverseProjection UtmProjectionType; + UtmProjectionType::Pointer utmProjection = UtmProjectionType::New(); + + utmProjection->SetZone(numZone); + utmProjection->SetHemisphere(hemisphere); + + return generic_main_carto_geo<UtmProjectionType>(utmProjection, parseResult); + } + else + { + std::vector<double> parameters ; + + for (int i=1; i<nbParams+1; i++) + { + parameters.push_back(parseResult->GetParameterDouble("--MapProjectionType",i)); + } + + if ((typeMap == "LAMBERT")&&(nbParams==4)) + { + typedef otb::LambertConformalConicInverseProjection LambertProjectionType; + LambertProjectionType::Pointer lambertProjection = LambertProjectionType::New(); + + lambertProjection->SetParameters(parameters[0],parameters[1],parameters[2],parameters[3]); + + return generic_main_carto_geo<LambertProjectionType>(lambertProjection, parseResult); + } + else if ((typeMap == "LAMBERT2")&&(nbParams==0)) + { + typedef otb::Lambert2EtenduInverseProjection Lambert2ProjectionType; + Lambert2ProjectionType::Pointer lambert2Projection = Lambert2ProjectionType::New(); + + return generic_main_carto_geo<Lambert2ProjectionType>(lambert2Projection, parseResult); + } + else if ((typeMap == "LAMBERT93")&&(nbParams==0)) + { + typedef otb::Lambert93InverseProjection Lambert93ProjectionType; + Lambert93ProjectionType::Pointer lambert93Projection = Lambert93ProjectionType::New(); + + return generic_main_carto_geo<Lambert93ProjectionType>(lambert93Projection, parseResult); + } + else if ((typeMap == "SINUS")&&(nbParams==2)) + { + typedef otb::SinusoidalInverseProjection SinusoidalProjectionType; + SinusoidalProjectionType::Pointer sinusoidalProjection = SinusoidalProjectionType::New(); + + sinusoidalProjection->SetParameters(parameters[0],parameters[1]); + + return generic_main_carto_geo<SinusoidalProjectionType>(sinusoidalProjection, parseResult); + } + else if ((typeMap == "ECKERT4")&&(nbParams==2)) + { + typedef otb::Eckert4InverseProjection Eckert4ProjectionType; + Eckert4ProjectionType::Pointer eckert4Projection = Eckert4ProjectionType::New(); + + eckert4Projection->SetParameters(parameters[0],parameters[1]); + + return generic_main_carto_geo<Eckert4ProjectionType>(eckert4Projection, parseResult); + } + else if ((typeMap == "TRANSMERCATOR")&&(nbParams==3)) + { + typedef otb::TransMercatorInverseProjection TransMercatorProjectionType; + TransMercatorProjectionType::Pointer transMercatorProjection = TransMercatorProjectionType::New(); + + transMercatorProjection->SetParameters(parameters[0],parameters[1],parameters[2]); + + return generic_main_carto_geo<TransMercatorProjectionType>(transMercatorProjection, parseResult); + } + else if ((typeMap == "MOLLWEID")&&(nbParams==2)) + { + typedef otb::MollweidInverseProjection MollweidProjectionType; + MollweidProjectionType::Pointer mollweidProjection = MollweidProjectionType::New(); + + mollweidProjection->SetParameters(parameters[0],parameters[1]); + + return generic_main_carto_geo<MollweidProjectionType>(mollweidProjection, parseResult); + } + else if ((typeMap == "SVY21")&&(nbParams==0)) + { + typedef otb::SVY21InverseProjection SVY21ProjectionType; + SVY21ProjectionType::Pointer svy21Projection = SVY21ProjectionType::New(); + + return generic_main_carto_geo<SVY21ProjectionType>(svy21Projection, parseResult); + } + else + { + itkGenericExceptionMacro(<< "TypeMap not recognized, choose one with (parameters) : UTM(2), LAMBERT(4), LAMBERT2(0), LAMBERT2(93), SINUS(2), ECKERT4(2), TRANSMERCATOR(3), MOLLWEID(2), SVY21(0)"); + } + + } + + + } + catch ( itk::ExceptionObject & err ) + { + std::cout << "Exception itk::ExceptionObject raised !" << std::endl; + std::cout << err << std::endl; + return EXIT_FAILURE; + } + catch ( std::bad_alloc & err ) + { + std::cout << "Exception bad_alloc : "<<(char*)err.what()<< std::endl; + return EXIT_FAILURE; + } + catch ( ... ) + { + std::cout << "Unknown exception raised !" << std::endl; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + -- GitLab