28 #ifndef POLYGONIZE_POLYGONIZER_H_INCLUDED
29 #define POLYGONIZE_POLYGONIZER_H_INCLUDED
50 using IndexType = std::uint32_t;
51 using Point = std::array<IndexType, 2>;
52 using Arc = std::vector<Point>;
67 IndexType iBottomRightRow{0};
68 IndexType iBottomRightCol{0};
70 std::vector<Arc *> oArcs{};
72 std::vector<bool> oArcRighthandFollow{};
74 std::vector<std::size_t> oArcConnections{};
78 RPolygon(
const RPolygon &) =
delete;
80 RPolygon &operator=(
const RPolygon &) =
delete;
87 IndexedArc newArc(
bool bFollowRighthand);
92 void setArcConnection(IndexedArc &oArc, IndexedArc &oNextArc);
97 void updateBottomRightPos(IndexType iRow, IndexType iCol);
108 RPolygon *poPolyInside{
nullptr};
109 RPolygon *poPolyAbove{
nullptr};
110 RPolygon *poPolyLeft{
nullptr};
112 IndexedArc oArcHorOuter{};
113 IndexedArc oArcHorInner{};
114 IndexedArc oArcVerInner{};
115 IndexedArc oArcVerOuter{};
117 bool bSolidHorizontal{
false};
118 bool bSolidVertical{
false};
121 template <
typename DataType>
class PolygonReceiver
124 PolygonReceiver() =
default;
126 PolygonReceiver(
const PolygonReceiver<DataType> &) =
delete;
128 virtual ~PolygonReceiver() =
default;
130 PolygonReceiver<DataType> &
131 operator=(
const PolygonReceiver<DataType> &) =
delete;
133 virtual void receive(RPolygon *poPolygon, DataType nPolygonCellValue) = 0;
139 template <
typename PolyIdType,
typename DataType>
class Polygonizer
142 static constexpr PolyIdType THE_OUTER_POLYGON_ID =
143 std::numeric_limits<PolyIdType>::max();
146 using PolygonMap = std::map<PolyIdType, RPolygon *>;
147 using PolygonMapEntry =
typename PolygonMap::value_type;
149 PolyIdType nInvalidPolyId_;
150 RPolygon *poTheOuterPolygon_{
nullptr};
151 PolygonMap oPolygonMap_{};
153 PolygonReceiver<DataType> *poPolygonReceiver_;
155 RPolygon *getPolygon(PolyIdType nPolygonId);
157 RPolygon *createPolygon(PolyIdType nPolygonId);
159 void destroyPolygon(PolyIdType nPolygonId);
162 explicit Polygonizer(PolyIdType nInvalidPolyId,
163 PolygonReceiver<DataType> *poPolygonReceiver);
165 Polygonizer(
const Polygonizer<PolyIdType, DataType> &) =
delete;
169 Polygonizer<PolyIdType, DataType> &
170 operator=(
const Polygonizer<PolyIdType, DataType> &) =
delete;
172 RPolygon *getTheOuterPolygon()
const
174 return poTheOuterPolygon_;
177 void processLine(
const PolyIdType *panThisLineId,
178 const DataType *panLastLineVal, TwoArm *poThisLineArm,
179 TwoArm *poLastLineArm, IndexType nCurrentRow,
186 template <
typename DataType>
187 class OGRPolygonWriter :
public PolygonReceiver<DataType>
191 double *padfGeoTransform_;
196 OGRPolygonWriter(
OGRLayerH hOutLayer,
int iPixValField,
197 double *padfGeoTransform);
199 OGRPolygonWriter(
const OGRPolygonWriter<DataType> &) =
delete;
201 ~OGRPolygonWriter() =
default;
203 OGRPolygonWriter<DataType> &
204 operator=(
const OGRPolygonWriter<DataType> &) =
delete;
206 void receive(RPolygon *poPolygon, DataType nPolygonCellValue)
override;