diff --git a/Applications/Utils/otbVectorDataExtractROIApplication.cxx b/Applications/Utils/otbVectorDataExtractROIApplication.cxx index 4e96983edcf57a9a3af37dbe778863f475261976..27e0d8adb76a4f3c7c57e2c324d61bdb2b6ed0f1 100644 --- a/Applications/Utils/otbVectorDataExtractROIApplication.cxx +++ b/Applications/Utils/otbVectorDataExtractROIApplication.cxx @@ -15,156 +15,175 @@ PURPOSE. See the above copyright notices for more information. =========================================================================*/ -#include "otbVectorDataExtractROIApplication.h" +#include "otbWrapperApplication.h" +#include "otbWrapperApplicationFactory.h" -#include <iostream> -#include "otbCommandLineArgumentParser.h" - -//Image -#include "otbImage.h" -#include "otbImageFileReader.h" - -//VectorData -#include "otbVectorData.h" #include "otbVectorDataExtractROI.h" #include "otbVectorDataProjectionFilter.h" -#include "otbVectorDataFileReader.h" -#include "otbVectorDataFileWriter.h" #include "otbVectorDataProperties.h" //Misc #include "otbRemoteSensingRegion.h" -#include "otbStandardWriterWatcher.h" + +#include <iostream> namespace otb { - -int VectorDataExtractROIApplication::Describe(ApplicationDescriptor* descriptor) +namespace Wrapper { - descriptor->SetName("VectorDataExtractROIApplication"); - descriptor->SetDescription("Perform an extract ROI on the input vector data according to the input image extent"); - descriptor->AddOption("InputVData", "The input vector data", - "in", 1, true, ApplicationDescriptor::FileName); - descriptor->AddOption("InputImage", "The support image", - "img", 1, true, ApplicationDescriptor::InputImage); - descriptor->AddOption("DEMPath", "The DEM directory", - "dem", 1, false, ApplicationDescriptor::DirectoryName); - descriptor->AddOption("OutputVData", "The output vector data", - "out", 1, true, ApplicationDescriptor::FileName); - - return EXIT_SUCCESS; -} -int VectorDataExtractROIApplication::Execute(otb::ApplicationOptionsResult* parseResult) +class VectorDataExtractROIApplication : public Application { +public: + /** Standard class typedefs. */ + typedef VectorDataExtractROIApplication Self; + typedef Application Superclass; + typedef itk::SmartPointer<Self> Pointer; + typedef itk::SmartPointer<const Self> ConstPointer; + + /** Standard macro */ + itkNewMacro(Self); + + itkTypeMacro(VectorDataExtractROIApplication, otb::Application); + + /** Filters typedef */ // Images - typedef unsigned char PixelType; - typedef otb::Image<PixelType, 2> ImageType; - typedef ImageType::PointType PointType; - typedef ImageType::IndexType IndexType; - typedef ImageType::SizeType SizeType; - typedef ImageType::SpacingType SpacingType; - typedef otb::ImageFileReader<ImageType> ImageReaderType; - // VectorData - typedef otb::VectorData<> VectorDataType; + typedef FloatVectorImageType::PointType PointType; + typedef FloatVectorImageType::IndexType IndexType; + typedef FloatVectorImageType::SizeType SizeType; + typedef FloatVectorImageType::SpacingType SpacingType; - typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType; - typedef otb::VectorDataFileWriter<VectorDataType> VectorDataWriterType; typedef VectorDataProjectionFilter< - VectorDataType, VectorDataType> VectorDataProjectionFilterType; + VectorDataType, VectorDataType> VectorDataProjectionFilterType; typedef VectorDataExtractROI<VectorDataType> VectorDataExtractROIType; // Misc typedef otb::RemoteSensingRegion<double> RemoteSensingRegionType; - // Reading the VectorData - std::string vdFilename = parseResult->GetParameterString("InputVData"); - VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New(); - vdReader->SetFileName(vdFilename); - vdReader->Update(); - - // Reading the Image - std::string imgFilename = parseResult->GetParameterString("InputImage"); - ImageReaderType::Pointer imgReader = ImageReaderType::New(); - imgReader->SetFileName(imgFilename); - imgReader->UpdateOutputInformation(); +private: + VectorDataExtractROIApplication() + { + SetName("VectorDataExtractROIApplication"); + SetDescription("Perform an extract ROI on the input vector data according to the input image extent"); + + SetDocName("VectorData Extract ROI Application"); + SetDocLongDescription("This application extract the VectorData features belonging to a region specified by the support image envelope"); + SetDocLimitations("None"); + SetDocAuthors("OTB-Team"); + SetDocSeeAlso(" "); + SetDocCLExample("otbApplicationLauncherCommandLine VectorDataExtractROI ${OTB-BIN}/bin" + " --vd ${OTB-DATA}/Input/franceCoastline.shp --in ${OTB-DATA}/Input/ --out franceCoastline_extract.shp"); + AddDocTag("VectorData Manipulation"); + } + + virtual ~VectorDataExtractROIApplication() + { + } + + void DoCreateParameters() + { + AddParameter(ParameterType_Group,"io","Input and output data"); + AddParameter(ParameterType_InputVectorData, "io.vd", "Input Vector data"); + AddParameter(ParameterType_InputImage, "io.in", "Support image"); + AddParameter(ParameterType_OutputVectorData,"io.out","Output Vector data"); + + AddParameter(ParameterType_Group,"elev","Elevation management"); + SetParameterDescription("elev","This group of parameters allows to manage elevation values in the VectorData projection process"); + + AddParameter(ParameterType_Directory, "elev.dem", "DEM directory"); + std::ostringstream oss; + oss << "This parameter allows to select a directory containing "; + oss << "Digital Elevation Model tiles. Supported formats are SRTM, DTED "; + oss << "or any geotiff processed by the DEM import application"; + SetParameterDescription("elev.dem", oss.str()); + MandatoryOff("elev.dem"); + } + + void DoUpdateParameters() + { + // Nothing to do here for the parameters : all are independent + } + + void DoExecute() + { + // Get the inputs + VectorDataType* vd = GetParameterVectorData("io.vd"); + FloatVectorImageType* inImage = GetParameterImage("io.in"); - // Extracting the VectorData - VectorDataExtractROIType::Pointer vdExtract = VectorDataExtractROIType::New(); - vdExtract->SetInput(vdReader->GetOutput()); + // Extracting the VectorData + m_VdExtract = VectorDataExtractROIType::New(); + m_VdExtract->SetInput(vd); - // Find the geographic region of interest - // Get the index of the corner of the image - IndexType ul, ur, ll, lr; - PointType pul, pur, pll, plr; - ul = imgReader->GetOutput()->GetLargestPossibleRegion().GetIndex(); - ur = ul; - ll = ul; - lr = ul; - ur[0] += imgReader->GetOutput()->GetLargestPossibleRegion().GetSize()[0]; - lr[0] += imgReader->GetOutput()->GetLargestPossibleRegion().GetSize()[0]; - lr[1] += imgReader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]; - ll[1] += imgReader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]; - - // Transform to physical point - imgReader->GetOutput()->TransformIndexToPhysicalPoint(ul, pul); - imgReader->GetOutput()->TransformIndexToPhysicalPoint(ur, pur); - imgReader->GetOutput()->TransformIndexToPhysicalPoint(ll, pll); - imgReader->GetOutput()->TransformIndexToPhysicalPoint(lr, plr); - - // Get DEM directory - std::string demPath; - if(parseResult->IsOptionPresent("DEMPath")) - { - demPath = parseResult->GetParameterString("DEMPath"); - } - - // Build the cartographic region - RemoteSensingRegionType rsRegion; - RemoteSensingRegionType::IndexType rsOrigin; - RemoteSensingRegionType::SizeType rsSize; - rsOrigin[0] = std::min(pul[0], plr[0]); - rsOrigin[1] = std::min(pul[1], plr[1]); - rsSize[0] = vcl_abs(pul[0] - plr[0]); - rsSize[1] = vcl_abs(pul[1] - plr[1]); + // Find the geographic region of interest + // Get the index of the corner of the image + IndexType ul, ur, ll, lr; + PointType pul, pur, pll, plr; + ul = inImage->GetLargestPossibleRegion().GetIndex(); + ur = ul; + ll = ul; + lr = ul; + ur[0] += inImage->GetLargestPossibleRegion().GetSize()[0]; + lr[0] += inImage->GetLargestPossibleRegion().GetSize()[0]; + lr[1] += inImage->GetLargestPossibleRegion().GetSize()[1]; + ll[1] += inImage->GetLargestPossibleRegion().GetSize()[1]; + + // Transform to physical point + inImage->TransformIndexToPhysicalPoint(ul, pul); + inImage->TransformIndexToPhysicalPoint(ur, pur); + inImage->TransformIndexToPhysicalPoint(ll, pll); + inImage->TransformIndexToPhysicalPoint(lr, plr); + + // Build the cartographic region + RemoteSensingRegionType rsRegion; + RemoteSensingRegionType::IndexType rsOrigin; + RemoteSensingRegionType::SizeType rsSize; + rsOrigin[0] = std::min(pul[0], plr[0]); + rsOrigin[1] = std::min(pul[1], plr[1]); + rsSize[0] = vcl_abs(pul[0] - plr[0]); + rsSize[1] = vcl_abs(pul[1] - plr[1]); - rsRegion.SetOrigin(rsOrigin); - rsRegion.SetSize(rsSize); - rsRegion.SetRegionProjection(imgReader->GetOutput()->GetProjectionRef()); - rsRegion.SetKeywordList(imgReader->GetOutput()->GetImageKeywordlist()); - - // Set the cartographic region to the extract roi filter - vdExtract->SetRegion(rsRegion); - if(parseResult->IsOptionPresent("DEMPath")) - { - vdExtract->SetDEMDirectory(demPath); - } - - // Reprojecting the VectorData - vdReader->GetOutput()->GetProjectionRef(); - VectorDataProjectionFilterType::Pointer vdProj = VectorDataProjectionFilterType::New(); - vdProj->SetInput(vdExtract->GetOutput()); - vdProj->SetInputProjectionRef(vdReader->GetOutput()->GetProjectionRef()); - vdProj->SetOutputKeywordList(imgReader->GetOutput()->GetImageKeywordlist()); - vdProj->SetOutputProjectionRef(imgReader->GetOutput()->GetProjectionRef()); - vdProj->SetOutputOrigin(imgReader->GetOutput()->GetOrigin()); - vdProj->SetOutputSpacing(imgReader->GetOutput()->GetSpacing()); - if(parseResult->IsOptionPresent("DEMPath")) - { - vdProj->SetDEMDirectory(demPath); - } - - // Instantiate the writer - std::string outFilename = parseResult->GetParameterString("OutputVData"); + rsRegion.SetOrigin(rsOrigin); + rsRegion.SetSize(rsSize); + rsRegion.SetRegionProjection(inImage->GetProjectionRef()); + rsRegion.SetKeywordList(inImage->GetImageKeywordlist()); + + // Set the cartographic region to the extract roi filter + m_VdExtract->SetRegion(rsRegion); + + // Reprojecting the VectorData + m_VdProj = VectorDataProjectionFilterType::New(); + m_VdProj->SetInput(m_VdExtract->GetOutput()); + m_VdProj->SetInputProjectionRef(inImage->GetProjectionRef()); + m_VdProj->SetOutputKeywordList(inImage->GetImageKeywordlist()); + m_VdProj->SetOutputProjectionRef(inImage->GetProjectionRef()); + m_VdProj->SetOutputOrigin(inImage->GetOrigin()); + m_VdProj->SetOutputSpacing(inImage->GetSpacing()); + + // Set the DEM directory if used + if (IsParameterEnabled("elev.dem") && HasValue("elev.dem")) + { + m_VdExtract->SetDEMDirectory(GetParameterString("elev.dem")); + m_VdProj->SetDEMDirectory(GetParameterString("elev.dem")); + } + else + { + if ( otb::ConfigurationFile::GetInstance()->IsValid() ) + { + m_VdExtract->SetDEMDirectory(otb::ConfigurationFile::GetInstance()->GetDEMDirectory()); + m_VdProj->SetDEMDirectory(otb::ConfigurationFile::GetInstance()->GetDEMDirectory()); + } + } + + // Set the output vectorData + SetParameterOutputVectorData("io.out", m_VdProj->GetOutput()); + } - VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New(); - vdWriter->SetFileName(outFilename); - vdWriter->SetInput(vdExtract->GetOutput()); - vdWriter->Update(); + VectorDataExtractROIType::Pointer m_VdExtract; + VectorDataProjectionFilterType::Pointer m_VdProj; +}; - return EXIT_SUCCESS; } - } +OTB_APPLICATION_EXPORT(otb::Wrapper::VectorDataExtractROIApplication)