12#ifndef POLYGONIZE_POLYGONIZER_H_INCLUDED
13#define POLYGONIZE_POLYGONIZER_H_INCLUDED
36using IndexType = std::uint32_t;
37using Point = std::array<IndexType, 2>;
38using Arc = std::vector<Point>;
54 IndexType iBottomRightRow{0};
55 IndexType iBottomRightCol{0};
59 std::unique_ptr<Arc> poArc{};
61 unsigned nConnection = 0;
63 bool bFollowRighthand =
false;
65 ArcStruct(
unsigned nConnectionIn,
bool bFollowRighthandIn)
66 : poArc(std::make_unique<Arc>()), nConnection(nConnectionIn),
67 bFollowRighthand(bFollowRighthandIn)
73 std::vector<ArcStruct> oArcs{};
77 RPolygon(
const RPolygon &) =
delete;
79 RPolygon &operator=(
const RPolygon &) =
delete;
84 IndexedArc newArc(
bool bFollowRighthand);
89 void setArcConnection(
const IndexedArc &oArc,
const IndexedArc &oNextArc);
94 void updateBottomRightPos(IndexType iRow, IndexType iCol);
105 RPolygon *poPolyInside{
nullptr};
106 RPolygon *poPolyAbove{
nullptr};
107 RPolygon *poPolyLeft{
nullptr};
109 IndexedArc oArcHorOuter{};
110 IndexedArc oArcHorInner{};
111 IndexedArc oArcVerInner{};
112 IndexedArc oArcVerOuter{};
114 bool bSolidHorizontal{
false};
115 bool bSolidVertical{
false};
118template <
typename DataType>
class PolygonReceiver
121 PolygonReceiver() =
default;
123 PolygonReceiver(
const PolygonReceiver<DataType> &) =
delete;
125 virtual ~PolygonReceiver() =
default;
127 PolygonReceiver<DataType> &
128 operator=(
const PolygonReceiver<DataType> &) =
delete;
130 virtual void receive(RPolygon *poPolygon, DataType nPolygonCellValue) = 0;
136template <
typename PolyIdType,
typename DataType>
class Polygonizer
139 static constexpr PolyIdType THE_OUTER_POLYGON_ID =
140 std::numeric_limits<PolyIdType>::max();
143 using PolygonMap = std::map<PolyIdType, RPolygon *>;
144 using PolygonMapEntry =
typename PolygonMap::value_type;
146 PolyIdType nInvalidPolyId_;
147 RPolygon *poTheOuterPolygon_{
nullptr};
148 PolygonMap oPolygonMap_{};
150 PolygonReceiver<DataType> *poPolygonReceiver_;
152 RPolygon *getPolygon(PolyIdType nPolygonId);
154 RPolygon *createPolygon(PolyIdType nPolygonId);
156 void destroyPolygon(PolyIdType nPolygonId);
159 explicit Polygonizer(PolyIdType nInvalidPolyId,
160 PolygonReceiver<DataType> *poPolygonReceiver);
162 Polygonizer(
const Polygonizer<PolyIdType, DataType> &) =
delete;
166 Polygonizer<PolyIdType, DataType> &
167 operator=(
const Polygonizer<PolyIdType, DataType> &) =
delete;
169 RPolygon *getTheOuterPolygon()
const
171 return poTheOuterPolygon_;
174 bool processLine(
const PolyIdType *panThisLineId,
175 const DataType *panLastLineVal, TwoArm *poThisLineArm,
176 TwoArm *poLastLineArm, IndexType nCurrentRow,
183template <
typename DataType>
184class OGRPolygonWriter :
public PolygonReceiver<DataType>
186 OGRLayer *poOutLayer_ =
nullptr;
187 GDALDataset *poOutDS_ =
nullptr;
188 const int iPixValField_;
189 const GDALGeoTransform gt_;
190 int nCommitInterval_ = 0;
191 GIntBig nFeaturesWrittenInTransaction_ = 0;
192 std::unique_ptr<OGRFeature> poFeature_{};
193 OGRPolygon *poPolygon_ =
199 OGRPolygonWriter(
OGRLayerH hOutLayer,
int iPixValField,
200 const GDALGeoTransform >,
int nCommitInterval);
201 ~OGRPolygonWriter()
override;
203 OGRPolygonWriter(
const OGRPolygonWriter<DataType> &) =
delete;
205 OGRPolygonWriter<DataType> &
206 operator=(
const OGRPolygonWriter<DataType> &) =
delete;
210 void receive(RPolygon *poPolygon, DataType nPolygonCellValue)
override;
CPL error handling services.
CPLErr
Error category.
Definition cpl_error.h:37
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition cpl_port.h:205
void * OGRLayerH
Opaque type for a layer (OGRLayer).
Definition gdal_fwd.h:157
C API and defines for OGRFeature, OGRGeometry, and OGRDataSource related classes.
Simple feature geometry classes.
Classes related to registration of format support, and opening datasets.