From b12d840b3cd335356ec1ac260d4055710dbbf8ce Mon Sep 17 00:00:00 2001 From: remi cresson <remi.cresson@teledetection.fr> Date: Fri, 11 Aug 2017 14:15:10 +0000 Subject: [PATCH] ENH: remove otb::VectorDataProperties and use OGR for this. Now extent can be computed over multiPolygon --- app/otbExtractGeom.cxx | 54 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/app/otbExtractGeom.cxx b/app/otbExtractGeom.cxx index 6b9056c..4abbbc9 100644 --- a/app/otbExtractGeom.cxx +++ b/app/otbExtractGeom.cxx @@ -24,9 +24,11 @@ #include "otbVectorDataToLabelImageCustomFilter.h" #include "itkMaskImageFilter.h" #include "otbVectorDataIntoImageProjectionFilter.h" -#include "otbVectorDataProperties.h" #include "otbRegionComparator.h" +// ogr +#include "otbOGR.h" + using namespace std; namespace otb @@ -63,7 +65,6 @@ public: FloatVectorImageType> VectorDataReprojFilterType; typedef otb::VectorDataToLabelImageCustomFilter<VectorDataType, MaskImageType> RasteriseFilterType; - typedef otb::VectorDataProperties<VectorDataType> VectorDataPropertiesType; void DoInit() { @@ -119,15 +120,55 @@ public: vdReproj->Update(); /* Get VectorData bounding box */ - vdProperties = VectorDataPropertiesType::New(); - vdProperties->SetVectorDataObject(vdReproj->GetOutput()); - vdProperties->ComputeBoundingRegion(); + OGREnvelope env; + otb::ogr::DataSource::Pointer ogrDS; + ogrDS = otb::ogr::DataSource::New(GetParameterString("shp") , + otb::ogr::DataSource::Modes::Read); + double ulx, uly, lrx, lry; + bool extentAvailable = true; + std::string inputProjectionRef = ""; + // First try to get the extent in the metadata + try + { + inputProjectionRef = ogrDS->GetGlobalExtent(ulx,uly,lrx,lry); + } + catch(const itk::ExceptionObject&) + { + extentAvailable = false; + } + // If no extent available force the computation of the extent + if (!extentAvailable) + { + try + { + inputProjectionRef = ogrDS->GetGlobalExtent(ulx,uly,lrx,lry,true); + extentAvailable = true; + } + catch(itk::ExceptionObject & err) + { + extentAvailable = false; + + otbAppLogFATAL(<<"Failed to retrieve the spatial extent of the dataset " + "in force mode. The spatial extent is mandatory when " + "orx, ory, spx and spy parameters are not set, consider " + "setting them. Error from library: "<<err.GetDescription()); + } + } + otb::RegionComparator<FloatVectorImageType, FloatVectorImageType>::RSRegion::PointType rsRoiOrigin; + rsRoiOrigin[0] = ulx; + rsRoiOrigin[1] = uly; + otb::RegionComparator<FloatVectorImageType, FloatVectorImageType>::RSRegion::SizeType rsRoiSize; + rsRoiSize[0] = lrx - ulx; + rsRoiSize[1] = lry - uly; + otb::RegionComparator<FloatVectorImageType, FloatVectorImageType>::RSRegion rsRoi; + rsRoi.SetOrigin(rsRoiOrigin); + rsRoi.SetSize(rsRoiSize); /* Compute intersecting region */ otb::RegionComparator<FloatVectorImageType, FloatVectorImageType> comparator; comparator.SetImage1(xs); FloatVectorImageType::RegionType roi = - comparator.RSRegionToImageRegion(vdProperties->GetBoundingRegion()); + comparator.RSRegionToImageRegion(rsRoi /*vdProperties->GetBoundingRegion()*/); roi.PadByRadius(1); // avoid extrapolation if (!roi.Crop(xs->GetLargestPossibleRegion())) { @@ -165,7 +206,6 @@ public: ExtractFilterType::Pointer m_Filter; VectorDataReprojFilterType::Pointer vdReproj; RasteriseFilterType::Pointer rasterizer; - VectorDataPropertiesType::Pointer vdProperties; MaskFilterType::Pointer maskFilter; }; -- GitLab