QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
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 
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 
277  bool getReversed() const { return reversed; }
278  bool getUpsideDown() const { return upsideDown; }
279 
280  Quadrant getQuadrant() const { return quadrant; }
281 
287  LabelPosition *nextPart() const { return mNextPart.get(); }
288 
294  void setNextPart( std::unique_ptr< LabelPosition > next ) { mNextPart = std::move( next ); }
295 
296  // -1 if not multi-part
297  int getPartId() const { return partId; }
298  void setPartId( int id ) { partId = id; }
299 
305  void setUpsideDownCharCount( int count ) { mUpsideDownCharCount = count ; }
306 
312  int upsideDownCharCount() const { return mUpsideDownCharCount; }
313 
317  void removeFromIndex( PalRtree<LabelPosition> &index );
318 
322  void insertIntoIndex( PalRtree<LabelPosition> &index );
323 
329  const GEOSPreparedGeometry *preparedMultiPartGeom() const;
330 
336  const GEOSPreparedGeometry *preparedOuterBoundsGeom() const;
337 
346  unsigned int globalId() const { return mGlobalId; }
347 
354  void setGlobalId( unsigned int id ) { mGlobalId = id; }
355 
359  double angleDifferential();
360 
361  protected:
362 
363  int id;
364 
365  FeaturePart *feature = nullptr;
366 
367  // bug # 1 (maxence 10/23/2008)
368  int probFeat;
369 
371 
373  double alpha;
374 
375  double w;
376  double h;
377 
378  int partId;
379 
380  //True if label direction is the same as line / polygon ring direction.
381  //Could be used by the application to draw a directional arrow ('<' or '>')
382  //if the layer arrangement is P_LINE
383  bool reversed;
384 
386 
388 
389  private:
390 
391  unsigned int mGlobalId = 0;
392  std::unique_ptr< LabelPosition > mNextPart;
393 
394  std::vector< double > mOuterBoundsX;
395  std::vector< double > mOuterBoundsY;
396 
397  double mOuterBoundsXMin = std::numeric_limits<double>::max();
398  double mOuterBoundsXMax = std::numeric_limits<double>::lowest();
399  double mOuterBoundsYMin = std::numeric_limits<double>::max();
400  double mOuterBoundsYMax = std::numeric_limits<double>::lowest();
401 
402  geos::unique_ptr mOuterBoundsGeos;
403  const GEOSPreparedGeometry *mPreparedOuterBoundsGeos = nullptr;
404 
405  double mCost;
406  bool mHasObstacleConflict;
407  bool mHasHardConflict = false;
408  int mUpsideDownCharCount;
409 
413  int partCount() const;
414 
419  double polygonIntersectionCostForParts( PointSet *polygon ) const;
420 
424  void createMultiPartGeosGeom() const;
425 
426  bool isInConflictMultiPart( const LabelPosition *lp ) const;
427 
428  void createOuterBoundsGeom();
429 
430  LabelPosition &operator=( const LabelPosition & ) = delete;
431  };
432 
433 } // end namespace
434 
435 #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.
double alpha
Rotation in radians.
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:77
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
Definition: qgsgeos.h:73