QGIS API Documentation  3.21.0-Master (56b4176581)
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 
41 namespace 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 
65  enum Quadrant
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)
351  int probFeat;
352 
354 
355  double alpha;
356  double w;
357  double h;
358 
359  int partId;
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
364  bool reversed;
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.
LabelPosition * nextPart() const
Returns the next part of this label position (i.e.
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
The underlying raw pal geometry class.
Definition: pointset.h:76