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>;
68 IndexType iBottomRightRow{0};
69 IndexType iBottomRightCol{0};
71 std::vector<Arc *> oArcs{};
73 std::vector<bool> oArcRighthandFollow{};
75 std::vector<std::size_t> oArcConnections{};
79 RPolygon(
const RPolygon &) =
delete;
81 RPolygon &operator=(
const RPolygon &) =
delete;
88 IndexedArc newArc(
bool bFollowRighthand);
93 void setArcConnection(
const IndexedArc &oArc,
const IndexedArc &oNextArc);
98 void updateBottomRightPos(IndexType iRow, IndexType iCol);
109 RPolygon *poPolyInside{
nullptr};
110 RPolygon *poPolyAbove{
nullptr};
111 RPolygon *poPolyLeft{
nullptr};
113 IndexedArc oArcHorOuter{};
114 IndexedArc oArcHorInner{};
115 IndexedArc oArcVerInner{};
116 IndexedArc oArcVerOuter{};
118 bool bSolidHorizontal{
false};
119 bool bSolidVertical{
false};
122 template <
typename DataType>
class PolygonReceiver
125 PolygonReceiver() =
default;
127 PolygonReceiver(
const PolygonReceiver<DataType> &) =
delete;
129 virtual ~PolygonReceiver() =
default;
131 PolygonReceiver<DataType> &
132 operator=(
const PolygonReceiver<DataType> &) =
delete;
134 virtual void receive(RPolygon *poPolygon, DataType nPolygonCellValue) = 0;
140 template <
typename PolyIdType,
typename DataType>
class Polygonizer
143 static constexpr PolyIdType THE_OUTER_POLYGON_ID =
144 std::numeric_limits<PolyIdType>::max();
147 using PolygonMap = std::map<PolyIdType, RPolygon *>;
148 using PolygonMapEntry =
typename PolygonMap::value_type;
150 PolyIdType nInvalidPolyId_;
151 RPolygon *poTheOuterPolygon_{
nullptr};
152 PolygonMap oPolygonMap_{};
154 PolygonReceiver<DataType> *poPolygonReceiver_;
156 RPolygon *getPolygon(PolyIdType nPolygonId);
158 RPolygon *createPolygon(PolyIdType nPolygonId);
160 void destroyPolygon(PolyIdType nPolygonId);
163 explicit Polygonizer(PolyIdType nInvalidPolyId,
164 PolygonReceiver<DataType> *poPolygonReceiver);
166 Polygonizer(
const Polygonizer<PolyIdType, DataType> &) =
delete;
170 Polygonizer<PolyIdType, DataType> &
171 operator=(
const Polygonizer<PolyIdType, DataType> &) =
delete;
173 RPolygon *getTheOuterPolygon()
const
175 return poTheOuterPolygon_;
178 void processLine(
const PolyIdType *panThisLineId,
179 const DataType *panLastLineVal, TwoArm *poThisLineArm,
180 TwoArm *poLastLineArm, IndexType nCurrentRow,
187 template <
typename DataType>
188 class OGRPolygonWriter :
public PolygonReceiver<DataType>
192 double *padfGeoTransform_;
197 OGRPolygonWriter(
OGRLayerH hOutLayer,
int iPixValField,
198 double *padfGeoTransform);
200 OGRPolygonWriter(
const OGRPolygonWriter<DataType> &) =
delete;
202 ~OGRPolygonWriter() =
default;
204 OGRPolygonWriter<DataType> &
205 operator=(
const OGRPolygonWriter<DataType> &) =
delete;
207 void receive(RPolygon *poPolygon, DataType nPolygonCellValue)
override;
CPL error handling services.
CPLErr
Error category.
Definition: cpl_error.h:53
C API and defines for OGRFeature, OGRGeometry, and OGRDataSource related classes.
void * OGRLayerH
Opaque type for a layer (OGRLayer)
Definition: ogr_api.h:691