From 41f32797ae54735a3e2abb76ad80298993777be3 Mon Sep 17 00:00:00 2001 From: Otmane Lahlou <otmane.lahlou@c-s.fr> Date: Wed, 8 Dec 2010 15:07:37 +0100 Subject: [PATCH] ENH : handle input image with size less than tilesize (was not rescaled proprely)& cleaning --- Code/IO/otbKmzProductWriter.h | 3 ++ Code/IO/otbKmzProductWriter.txx | 73 ++++++++++----------------------- 2 files changed, 25 insertions(+), 51 deletions(-) diff --git a/Code/IO/otbKmzProductWriter.h b/Code/IO/otbKmzProductWriter.h index 9b4090f39d..fb5419446e 100644 --- a/Code/IO/otbKmzProductWriter.h +++ b/Code/IO/otbKmzProductWriter.h @@ -153,6 +153,9 @@ public: this->AddLegend(emptyString,legend); } + // Set the size of the tiles to produce + itkSetMacro(TileSize,int); + protected: KmzProductWriter(); virtual ~KmzProductWriter(); diff --git a/Code/IO/otbKmzProductWriter.txx b/Code/IO/otbKmzProductWriter.txx index 48ce936e3d..6815bd665a 100644 --- a/Code/IO/otbKmzProductWriter.txx +++ b/Code/IO/otbKmzProductWriter.txx @@ -33,7 +33,6 @@ KmzProductWriter<TInputImage> { m_TileSize = 512; m_UseExtendMode = true; - //m_Logo = InputImageType::New(); // Modify superclass default values, can be overridden by subclasses this->SetNumberOfRequiredInputs(1); @@ -112,7 +111,7 @@ KmzProductWriter<TInputImage> // input is not usable. bool emptyProjRef = m_VectorImage->GetProjectionRef().empty(); bool emptyKWL = m_VectorImage->GetImageKeywordlist().GetSize() == 0 ? true : false; - + if(emptyProjRef && emptyKWL) { itkExceptionMacro(<<"The input image have empty keyword list, please use an image with metadata informations"); @@ -253,8 +252,8 @@ KmzProductWriter<TInputImage> unsigned int curIdx = 0; /** Image statistics*/ - typename InputImageType::PixelType inMin(numberOfChannel), inMax(numberOfChannel), outMin(numberOfChannel), outMax( - numberOfChannel); + typename InputImageType::PixelType inMin(numberOfChannel), inMax(numberOfChannel), + outMin(numberOfChannel), outMax(numberOfChannel); outMin.Fill(0); outMax.Fill(255); @@ -296,7 +295,6 @@ KmzProductWriter<TInputImage> for (int depth = 0; depth <= maxDepth; depth++) { - // update the attribute value Current Depth m_CurrentDepth = depth; @@ -338,10 +336,19 @@ KmzProductWriter<TInputImage> m_VectorRescaleIntensityImageFilter->SetOutputMinimum(outMin); m_VectorRescaleIntensityImageFilter->SetOutputMaximum(outMax); - m_VectorRescaleIntensityImageFilter->SetInputMinimum(inMin); - m_VectorRescaleIntensityImageFilter->SetInputMaximum(inMax); - m_VectorRescaleIntensityImageFilter->SetAutomaticInputMinMaxComputation(false); - + // Case of input image with size lower than the tileSize + // this case is illustrated with depth==0 and + // sampleRatioValue==1 + if(depth==0 && sampleRatioValue == 1) + { + m_VectorRescaleIntensityImageFilter->SetAutomaticInputMinMaxComputation(true); + } + else + { + m_VectorRescaleIntensityImageFilter->SetInputMinimum(inMin); + m_VectorRescaleIntensityImageFilter->SetInputMaximum(inMax); + m_VectorRescaleIntensityImageFilter->SetAutomaticInputMinMaxComputation(false); + } m_ResampleVectorImage = m_VectorRescaleIntensityImageFilter->GetOutput(); } @@ -408,8 +415,8 @@ KmzProductWriter<TInputImage> // Set Channel to extract m_VectorImageExtractROIFilter->SetChannel(1);//m_ProductVector[m_CurrentProduct].m_Composition[0] + 1); - m_VectorImageExtractROIFilter->SetChannel(2);//m_ProductVector[m_CurrentProduct].m_Composition[1] + 1); - m_VectorImageExtractROIFilter->SetChannel(3);//m_ProductVector[m_CurrentProduct].m_Composition[2] + 1); + m_VectorImageExtractROIFilter->SetChannel(2);//m_ProductVector[m_CurrentProduct].m_Composition[1] + 1); + m_VectorImageExtractROIFilter->SetChannel(3);//m_ProductVector[m_CurrentProduct].m_Composition[2] + 1); // Set extract roi input m_VectorImageExtractROIFilter->SetInput(m_ResampleVectorImage); @@ -418,7 +425,7 @@ KmzProductWriter<TInputImage> m_VectorWriter = VectorWriterType::New(); m_VectorWriter->SetFileName(ossFileName.str().c_str()); m_VectorWriter->SetInput(m_VectorImageExtractROIFilter->GetOutput()); - m_VectorWriter->WriteGeomFileOn(); + m_VectorWriter->WriteGeomFileOn(); m_VectorWriter->Update(); /** TODO : Generate KML for this tile */ @@ -533,7 +540,7 @@ KmzProductWriter<TInputImage> centerLong, centerLat); } - if (depth == 0) + if (depth == 0) { // Add the headers and the basic stuffs in the kml only once. if (curIdx == 0) @@ -776,12 +783,6 @@ KmzProductWriter<TInputImage> m_RootKmlFile << "\t\t\t\t<range>35000</range>" << std::endl; m_RootKmlFile << "\t\t\t</LookAt>" << std::endl; - // Georeferenced Products - // Add network link - // If not geo add a ground Overlay with image - // as an icon -// if (this->IsProductHaveMetaData(pos)) -// { m_RootKmlFile << "\t\t\t<NetworkLink>" << std::endl; m_RootKmlFile << "\t\t\t\t<name>" << m_FileName<< "</name>" << std::endl; m_RootKmlFile << "\t\t\t\t<open>1</open>" << std::endl; @@ -790,6 +791,7 @@ KmzProductWriter<TInputImage> m_RootKmlFile << "\t\t\t\t\t<listItemType>checkHideChildren</listItemType>" << std::endl; m_RootKmlFile << "\t\t\t\t</ListStyle>" << std::endl; m_RootKmlFile << "\t\t\t</Style>" << std::endl; + if (addRegion) { m_RootKmlFile << "\t\t\t\t<Region>" << std::endl; @@ -809,43 +811,12 @@ KmzProductWriter<TInputImage> m_RootKmlFile << "\t\t\t\t\t</LatLonAltBox>" << std::endl; m_RootKmlFile << "\t\t\t\t</Region>" << std::endl; } - + m_RootKmlFile << "\t\t\t\t<Link>" << std::endl; m_RootKmlFile << "\t\t\t\t\t<href>" << directory << "/0/0/0" << m_KmlExtension << "</href>" << std::endl; m_RootKmlFile << "\t\t\t\t\t<viewRefreshMode>onRegion</viewRefreshMode>" << std::endl; m_RootKmlFile << "\t\t\t\t</Link>" << std::endl; m_RootKmlFile << "\t\t\t</NetworkLink>" << std::endl; -// } -// else -// { -// m_RootKmlFile << "\t\t\t<GroundOverlay>" << std::endl; -// m_RootKmlFile << "\t\t\t\t<name>" << m_FileName<< "</name>" << std::endl; -// m_RootKmlFile << "\t\t\t\t<Icon>" << std::endl; -// m_RootKmlFile << "\t\t\t\t\t<href>" << directory << "/0.jpg" << "</href>" << std::endl; -// m_RootKmlFile << "\t\t\t\t</Icon>" << std::endl; - -// if (!m_UseExtendMode) -// { -// m_RootKmlFile << "\t\t\t\t<LatLonBox>" << std::endl; -// m_RootKmlFile << "\t\t\t\t\t<north>" << north << "</north>" << std::endl; -// m_RootKmlFile << "\t\t\t\t\t<south>" << south << "</south>" << std::endl; -// m_RootKmlFile << "\t\t\t\t\t<east>" << east << "</east>" << std::endl; -// m_RootKmlFile << "\t\t\t\t\t<west>" << west << "</west>" << std::endl; -// m_RootKmlFile << "\t\t\t\t</LatLonBox>" << std::endl; -// } -// else -// { -// m_RootKmlFile << "\t\t\t<gx:LatLonQuad>" << std::endl; -// m_RootKmlFile << "\t\t\t\t<coordinates>" << std::endl; -// m_RootKmlFile << " " << m_LowerLeftCorner[0] << "," << m_LowerLeftCorner[1]; -// m_RootKmlFile << " " << m_LowerRightCorner[0] << "," << m_LowerRightCorner[1]; -// m_RootKmlFile << " " << m_UpperRightCorner[0] << "," << m_UpperRightCorner[1]; -// m_RootKmlFile << " " << m_UpperLeftCorner[0] << "," << m_UpperRightCorner[1] << std::endl; -// m_RootKmlFile << "\t\t\t\t</coordinates>" << std::endl; -// m_RootKmlFile << "\t\t\t</gx:LatLonQuad>" << std::endl; -// } -// m_RootKmlFile << "\t\t\t</GroundOverlay>" << std::endl; -// } m_RootKmlFile << "\t\t\t<Folder>" << std::endl; m_RootKmlFile << "\t\t\t\t<name>The bounding box </name>" << std::endl; -- GitLab