From 80ebe03566193f23db115bad04063f7e206bf26b Mon Sep 17 00:00:00 2001
From: Emmanuel Christophe <emmanuel.christophe@orfeo-toolbox.org>
Date: Wed, 6 May 2009 12:02:22 +0800
Subject: [PATCH] ENH: support for mapping in sensor geometry

---
 Code/Common/otbVectorDataToImageFilter.txx    | 64 +++++++++++++++----
 .../otbVectorDataToImageFilterSensorModel.cxx |  4 ++
 2 files changed, 55 insertions(+), 13 deletions(-)

diff --git a/Code/Common/otbVectorDataToImageFilter.txx b/Code/Common/otbVectorDataToImageFilter.txx
index b3a6255382..d25d3a5654 100644
--- a/Code/Common/otbVectorDataToImageFilter.txx
+++ b/Code/Common/otbVectorDataToImageFilter.txx
@@ -21,6 +21,7 @@
 
 #include "otbVectorDataToImageFilter.h"
 #include "itkImageRegionIterator.h"
+#include "itkImageIteratorWithIndex.h"
 #include "otbVectorDataStyle.h"
 
 #include <mapnik/datasource_cache.hpp>
@@ -218,12 +219,15 @@ namespace otb
     itk::ExposeMetaData<std::string>(input->GetMetaDataDictionary(), MetaDataKey::ProjectionRefKey,  vectorDataProjectionWKT);
     std::cout << "WKT -> " << vectorDataProjectionWKT << std::endl;
     std::string vectorDataProjectionProj4;
+    bool processingInSensorModelGeometry = false;
+
     if (vectorDataProjectionWKT == "")
     {
       //We assume that it is an image in sensor model geometry
       //and tell mapnik that this is utm
       //(with a resolution of 1m per unit)
       vectorDataProjectionProj4 = "+proj=utm +zone=31 +ellps=WGS84";
+      processingInSensorModelGeometry =  true;
     }
     else
     {
@@ -232,6 +236,7 @@ namespace otb
       oSRS.exportToProj4(&pszProj4);
       vectorDataProjectionProj4 = pszProj4;
       CPLFree(pszProj4);
+      processingInSensorModelGeometry =  false;
     }
     std::cout << "Proj.4 -> " << vectorDataProjectionProj4 << std::endl;
 
@@ -254,6 +259,11 @@ namespace otb
 
     m_Map.addLayer(lyr);
 
+    std::cout << "Envelope (param): " << m_Origin[0] << ", "
+       << m_Origin[1]+m_Spacing[1]*m_Size[1] << ", "
+       << m_Origin[0]+m_Spacing[0]*m_Size[0] << ", "
+       << m_Origin[1] << std::endl;
+
     mapnik::Envelope<double> envelope(m_Origin[0],
                                      m_Origin[1]+m_Spacing[1]*m_Size[1],
                                      m_Origin[0]+m_Spacing[0]*m_Size[0],
@@ -276,20 +286,48 @@ namespace otb
 //     unsigned int size = 4*m_Size[0]*m_Size[1];//FIXME: lot of assumption here: RGBA, 2 dimensions
 //     memcpy(dst, src, size);
 
-    itk::ImageRegionIterator<ImageType> it(output, output->GetLargestPossibleRegion());
-
-    for (it.GoToBegin(); !it.IsAtEnd(); ++it)
+    if (processingInSensorModelGeometry == false)
     {
-      itk::RGBAPixel<unsigned char> pix;
-      pix[0] = *src;
-      ++src;
-      pix[1] = *src;
-      ++src;
-      pix[2] = *src;
-      ++src;
-      pix[3] = *src;
-      ++src;
-      it.Set(pix);
+      itk::ImageRegionIterator<ImageType> it(output, output->GetLargestPossibleRegion());
+
+      for (it.GoToBegin(); !it.IsAtEnd(); ++it)
+      {
+        itk::RGBAPixel<unsigned char> pix;
+        pix[0] = *src;
+        ++src;
+        pix[1] = *src;
+        ++src;
+        pix[2] = *src;
+        ++src;
+        pix[3] = *src;
+        ++src;
+        it.Set(pix);
+      }
+    }
+    else
+    {//in sensor geometry, we need to flip the Y axis (Note: check validity for some SAR sensor)
+      itk::ImageIteratorWithIndex<ImageType> it(output, output->GetLargestPossibleRegion());
+      typename itk::ImageIteratorWithIndex<ImageType>::IndexType index;
+      for (int yIndex = m_Size[1]-1; yIndex >= 0; --yIndex)
+      {
+        for (int xIndex = 0; xIndex < m_Size[0]; ++xIndex)
+        {
+          itk::RGBAPixel<unsigned char> pix;
+          pix[0] = *src;
+          ++src;
+          pix[1] = *src;
+          ++src;
+          pix[2] = *src;
+          ++src;
+          pix[3] = *src;
+          ++src;
+          index[0] = xIndex;
+          index[1] = yIndex;
+          it.SetIndex(index);
+          it.Set(pix);
+        }
+      }
+
     }
 
 
diff --git a/Testing/Code/Common/otbVectorDataToImageFilterSensorModel.cxx b/Testing/Code/Common/otbVectorDataToImageFilterSensorModel.cxx
index ea167ff15a..b0ef60b43d 100644
--- a/Testing/Code/Common/otbVectorDataToImageFilterSensorModel.cxx
+++ b/Testing/Code/Common/otbVectorDataToImageFilterSensorModel.cxx
@@ -84,6 +84,10 @@ int otbVectorDataToImageFilterSensorModel(int argc, char * argv[])
   spacing[1] = imageReader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]/static_cast<double>(size[1]);
 //                     /imageReader->GetOutput()->GetSpacing()[1];
 
+  std::cout << "Size: " << size <<std::endl;
+  std::cout << "Origin: " << origin <<std::endl;
+  std::cout << "Spacing: " << spacing <<std::endl;
+
   typedef otb::VectorDataToImageFilter<VectorDataType, ImageType> VectorDataToImageFilterType;
   VectorDataToImageFilterType::Pointer vectorDataRendering = VectorDataToImageFilterType::New();
   vectorDataRendering->SetInput(projection->GetOutput());
-- 
GitLab