18 #ifndef __otbGenericRSTransform_txx
19 #define __otbGenericRSTransform_txx
28 #include "ogr_spatialref.h"
33 template<
class TScalarType,
unsigned int NInputDimensions,
unsigned int NOutputDimensions>
37 m_InputProjectionRef.clear();
38 m_OutputProjectionRef.clear();
39 m_InputKeywordList.Clear();
40 m_OutputKeywordList.Clear();
41 m_InputSpacing.Fill(1);
42 m_InputOrigin.Fill(0);
43 m_OutputSpacing.Fill(1);
44 m_OutputOrigin.Fill(0);
47 m_InputTransform =
NULL;
48 m_OutputTransform =
NULL;
49 m_TransformUpToDate =
false;
53 template<
class TScalarType,
unsigned int NInputDimensions,
unsigned int NOutputDimensions>
58 itkDebugMacro(
"returning MapProjection address " << this->m_Transform);
59 if ((!m_TransformUpToDate) || (m_Transform.IsNull()))
61 itkExceptionMacro(<<
"m_Transform not up-to-date, call InstanciateTransform() first");
64 return this->m_Transform;
70 template<
class TScalarType,
unsigned int NInputDimensions,
unsigned int NOutputDimensions>
75 m_Transform = TransformType::New();
77 if (m_InputKeywordList.GetSize() == 0)
81 if (m_InputProjectionRef.empty())
90 << ((m_InputKeywordList.GetSize() == 0) ?
"Empty" :
"Full"));
91 otbMsgDevMacro(<<
" * Input projection: " << m_InputProjectionRef);
93 << ((m_OutputKeywordList.GetSize() == 0) ?
"Empty" :
"Full"));
94 otbMsgDevMacro(<<
" * Output projection: " << m_OutputProjectionRef);
99 m_InputTransform =
NULL;
100 m_OutputTransform =
NULL;
102 bool firstTransformGiveGeo =
true;
103 bool inputTransformIsSensor =
false;
104 bool inputTransformIsMap =
false;
105 bool outputTransformIsSensor =
false;
106 bool outputTransformIsMap =
false;
125 if (!m_InputProjectionRef.empty())
128 InverseMapProjectionType;
129 typename InverseMapProjectionType::Pointer mapTransform = InverseMapProjectionType::New();
131 mapTransform->SetWkt(m_InputProjectionRef);
132 if (mapTransform->IsProjectionDefined())
134 m_InputTransform = mapTransform.GetPointer();
135 inputTransformIsMap =
true;
136 otbMsgDevMacro(<<
"Input projection set to map transform: " << m_InputTransform);
141 if ((m_InputTransform.IsNull()) && (m_InputKeywordList.GetSize() > 0))
144 typename ForwardSensorModelType::Pointer sensorModel = ForwardSensorModelType::New();
146 sensorModel->SetImageGeometry(m_InputKeywordList);
148 if (sensorModel->IsValidSensorModel())
150 m_InputTransform = sensorModel.GetPointer();
151 inputTransformIsSensor =
true;
156 if (m_InputTransform.IsNull())
161 OGRSpatialReferenceH hSRS =
NULL;
162 hSRS = OSRNewSpatialReference(
NULL);
163 const char * wktString = m_InputProjectionRef.c_str();
164 if (OSRImportFromWkt(hSRS, (
char **) &wktString) != OGRERR_NONE)
166 firstTransformGiveGeo =
false;
167 otbMsgDevMacro(<<
"- Considering that the first transform does not give geo (WKT)")
170 else if ( OSRIsGeographic(hSRS) )
172 firstTransformGiveGeo =
true;
173 otbMsgDevMacro(<<
"- Considering that the first transform gives geo")
177 firstTransformGiveGeo =
false;
178 otbMsgDevMacro(<<
"- Considering that the first transform does not give geo (fallback)")
187 if (!m_OutputProjectionRef.empty())
190 OutputSpaceDimension> ForwardMapProjectionType;
191 typename ForwardMapProjectionType::Pointer mapTransform = ForwardMapProjectionType::New();
192 mapTransform->SetWkt(m_OutputProjectionRef);
193 if (mapTransform->IsProjectionDefined())
195 m_OutputTransform = mapTransform.GetPointer();
196 outputTransformIsMap =
true;
197 otbMsgDevMacro(<<
"Output projection set to map transform: " << m_OutputTransform);
202 if ((m_OutputTransform.IsNull()) && (m_OutputKeywordList.GetSize() > 0))
205 typename InverseSensorModelType::Pointer sensorModel = InverseSensorModelType::New();
207 sensorModel->SetImageGeometry(m_OutputKeywordList);
209 if (sensorModel->IsValidSensorModel())
211 m_OutputTransform = sensorModel.GetPointer();
212 outputTransformIsSensor =
true;
218 if (m_OutputTransform.IsNull())
221 if (firstTransformGiveGeo)
223 m_OutputProjectionRef =
224 "GEOGCS[\"GCS_WGS_1984\", DATUM[\"D_WGS_1984\", SPHEROID[\"WGS_1984\", 6378137, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"Degree\", 0.017453292519943295]]";
229 m_Transform->SetFirstTransform(m_InputTransform);
230 m_Transform->SetSecondTransform(m_OutputTransform);
231 m_TransformUpToDate =
true;
234 if ((inputTransformIsSensor || outputTransformIsSensor))
239 else if (firstTransformGiveGeo && !outputTransformIsSensor && !outputTransformIsMap)
244 else if (!inputTransformIsSensor && !outputTransformIsSensor && !inputTransformIsMap && !outputTransformIsMap)
256 template<
class TScalarType,
unsigned int NInputDimensions,
unsigned int NOutputDimensions>
264 inputPoint[0] = inputPoint[0] * m_InputSpacing[0] + m_InputOrigin[0];
265 inputPoint[1] = inputPoint[1] * m_InputSpacing[1] + m_InputOrigin[1];
269 outputPoint = this->GetTransform()->TransformPoint(inputPoint);
272 outputPoint[0] = (outputPoint[0] - m_OutputOrigin[0]) / m_OutputSpacing[0];
273 outputPoint[1] = (outputPoint[1] - m_OutputOrigin[1]) / m_OutputSpacing[1];
280 template<
class TScalarType,
unsigned int NInputDimensions,
unsigned int NOutputDimensions>
286 if (inverseTransform ==
NULL)
292 inverseTransform->SetInputProjectionRef(m_OutputProjectionRef);
293 inverseTransform->SetOutputProjectionRef(m_InputProjectionRef);
296 inverseTransform->SetInputKeywordList(m_OutputKeywordList);
297 inverseTransform->SetOutputKeywordList(m_InputKeywordList);
300 inverseTransform->SetInputDictionary(m_OutputDictionary);
301 inverseTransform->SetOutputDictionary(m_InputDictionary);
304 inverseTransform->SetInputSpacing(m_OutputSpacing);
305 inverseTransform->SetOutputSpacing(m_InputSpacing);
308 inverseTransform->SetInputOrigin(m_OutputOrigin);
309 inverseTransform->SetOutputOrigin(m_InputOrigin);
312 inverseTransform->InstanciateTransform();
317 template<
class TScalarType,
unsigned int NInputDimensions,
unsigned int NOutputDimensions>
319 ::InverseTransformBasePointer
323 Self * inverseTransform = Self::New();
325 bool success = this->GetInverse(inverseTransform);
329 itkExceptionMacro(<<
"Failed to create inverse transform");
332 return inverseTransform;
335 template<
class TScalarType,
unsigned int NInputDimensions,
unsigned int NOutputDimensions>
340 Superclass::PrintSelf(os, indent);
341 os << indent <<
"Up to date: " << m_TransformUpToDate << std::endl;
342 if (m_TransformUpToDate)
344 os << indent <<
"Input transform: "<< std::endl;
346 os << indent <<
"Output transform: " << std::endl;
351 os << indent <<
"Input transform: NULL" << std::endl;
352 os << indent <<
"Output transform: NULL" << std::endl;
354 os << indent <<
"Accuracy: "
357 "ESTIMATE" :
"UNKNOWN")) << std::endl;