18 #ifndef __otbImageToEnvelopeVectorDataFilter_txx
19 #define __otbImageToEnvelopeVectorDataFilter_txx
29 template <
class TInputImage,
class TOutputVectorData>
33 this->SetNumberOfInputs(1);
34 this->SetNumberOfOutputs(1);
35 m_OutputProjectionRef.clear();
38 this->SetNthOutput(0, OutputVectorDataType::New());
41 template <
class TInputImage,
class TOutputVectorData>
49 const_cast<InputImageType *>(input));
52 template <
class TInputImage,
class TOutputVectorData>
57 if (this->GetNumberOfInputs() < 1)
return 0;
63 template <
class TInputImage,
class TOutputVectorData>
69 Superclass::GenerateOutputInformation();
72 this->InstantiateTransform();
80 template <
class TInputImage,
class TOutputVectorData>
86 Superclass::GenerateInputRequestedRegion();
89 typename InputImageType::Pointer inputPtr =
const_cast<TInputImage *
>(this->GetInput());
91 typename InputImageType::RegionType requestedRegion = inputPtr->GetRequestedRegion();
92 typename InputImageType::SizeType size = requestedRegion.GetSize();
94 requestedRegion.SetSize(size);
96 typename InputImageType::IndexType index = requestedRegion.GetIndex();
98 requestedRegion.SetIndex(index);
100 inputPtr->SetRequestedRegion(requestedRegion);
103 template <
class TInputImage,
class TOutputVectorData>
109 typename InputImageType::ConstPointer inputPtr = this->GetInput();
110 m_Transform = InternalTransformType::New();
111 m_Transform->SetOutputProjectionRef(m_OutputProjectionRef);
112 m_Transform->SetInputProjectionRef(inputPtr->GetProjectionRef());
113 m_Transform->SetInputKeywordList(inputPtr->GetImageKeywordlist());
114 m_Transform->InstanciateTransform();
118 template <
class TInputImage,
class TOutputVectorData>
124 typename InputImageType::ConstPointer inputPtr = this->GetInput();
128 typename InputImageType::IndexType ul, ur, lr, ll;
129 ul = inputPtr->GetLargestPossibleRegion().GetIndex();
133 typename InputImageType::SizeType size = inputPtr->GetLargestPossibleRegion().GetSize();
140 typename InputImageType::PointType ulp, urp, lrp, llp, current;
141 inputPtr->TransformIndexToPhysicalPoint(ul, ulp);
142 inputPtr->TransformIndexToPhysicalPoint(ur, urp);
143 inputPtr->TransformIndexToPhysicalPoint(lr, lrp);
144 inputPtr->TransformIndexToPhysicalPoint(ll, llp);
146 this->InstantiateTransform();
148 typename InputImageType::IndexType edgeIndex;
149 typename InputImageType::PointType edgePoint;
152 typename PolygonType::Pointer envelope = PolygonType::New();
153 typename PolygonType::VertexType vertex;
154 current = m_Transform->TransformPoint(ulp);
155 vertex[0] = current[0];
156 vertex[1] = current[1];
157 envelope->AddVertex(vertex);
159 if (m_SamplingRate>0)
162 edgeIndex[0]+=m_SamplingRate;
163 while (edgeIndex[0]<ur[0])
165 inputPtr->TransformIndexToPhysicalPoint(edgeIndex, edgePoint);
166 current = m_Transform->TransformPoint(edgePoint);
167 vertex[0] = current[0];
168 vertex[1] = current[1];
169 envelope->AddVertex(vertex);
170 edgeIndex[0]+=m_SamplingRate;
174 current = m_Transform->TransformPoint(urp);
175 vertex[0] = current[0];
176 vertex[1] = current[1];
177 envelope->AddVertex(vertex);
179 if (m_SamplingRate>0)
182 edgeIndex[1]+=m_SamplingRate;
183 while (edgeIndex[1]<lr[1])
185 inputPtr->TransformIndexToPhysicalPoint(edgeIndex, edgePoint);
186 current = m_Transform->TransformPoint(edgePoint);
187 vertex[0] = current[0];
188 vertex[1] = current[1];
189 envelope->AddVertex(vertex);
190 edgeIndex[1]+=m_SamplingRate;
194 current = m_Transform->TransformPoint(lrp);
195 vertex[0] = current[0];
196 vertex[1] = current[1];
197 envelope->AddVertex(vertex);
199 if (m_SamplingRate>0)
202 edgeIndex[0]-=m_SamplingRate;
203 while (edgeIndex[0]>ll[0])
205 inputPtr->TransformIndexToPhysicalPoint(edgeIndex, edgePoint);
206 current = m_Transform->TransformPoint(edgePoint);
207 vertex[0] = current[0];
208 vertex[1] = current[1];
209 envelope->AddVertex(vertex);
210 edgeIndex[0]-=m_SamplingRate;
214 current = m_Transform->TransformPoint(llp);
215 vertex[0] = current[0];
216 vertex[1] = current[1];
217 envelope->AddVertex(vertex);
219 if (m_SamplingRate>0)
222 edgeIndex[1]-=m_SamplingRate;
223 while (edgeIndex[1]>ul[1])
225 inputPtr->TransformIndexToPhysicalPoint(edgeIndex, edgePoint);
226 current = m_Transform->TransformPoint(edgePoint);
227 vertex[0] = current[0];
228 vertex[1] = current[1];
229 envelope->AddVertex(vertex);
230 edgeIndex[1]-=m_SamplingRate;
242 tree->Add(document, root);
245 newDataNode->SetPolygonExteriorRing(envelope);
247 tree->Add(newDataNode, document);