Skip to content

Commit e2439ea

Browse files
committed
More work on iterators; trying to find the cause of a segfault
1 parent c713197 commit e2439ea

5 files changed

Lines changed: 70 additions & 14 deletions

File tree

Lib/Feature.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ Feature::Feature(OGRFeature* feature)
77

88
Feature::~Feature()
99
{
10-
OGRFeature::DestroyFeature(_feature);
10+
//SEGFault caused here
11+
//OGRFeature::DestroyFeature(_feature);
1112
}
1213

1314
string Feature::Name() const
@@ -30,9 +31,18 @@ const Field Feature::operator[](size_t index) const
3031
return GetFieldAtIndex(index);
3132
}
3233

34+
bool Feature::operator==(const Feature& other) const
35+
{
36+
_feature == other._feature;
37+
}
38+
3339
Feature::FeatureGeometry::FeatureGeometry(OGRGeometry* geometry)
34-
: _geometry(geometry)
40+
: _geometry(geometry),
41+
_hasPoint(false),
42+
_hasPolygon(false),
43+
_hasMultiPolygon(false)
3544
{
45+
ParseGeometry(geometry);
3646
}
3747

3848
Feature::FeatureGeometry::~FeatureGeometry()
@@ -74,7 +84,7 @@ void Feature::FeatureGeometry::ParseGeometry(OGRGeometry *geometry)
7484
OGRMultiPolygon* multiPolygon = (OGRMultiPolygon*)geometry;
7585
for (int i = 0; i < multiPolygon->getNumGeometries(); i++)
7686
{
77-
OGRPolygon* ogrPolygon = (OGRPolygon*)geometry;
87+
OGRPolygon* ogrPolygon = (OGRPolygon*)multiPolygon->getGeometryRef(i);
7888
Polygon polygon = ParsePolygon(ogrPolygon);
7989
_multiPolygon.AddPolygon(polygon);
8090
}

Lib/Feature.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class Feature
2323
Field operator[](size_t index);
2424
const Field operator[](size_t index) const;
2525

26+
bool operator==(const Feature& other) const;
27+
2628
class FeatureGeometry
2729
{
2830
public:

Lib/Layer.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@ void Layer::ResetReading() const
2424
_layer->ResetReading();
2525
}
2626

27-
Feature* Layer::NextFeature() const
27+
Feature Layer::NextFeature() const
2828
{
2929
OGRFeature* feature = _layer->GetNextFeature();
30-
if (feature)
31-
return new Feature(feature);
32-
return nullptr;
30+
return Feature(feature);
3331
}
3432

3533
Layer::iterator Layer::begin() const
@@ -48,7 +46,8 @@ OGRFeatureDefn* Layer::FeatureDefinition()
4846
}
4947

5048
Layer::FeatureIterator::FeatureIterator(const Layer* layer, bool start)
51-
: _layer(layer)
49+
: _layer(layer),
50+
_currentFeature(nullptr)
5251
{
5352
if (start)
5453
{
@@ -75,7 +74,7 @@ Layer::FeatureIterator& Layer::FeatureIterator::operator=(const FeatureIterator&
7574

7675
Layer::FeatureIterator::reference Layer::FeatureIterator::operator*() const
7776
{
78-
return *_currentFeature.get();
77+
return _currentFeature;
7978
}
8079

8180
Layer::FeatureIterator& Layer::FeatureIterator::operator++()
@@ -93,7 +92,7 @@ Layer::FeatureIterator Layer::FeatureIterator::operator++(int)
9392

9493
bool Layer::FeatureIterator::operator==(const FeatureIterator& rhs)
9594
{
96-
return _currentFeature.get() == rhs._currentFeature.get();
95+
return _currentFeature == rhs._currentFeature;
9796
}
9897

9998
bool Layer::FeatureIterator::operator!=(const FeatureIterator& rhs)
@@ -103,5 +102,5 @@ bool Layer::FeatureIterator::operator!=(const FeatureIterator& rhs)
103102

104103
void Layer::FeatureIterator::NextFeature()
105104
{
106-
_currentFeature.reset(_layer->NextFeature());
105+
_currentFeature = _layer->NextFeature();
107106
}

Lib/Layer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Layer
2323
public:
2424
using value_type = Feature;
2525
using difference_type = ptrdiff_t;
26-
using pointer = shared_ptr<Feature>;
26+
using pointer = Feature*;
2727
using reference = const Feature&;
2828
using iterator_category = input_iterator_tag;
2929

@@ -50,7 +50,7 @@ class Layer
5050

5151
private:
5252
const Layer* _layer;
53-
shared_ptr<Feature> _currentFeature;
53+
Feature _currentFeature;
5454
};
5555

5656
using iterator = FeatureIterator;
@@ -62,7 +62,7 @@ class Layer
6262
OGRFeatureDefn* FeatureDefinition();
6363

6464
void ResetReading() const;
65-
Feature* NextFeature() const;
65+
Feature NextFeature() const;
6666

6767
private:
6868
OGRLayer* _layer;

ShapeFileExample.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,51 @@ int main(int argc, char** argv)
4242
{
4343
cout << field.Name() << "=" << field.Value() << ",";
4444
}
45+
46+
cout << "type=" << feature.Geometry().Type() << endl;
47+
if (feature.Geometry().HasPoint())
48+
{
49+
cout << "Point(" << feature.Geometry().GetPoint().X << "," << feature.Geometry().GetPoint().Y << ")" << endl;
50+
}
51+
else if (feature.Geometry().HasPolygon())
52+
{
53+
cout << "==== External Ring ====" << endl;
54+
for (auto p : feature.Geometry().GetPolygon().ExternalRing())
55+
{
56+
cout << "Point(" << p.X << "," << p.Y << ")" << endl;
57+
}
58+
59+
for (auto ring : feature.Geometry().GetPolygon().InternalRings())
60+
{
61+
cout << "==== Internal Ring ====" << endl;
62+
for (auto p : ring)
63+
{
64+
cout << "Point(" << p.X << "," << p.Y << ")" << endl;
65+
}
66+
}
67+
}
68+
else if (feature.Geometry().HasMultiPolygon())
69+
{
70+
cout << "=== Polygon in MultiPolygon ===" << endl;
71+
for (auto polygon : feature.Geometry().GetMultiPolygon())
72+
{
73+
cout << "==== External Ring ====" << endl;
74+
for (auto p : polygon.ExternalRing())
75+
{
76+
cout << "Point(" << p.X << "," << p.Y << ")" << endl;
77+
}
78+
79+
for (auto ring : polygon.InternalRings())
80+
{
81+
cout << "==== Internal Ring ====" << endl;
82+
for (auto p : ring)
83+
{
84+
cout << "Point(" << p.X << "," << p.Y << ")" << endl;
85+
}
86+
}
87+
}
88+
}
89+
4590
cout << endl;
4691
}
4792
cout << "Number of features: " << numberOfFeatures << endl;

0 commit comments

Comments
 (0)