00001 #include <TePDIPrincipalComponents.hpp>
00002 #include <TePDIParameters.hpp>
00003 #include <TeAgnostic.h>
00004 #include <TePDIUtils.hpp>
00005
00006 #include <TeRaster.h>
00007
00008 #include <TeProgress.h>
00009 #include <TeStdIOProgress.h>
00010
00011 #include <TePDIExamplesBase.hpp>
00012
00013 void pca_test()
00014 {
00015
00016
00017 TePDIPrincipalComponents::TePDIPCAType analysis_type =
00018 TePDIPrincipalComponents::TePDIPCADirect;
00019
00020 TePDIParameters params_direct;
00021
00022 TePDITypes::TePDIRasterPtrType inRaster1( new TeRaster(
00023 std::string( TEPDIEXAMPLESRESPATH "cbers_rgb342_crop1.tif" ),
00024 'r') );
00025 TEAGN_TRUE_OR_THROW(inRaster1->init(),
00026 "Unable to init inRaster1");
00027
00028 TePDITypes::TePDIRasterPtrType inRaster2( new TeRaster(
00029 std::string( TEPDIEXAMPLESRESPATH "cbers_rgb342_crop1.tif" ),
00030 'r') );
00031 TEAGN_TRUE_OR_THROW(inRaster2->init(),
00032 "Unable to init inRaster2");
00033
00034 TePDITypes::TePDIRasterPtrType inRaster3(new TeRaster(
00035 std::string( TEPDIEXAMPLESRESPATH "cbers_rgb342_crop1.tif" ),
00036 'r') );
00037 TEAGN_TRUE_OR_THROW(inRaster3->init(), "Unable to init inRaster3");
00038
00039 TePDITypes::TePDIRasterVectorType input_rasters;
00040 input_rasters.push_back(inRaster1);
00041 input_rasters.push_back(inRaster2);
00042 input_rasters.push_back(inRaster3);
00043
00044 std::vector<int> bands_direct;
00045 bands_direct.push_back(0);
00046 bands_direct.push_back(1);
00047 bands_direct.push_back(2);
00048
00049 TePDITypes::TePDIRasterPtrType outRaster1_direct;
00050 TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(
00051 outRaster1_direct, 1, 1, 1, false, TeDOUBLE, 0),
00052 "RAM Raster 1 Alloc error");
00053
00054 TePDITypes::TePDIRasterPtrType outRaster2_direct;
00055 TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(
00056 outRaster2_direct, 1, 1, 1, false, TeDOUBLE, 0),
00057 "RAM Raster 2 Alloc error");
00058
00059 TePDITypes::TePDIRasterPtrType outRaster3_direct;
00060 TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(
00061 outRaster3_direct, 1, 1, 1, false, TeDOUBLE, 0 ),
00062 "RAM Raster 3 Alloc error");
00063
00064 TePDITypes::TePDIRasterVectorType output_rasters_direct;
00065 output_rasters_direct.push_back(outRaster1_direct);
00066 output_rasters_direct.push_back(outRaster2_direct);
00067 output_rasters_direct.push_back(outRaster3_direct);
00068
00069 TeSharedPtr<TeMatrix> covariance_matrix(new TeMatrix);
00070
00071 params_direct.SetParameter("analysis_type", analysis_type);
00072 params_direct.SetParameter("input_rasters", input_rasters);
00073 params_direct.SetParameter("bands", bands_direct);
00074 params_direct.SetParameter("output_rasters", output_rasters_direct);
00075 params_direct.SetParameter("covariance_matrix", covariance_matrix);
00076
00077 TePDIPrincipalComponents pc_direct;
00078 TEAGN_TRUE_OR_THROW(pc_direct.Reset(params_direct), "Invalid Parameters");
00079 TEAGN_TRUE_OR_THROW(pc_direct.Apply(), "Apply error");
00080
00081 TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(
00082 output_rasters_direct[0],
00083 TEPDIEXAMPLESBINPATH "TePDIPrincipalComponents_pca0.tif" ),
00084 "GeoTIFF0 generation error");
00085 TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(
00086 output_rasters_direct[1],
00087 TEPDIEXAMPLESBINPATH "TePDIPrincipalComponents_pca1.tif" ),
00088 "GeoTIFF1 generation error");
00089 TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(
00090 output_rasters_direct[2],
00091 TEPDIEXAMPLESBINPATH "TePDIPrincipalComponents_pca2.tif" ),
00092 "GeoTIFF2 generation error");
00093
00094
00095
00096 analysis_type = TePDIPrincipalComponents::TePDIPCAInverse;
00097
00098 TePDIParameters params_inverse;
00099
00100 std::vector< int > bands_inverse;
00101 bands_inverse.push_back(0);
00102 bands_inverse.push_back(0);
00103 bands_inverse.push_back(0);
00104
00105 TePDITypes::TePDIRasterPtrType outRaster1_inverse;
00106 TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(
00107 outRaster1_inverse, 1, 1, 1, false, TeUNSIGNEDCHAR, 0 ),
00108 "RAM Raster 1 Alloc error");
00109
00110 TePDITypes::TePDIRasterPtrType outRaster2_inverse;
00111 TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(
00112 outRaster2_inverse, 1, 1, 1, false, TeUNSIGNEDCHAR, 0 ),
00113 "RAM Raster 2 Alloc error");
00114
00115 TePDITypes::TePDIRasterPtrType outRaster3_inverse;
00116 TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(
00117 outRaster3_inverse, 1, 1, 1, false, TeUNSIGNEDCHAR, 0 ),
00118 "RAM Raster 3 Alloc error");
00119
00120 TePDITypes::TePDIRasterVectorType output_rasters_inverse;
00121 output_rasters_inverse.push_back(outRaster1_inverse);
00122 output_rasters_inverse.push_back(outRaster2_inverse);
00123 output_rasters_inverse.push_back(outRaster3_inverse);
00124
00125 params_inverse.SetParameter("analysis_type", analysis_type);
00126 params_inverse.SetParameter("input_rasters",
00127 output_rasters_direct);
00128 params_inverse.SetParameter("bands", bands_inverse);
00129 params_inverse.SetParameter("output_rasters",
00130 output_rasters_inverse);
00131 params_inverse.SetParameter("covariance_matrix",
00132 covariance_matrix);
00133
00134 TePDIPrincipalComponents pc_inverse;
00135 TEAGN_TRUE_OR_THROW(pc_inverse.Reset(params_inverse),
00136 "Invalid Parameters");
00137 TEAGN_TRUE_OR_THROW(pc_inverse.Apply(), "Apply error");
00138
00139 TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(
00140 output_rasters_inverse[0],
00141 TEPDIEXAMPLESBINPATH "TePDIPrincipalComponents_band0.tif"),
00142 "GeoTIFF0 generation error");
00143 TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(
00144 output_rasters_inverse[1],
00145 TEPDIEXAMPLESBINPATH "TePDIPrincipalComponents_band1.tif"),
00146 "GeoTIFF1 generation error");
00147 TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(
00148 output_rasters_inverse[2],
00149 TEPDIEXAMPLESBINPATH "TePDIPrincipalComponents_band2.tif"),
00150 "GeoTIFF2 generation error");
00151 }
00152
00153 int main()
00154 {
00155 TEAGN_LOGMSG( "Test started." );
00156
00157 TEAGN_DEBUG_MODE_CHECK;
00158
00159 try{
00160 TeStdIOProgress pi;
00161 TeProgress::setProgressInterf( dynamic_cast< TeProgressBase* >( &pi ) );
00162
00163 pca_test();
00164 }
00165 catch( const TeException& e ){
00166 TEAGN_LOGERR( "Test Failed - " + e.message() );
00167 return EXIT_FAILURE;
00168 }
00169
00170 TEAGN_LOGMSG( "Test OK." );
00171 return EXIT_SUCCESS;
00172 }