Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
otb
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
David Youssefi
otb
Commits
2b7961bc
Commit
2b7961bc
authored
12 years ago
by
Julien Michel
Browse files
Options
Downloads
Patches
Plain Diff
ENH/ Adapting filter to process layers, not datasources
parent
8be4017e
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
Code/Segmentation/otbOGRLayerStreamStitchingFilter.h
+30
-38
30 additions, 38 deletions
Code/Segmentation/otbOGRLayerStreamStitchingFilter.h
Code/Segmentation/otbOGRLayerStreamStitchingFilter.txx
+26
-27
26 additions, 27 deletions
Code/Segmentation/otbOGRLayerStreamStitchingFilter.txx
with
56 additions
and
65 deletions
Code/Segmentation/otbOGRLayerStreamStitchingFilter.h
+
30
−
38
View file @
2b7961bc
...
...
@@ -15,14 +15,14 @@
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __otbOGR
DataSource
StreamStitchingFilter_h
#define __otbOGR
DataSource
StreamStitchingFilter_h
#ifndef __otbOGR
Layer
StreamStitchingFilter_h
#define __otbOGR
Layer
StreamStitchingFilter_h
#include
"otbOGRDataSourceWrapper.h"
#include
"otbMacro.h"
//#if(GDAL_VERSION_NUM < 1800)
//#error OGR
DataSource
StreamStitchingFilter requires GDAL version >= 1.8.0
//#error OGR
Layer
StreamStitchingFilter requires GDAL version >= 1.8.0
//#endif
#include
"itkProcessObject.h"
...
...
@@ -32,7 +32,7 @@
namespace
otb
{
/** \class OGR
DataSource
StreamStitchingFilter
/** \class OGR
Layer
StreamStitchingFilter
* \brief This filter fusion the geometries in a layer (\c OGRLayer) along streaming lines.
* It is a in-line filter which means that the result of the fusion overwrites the input layer.
* The strategy for merging polygons is quite simple. A polygon P1 is merge with a polygon P2 if:
...
...
@@ -51,33 +51,30 @@ namespace otb
*
*/
template
<
class
TInputImage
>
class
ITK_EXPORT
OGR
DataSource
StreamStitchingFilter
:
class
ITK_EXPORT
OGR
Layer
StreamStitchingFilter
:
public
itk
::
ProcessObject
{
public:
/** typedef for the classes standards. */
typedef
OGR
DataSource
StreamStitchingFilter
Self
;
typedef
itk
::
ProcessObject
Superclass
;
typedef
itk
::
SmartPointer
<
Self
>
Pointer
;
typedef
itk
::
SmartPointer
<
const
Self
>
ConstPointer
;
typedef
OGR
Layer
StreamStitchingFilter
Self
;
typedef
itk
::
ProcessObject
Superclass
;
typedef
itk
::
SmartPointer
<
Self
>
Pointer
;
typedef
itk
::
SmartPointer
<
const
Self
>
ConstPointer
;
/** Definition of the input image */
typedef
TInputImage
InputImageType
;
typedef
typename
InputImageType
::
PixelType
InputPixelType
;
typedef
typename
InputImageType
::
IndexType
InputIndexType
;
typedef
typename
InputImageType
::
SizeType
SizeType
;
typedef
typename
InputImageType
::
RegionType
RegionType
;
typedef
typename
InputImageType
::
SpacingType
SpacingType
;
typedef
typename
InputImageType
::
PointType
OriginType
;
typedef
typename
InputImageType
::
IndexType
IndexType
;
typedef
TInputImage
InputImageType
;
typedef
typename
InputImageType
::
PixelType
InputPixelType
;
typedef
typename
InputImageType
::
IndexType
InputIndexType
;
typedef
typename
InputImageType
::
SizeType
SizeType
;
typedef
typename
InputImageType
::
RegionType
RegionType
;
typedef
typename
InputImageType
::
SpacingType
SpacingType
;
typedef
typename
InputImageType
::
PointType
OriginType
;
typedef
typename
InputImageType
::
IndexType
IndexType
;
typedef
ogr
::
DataSource
OGRDataSourceType
;
typedef
typename
OGRDataSourceType
::
Pointer
OGRDataSourcePointerType
;
typedef
ogr
::
Layer
OGRLayerType
;
typedef
ogr
::
Feature
OGRFeatureType
;
typedef
ogr
::
Layer
OGRLayerType
;
typedef
ogr
::
Feature
OGRFeatureType
;
/** Set the input image of this process object. */
virtual
void
SetInput
(
const
InputImageType
*
input
);
/** Get the input image. */
...
...
@@ -87,12 +84,12 @@ public:
itkNewMacro
(
Self
);
/** Return the name of the class. */
itkTypeMacro
(
OGR
DataSource
StreamStitchingFilter
,
ProcessObject
);
itkTypeMacro
(
OGR
Layer
StreamStitchingFilter
,
ProcessObject
);
/** Set the input OGR
DataSource
*/
void
SetOGR
DataSource
(
OGRDataSourcePoint
erType
ogr
DS
);
/** Get the input OGR
DataSource
*/
OGRDataSource
Type
*
GetOGR
DataSource
(
void
);
/** Set the input OGR
Layer
*/
void
SetOGR
Layer
(
const
OGRLay
erType
&
ogr
Layer
);
/** Get the input OGR
Layer
*/
const
OGRLayer
Type
&
GetOGR
Layer
(
void
)
const
;
/** Set the stream size.
* As this filter is intended to be used right after the \c StreamingVectorizedSegmentation,
...
...
@@ -101,18 +98,13 @@ public:
itkSetMacro
(
StreamSize
,
SizeType
);
/** Get stream size*/
itkGetMacro
(
StreamSize
,
SizeType
);
/** Set the name of the layer in the input \c OGRDataSource, that contains the polygons to merge.*/
itkSetStringMacro
(
LayerName
);
/** Get the layer name. */
itkGetStringMacro
(
LayerName
);
/** Generate Data method. This method must be called explicitly (not through the \c Update method). */
virtual
void
GenerateData
();
protected:
OGR
DataSource
StreamStitchingFilter
();
virtual
~
OGR
DataSource
StreamStitchingFilter
()
{}
OGR
Layer
StreamStitchingFilter
();
virtual
~
OGR
Layer
StreamStitchingFilter
()
{}
struct
FusionStruct
{
...
...
@@ -145,12 +137,12 @@ protected:
double
GetLengthOGRGeometryCollection
(
OGRGeometryCollection
*
intersection
);
private
:
OGR
DataSource
StreamStitchingFilter
(
const
Self
&
);
//purposely not implemented
OGR
Layer
StreamStitchingFilter
(
const
Self
&
);
//purposely not implemented
void
operator
=
(
const
Self
&
);
//purposely not implemented
SizeType
m_StreamSize
;
unsigned
int
m_Radius
;
std
::
string
m_
Layer
Name
;
OGRLayerType
m_OGR
Layer
;
};
...
...
@@ -159,7 +151,7 @@ private:
}
// end namespace otb
#ifndef OTB_MANUAL_INSTANTIATION
#include
"otbOGR
DataSource
StreamStitchingFilter.txx"
#include
"otbOGR
Layer
StreamStitchingFilter.txx"
#endif
#endif
This diff is collapsed.
Click to expand it.
Code/Segmentation/otbOGRLayerStreamStitchingFilter.txx
+
26
−
27
View file @
2b7961bc
...
...
@@ -31,7 +31,7 @@ namespace otb
template<class TImage>
OGRDataSourceStreamStitchingFilter<TImage>
::OGRDataSourceStreamStitchingFilter() : m_Radius(2), m_Layer
Name("Layer"
)
::OGRDataSourceStreamStitchingFilter() : m_Radius(2), m_
OGR
Layer
(NULL
)
{
m_StreamSize.Fill(0);
}
...
...
@@ -61,17 +61,18 @@ OGRDataSourceStreamStitchingFilter<TInputImage>
template<class TInputImage>
void
OGRDataSourceStreamStitchingFilter<TInputImage>
::SetOGR
DataSource( OGRDataSourcePoint
erType ogr
DS
)
::SetOGR
Layer( const OGRLay
erType
&
ogr
Layer
)
{
this->itk::ProcessObject::SetNthInput(1, ogrDS);
m_OGRLayer = ogrLayer;
this->Modified();
}
template<class TInputImage>
typename OGRDataSourceStreamStitchingFilter<TInputImage>::OGR
DataSource
Type
*
const
typename OGRDataSourceStreamStitchingFilter<TInputImage>::OGR
Layer
Type
&
OGRDataSourceStreamStitchingFilter<TInputImage>
::GetOGRDataSource( void )
::GetOGRDataSource( void )
const
{
return
static_cast<OGRDataSourceType *> (this->itk::ProcessObject::GetInput(1))
;
return
m_OGRLayer
;
}
template<class TInputImage>
...
...
@@ -104,13 +105,6 @@ OGRDataSourceStreamStitchingFilter<TInputImage>
::ProcessStreamingLine( bool line )
{
typename InputImageType::ConstPointer inputImage = this->GetInput();
OGRDataSourcePointerType inputDataSource = this->GetOGRDataSource();
//Handle the case of shapefile. A shapefile is a layer and not a datasource.
//The layer name in a shapefile is the shapefile's name.
//This is not the case for a database as sqlite or PG.
OGRLayerType inputLayer = inputDataSource->GetLayersCount() == 1
? inputDataSource->GetLayer(0)
: inputDataSource->GetLayerChecked(m_LayerName);
//compute the number of stream division in row and column
SizeType imageSize = this->GetInput()->GetLargestPossibleRegion().GetSize();
...
...
@@ -121,7 +115,7 @@ OGRDataSourceStreamStitchingFilter<TInputImage>
for(unsigned int x=1; x<=nbColStream; x++)
{
input
Layer.ogr().StartTransaction();
m_OGR
Layer.ogr().StartTransaction();
for(unsigned int y=1; y<=nbRowStream; y++)
{
//First we get all the feature that intersect the streaming line of the Upper/left stream
...
...
@@ -155,12 +149,12 @@ OGRDataSourceStreamStitchingFilter<TInputImage>
OriginType lrCorner;
inputImage->TransformIndexToPhysicalPoint(LowerRightCorner, lrCorner);
input
Layer.SetSpatialFilterRect(ulCorner[0],lrCorner[1],lrCorner[0],ulCorner[1]);
m_OGR
Layer.SetSpatialFilterRect(ulCorner[0],lrCorner[1],lrCorner[0],ulCorner[1]);
OGRLayerType::const_iterator featIt =
input
Layer.begin();
for(; featIt!=
input
Layer.end(); ++featIt)
OGRLayerType::const_iterator featIt =
m_OGR
Layer.begin();
for(; featIt!=
m_OGR
Layer.end(); ++featIt)
{
FeatureStruct s(
input
Layer.GetLayerDefn());
FeatureStruct s(
m_OGR
Layer.GetLayerDefn());
s.feat = *featIt;
s.fusioned = false;
upperStreamFeatureList.push_back(s);
...
...
@@ -192,11 +186,11 @@ OGRDataSourceStreamStitchingFilter<TInputImage>
inputImage->TransformIndexToPhysicalPoint(UpperLeftCorner, ulCorner);
inputImage->TransformIndexToPhysicalPoint(LowerRightCorner, lrCorner);
input
Layer.SetSpatialFilterRect(ulCorner[0],lrCorner[1],lrCorner[0],ulCorner[1]);
m_OGR
Layer.SetSpatialFilterRect(ulCorner[0],lrCorner[1],lrCorner[0],ulCorner[1]);
for(featIt =
input
Layer.begin(); featIt!=
input
Layer.end(); ++featIt)
for(featIt =
m_OGR
Layer.begin(); featIt!=
m_OGR
Layer.end(); ++featIt)
{
FeatureStruct s(
input
Layer.GetLayerDefn());
FeatureStruct s(
m_OGR
Layer.GetLayerDefn());
s.feat = *featIt;
s.fusioned = false;
lowerStreamFeatureList.push_back(s);
...
...
@@ -266,16 +260,16 @@ OGRDataSourceStreamStitchingFilter<TInputImage>
upperStreamFeatureList[fusionList[i].indStream1].fusioned = true;
lowerStreamFeatureList[fusionList[i].indStream2].fusioned = true;
ogr::UniqueGeometryPtr fusionPolygon = ogr::Union(*upper.feat.GetGeometry(),*lower.feat.GetGeometry());
OGRFeatureType fusionFeature(
input
Layer.GetLayerDefn());
OGRFeatureType fusionFeature(
m_OGR
Layer.GetLayerDefn());
fusionFeature.SetGeometry( fusionPolygon.get() );
ogr::Field field = upper.feat[0];
try
{
fusionFeature[0].SetValue(field.GetValue<int>());
input
Layer.CreateFeature(fusionFeature);
input
Layer.DeleteFeature(lower.feat.GetFID());
input
Layer.DeleteFeature(upper.feat.GetFID());
m_OGR
Layer.CreateFeature(fusionFeature);
m_OGR
Layer.DeleteFeature(lower.feat.GetFID());
m_OGR
Layer.DeleteFeature(upper.feat.GetFID());
}
catch(itk::ExceptionObject& err)
{
...
...
@@ -284,12 +278,12 @@ OGRDataSourceStreamStitchingFilter<TInputImage>
}
}
} //end for x
input
Layer.ogr().CommitTransaction();
m_OGR
Layer.ogr().CommitTransaction();
// Update progress
progress.CompletedPixel();
} //end for y
input
Layer.ogr().CommitTransaction();
m_OGR
Layer.ogr().CommitTransaction();
}
...
...
@@ -298,6 +292,11 @@ void
OGRDataSourceStreamStitchingFilter<TImage>
::GenerateData(void)
{
if(!m_OGRLayer)
{
itkExceptionMacro(<<"Input OGR layer is null!");
}
//Process column
this->ProcessStreamingLine(false);
//Process row
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment