QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
labelposition.h
Go to the documentation of this file.
1/*
2 * libpal - Automated Placement of Labels Library
3 *
4 * Copyright (C) 2008 Maxence Laurent, MIS-TIC, HEIG-VD
5 * University of Applied Sciences, Western Switzerland
6 * http://www.hes-so.ch
7 *
8 * Contact:
9 * maxence.laurent <at> heig-vd <dot> ch
10 * or
11 * eric.taillard <at> heig-vd <dot> ch
12 *
13 * This file is part of libpal.
14 *
15 * libpal is free software: you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation, either version 3 of the License, or
18 * (at your option) any later version.
19 *
20 * libpal is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with libpal. If not, see <http://www.gnu.org/licenses/>.
27 *
28 */
29
30#ifndef LABELPOSITION_H
31#define LABELPOSITION_H
32
33#define SIP_NO_FILE
34
35
36#include "qgis_core.h"
37#include "pointset.h"
38#include "palrtree.h"
39#include <fstream>
40
41namespace pal
42{
43
44 class FeaturePart;
45 class Pal;
46 class Label;
47
48
55 class CORE_EXPORT LabelPosition : public PointSet
56 {
57 friend class CostCalculator;
58 friend class PolygonCostCalculator;
59
60 public:
61
66 {
75 QuadrantBelowRight
76 };
77
92 LabelPosition( int id, double x1, double y1,
93 double w, double h,
94 double alpha, double cost,
95 FeaturePart *feature, bool isReversed = false, Quadrant quadrant = QuadrantOver );
96
98 LabelPosition( const LabelPosition &other );
99
105 bool isIn( double *bbox );
106
112 bool isIntersect( double *bbox );
113
117 bool intersects( const GEOSPreparedGeometry *geometry );
118
122 bool within( const GEOSPreparedGeometry *geometry );
123
129 bool isInside( double *bbox );
130
137 bool isInConflict( const LabelPosition *ls ) const;
138
140 void getBoundingBox( double amin[2], double amax[2] ) const;
141
143 double getDistanceToPoint( double xp, double yp ) const;
144
146 bool crossesLine( PointSet *line ) const;
147
149 bool crossesBoundary( PointSet *polygon ) const;
150
155 int polygonIntersectionCost( PointSet *polygon ) const;
156
160 bool intersectsWithPolygon( PointSet *polygon ) const;
161
163 void offsetPosition( double xOffset, double yOffset );
164
168 int getId() const;
169
170
174 FeaturePart *getFeaturePart() const;
175
176 int getNumOverlaps() const { return nbOverlap; }
177 void resetNumOverlaps() { nbOverlap = 0; } // called from problem.cpp, pal.cpp
178
182 void incrementNumOverlaps() { nbOverlap++; }
183
187 void decrementNumOverlaps() { nbOverlap++; }
188
189 int getProblemFeatureId() const { return probFeat; }
190
195 void setProblemIds( int probFid, int lpId )
196 {
197 probFeat = probFid;
198 id = lpId;
199 if ( mNextPart ) mNextPart->setProblemIds( probFid, lpId );
200 }
201
206 double cost() const { return mCost; }
207
213 void setCost( double newCost ) { mCost = newCost; }
214
221 void setConflictsWithObstacle( bool conflicts );
222
227 bool conflictsWithObstacle() const { return mHasObstacleConflict; }
228
235 void setHasHardObstacleConflict( bool conflicts );
236
243 bool hasHardObstacleConflict() const { return mHasHardConflict; }
244
246 void validateCost();
247
252 double getX( int i = 0 ) const;
253
258 double getY( int i = 0 ) const;
259
260 double getWidth() const { return w; }
261 double getHeight() const { return h; }
262
266 double getAlpha() const;
267 bool getReversed() const { return reversed; }
268 bool getUpsideDown() const { return upsideDown; }
269
270 Quadrant getQuadrant() const { return quadrant; }
271
277 LabelPosition *nextPart() const { return mNextPart.get(); }
278
284 void setNextPart( std::unique_ptr< LabelPosition > next ) { mNextPart = std::move( next ); }
285
286 // -1 if not multi-part
287 int getPartId() const { return partId; }
288 void setPartId( int id ) { partId = id; }
289
295 void setUpsideDownCharCount( int count ) { mUpsideDownCharCount = count ; }
296
302 int upsideDownCharCount() const { return mUpsideDownCharCount; }
303
307 void removeFromIndex( PalRtree<LabelPosition> &index );
308
312 void insertIntoIndex( PalRtree<LabelPosition> &index );
313
319 const GEOSPreparedGeometry *preparedMultiPartGeom() const;
320
329 unsigned int globalId() const { return mGlobalId; }
330
337 void setGlobalId( unsigned int id ) { mGlobalId = id; }
338
342 double angleDifferential();
343
344 protected:
345
346 int id;
347
348 FeaturePart *feature = nullptr;
349
350 // bug # 1 (maxence 10/23/2008)
352
354
355 double alpha;
356 double w;
357 double h;
358
360
361 //True if label direction is the same as line / polygon ring direction.
362 //Could be used by the application to draw a directional arrow ('<' or '>')
363 //if the layer arrangement is P_LINE
365
367
369
370 private:
371
372 unsigned int mGlobalId = 0;
373 std::unique_ptr< LabelPosition > mNextPart;
374
375 double mCost;
376 bool mHasObstacleConflict;
377 bool mHasHardConflict = false;
378 int mUpsideDownCharCount;
379
383 int partCount() const;
384
389 double polygonIntersectionCostForParts( PointSet *polygon ) const;
390
394 void createMultiPartGeosGeom() const;
395
396 bool isInConflictMultiPart( const LabelPosition *lp ) const;
397
398 LabelPosition &operator=( const LabelPosition & ) = delete;
399 };
400
401} // end namespace
402
403#endif
A rtree spatial index for use in the pal labeling engine.
Definition: palrtree.h:36
Calculates label candidate costs considering different factors.
Main class to handle feature.
Definition: feature.h:65
LabelPosition is a candidate feature label position.
Definition: labelposition.h:56
Quadrant
Position of label candidate relative to feature.
Definition: labelposition.h:66
void incrementNumOverlaps()
Increases the number of overlaps recorded against this position by 1.
LabelPosition::Quadrant quadrant
double getHeight() const
bool hasHardObstacleConflict() const
Returns whether the position is marked as having a hard conflict with an obstacle feature.
void setPartId(int id)
void setNextPart(std::unique_ptr< LabelPosition > next)
Sets the next part of this label position (i.e.
void setCost(double newCost)
Sets the candidate label position's geographical cost.
int upsideDownCharCount() const
Returns the number of upside down characters for this label position.
bool getReversed() const
void setGlobalId(unsigned int id)
Sets the global id for the candidate, which is unique for a single run of the pal labelling engine.
void decrementNumOverlaps()
Decreases the number of overlaps recorded against this position by 1.
double cost() const
Returns the candidate label position's geographical cost.
Quadrant getQuadrant() const
bool conflictsWithObstacle() const
Returns whether the position is marked as conflicting with an obstacle feature.
double getWidth() const
int getNumOverlaps() const
void setProblemIds(int probFid, int lpId)
Set problem feature ID and assigned label candidate ID.
void setUpsideDownCharCount(int count)
Sets the count of upside down characters for this label position.
unsigned int globalId() const
Returns the global ID for the candidate, which is unique for a single run of the pal labelling engine...
int getPartId() const
int getProblemFeatureId() const
bool getUpsideDown() const
LabelPosition * nextPart() const
Returns the next part of this label position (i.e.
The underlying raw pal geometry class.
Definition: pointset.h:77