QGIS API Documentation 3.29.0-Master (19d7edcfed)
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
100 ~LabelPosition() override;
101
107 bool intersects( const GEOSPreparedGeometry *geometry );
108
114 bool within( const GEOSPreparedGeometry *geometry );
115
124 bool isInConflict( const LabelPosition *ls ) const;
125
131 void getBoundingBox( double amin[2], double amax[2] ) const;
132
137 bool outerBoundingBoxIntersects( const LabelPosition *other ) const;
138
146 double getDistanceToPoint( double xp, double yp, bool useOuterBounds ) const;
147
153 bool crossesLine( PointSet *line ) const;
154
160 bool crossesBoundary( PointSet *polygon ) const;
161
166 int polygonIntersectionCost( PointSet *polygon ) const;
167
173 bool intersectsWithPolygon( PointSet *polygon ) const;
174
178 int getId() const;
179
183 FeaturePart *getFeaturePart() const;
184
185 int getNumOverlaps() const { return nbOverlap; }
186 void resetNumOverlaps() { nbOverlap = 0; } // called from problem.cpp, pal.cpp
187
191 void incrementNumOverlaps() { nbOverlap++; }
192
196 void decrementNumOverlaps() { nbOverlap++; }
197
198 int getProblemFeatureId() const { return probFeat; }
199
204 void setProblemIds( int probFid, int lpId )
205 {
206 probFeat = probFid;
207 id = lpId;
208 if ( mNextPart ) mNextPart->setProblemIds( probFid, lpId );
209 }
210
215 double cost() const { return mCost; }
216
222 void setCost( double newCost ) { mCost = newCost; }
223
230 void setConflictsWithObstacle( bool conflicts );
231
236 bool conflictsWithObstacle() const { return mHasObstacleConflict; }
237
244 void setHasHardObstacleConflict( bool conflicts );
245
252 bool hasHardObstacleConflict() const { return mHasHardConflict; }
253
255 void validateCost();
256
261 double getX( int i = 0 ) const;
262
267 double getY( int i = 0 ) const;
268
269 double getWidth() const { return w; }
270 double getHeight() const { return h; }
271
275 double getAlpha() const;
276 bool getReversed() const { return reversed; }
277 bool getUpsideDown() const { return upsideDown; }
278
279 Quadrant getQuadrant() const { return quadrant; }
280
286 LabelPosition *nextPart() const { return mNextPart.get(); }
287
293 void setNextPart( std::unique_ptr< LabelPosition > next ) { mNextPart = std::move( next ); }
294
295 // -1 if not multi-part
296 int getPartId() const { return partId; }
297 void setPartId( int id ) { partId = id; }
298
304 void setUpsideDownCharCount( int count ) { mUpsideDownCharCount = count ; }
305
311 int upsideDownCharCount() const { return mUpsideDownCharCount; }
312
316 void removeFromIndex( PalRtree<LabelPosition> &index );
317
321 void insertIntoIndex( PalRtree<LabelPosition> &index );
322
328 const GEOSPreparedGeometry *preparedMultiPartGeom() const;
329
335 const GEOSPreparedGeometry *preparedOuterBoundsGeom() const;
336
345 unsigned int globalId() const { return mGlobalId; }
346
353 void setGlobalId( unsigned int id ) { mGlobalId = id; }
354
358 double angleDifferential();
359
360 protected:
361
362 int id;
363
364 FeaturePart *feature = nullptr;
365
366 // bug # 1 (maxence 10/23/2008)
368
370
371 double alpha;
372 double w;
373 double h;
374
376
377 //True if label direction is the same as line / polygon ring direction.
378 //Could be used by the application to draw a directional arrow ('<' or '>')
379 //if the layer arrangement is P_LINE
381
383
385
386 private:
387
388 unsigned int mGlobalId = 0;
389 std::unique_ptr< LabelPosition > mNextPart;
390
391 std::vector< double > mOuterBoundsX;
392 std::vector< double > mOuterBoundsY;
393
394 double mOuterBoundsXMin = std::numeric_limits<double>::max();
395 double mOuterBoundsXMax = std::numeric_limits<double>::lowest();
396 double mOuterBoundsYMin = std::numeric_limits<double>::max();
397 double mOuterBoundsYMax = std::numeric_limits<double>::lowest();
398
399 geos::unique_ptr mOuterBoundsGeos;
400 const GEOSPreparedGeometry *mPreparedOuterBoundsGeos = nullptr;
401
402 double mCost;
403 bool mHasObstacleConflict;
404 bool mHasHardConflict = false;
405 int mUpsideDownCharCount;
406
410 int partCount() const;
411
416 double polygonIntersectionCostForParts( PointSet *polygon ) const;
417
421 void createMultiPartGeosGeom() const;
422
423 bool isInConflictMultiPart( const LabelPosition *lp ) const;
424
425 void createOuterBoundsGeom();
426
427 LabelPosition &operator=( const LabelPosition & ) = delete;
428 };
429
430} // end namespace
431
432#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
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
Definition: qgsgeos.h:74