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>
188 double *padfGeoTransform_;
189 std::unique_ptr<OGRFeature> poFeature_{};
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;
This class represents a layer of simple features, with access methods.
Definition: ogrsf_frmts.h:58
Concrete class representing polygons.
Definition: ogr_geometry.h:2660
CPL error handling services.
CPLErr
Error category.
Definition: cpl_error.h:37
C API and defines for OGRFeature, OGRGeometry, and OGRDataSource related classes.
void * OGRLayerH
Opaque type for a layer (OGRLayer)
Definition: ogr_api.h:676
Simple feature geometry classes.
Classes related to registration of format support, and opening datasets.