QGIS API Documentation  2.99.0-Master (c558d51)
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 #include "pointset.h"
34 #include "rtree.hpp"
35 #include <fstream>
36 
37 namespace pal
38 {
39 
40  class FeaturePart;
41  class Pal;
42  class Label;
43 
44 
51  class CORE_EXPORT LabelPosition : public PointSet
52  {
53  friend class CostCalculator;
54  friend class PolygonCostCalculator;
55 
56  public:
57 
61  enum Quadrant
62  {
71  QuadrantBelowRight
72  };
73 
88  LabelPosition( int id, double x1, double y1,
89  double w, double h,
90  double alpha, double cost,
91  FeaturePart *feature, bool isReversed = false, Quadrant quadrant = QuadrantOver );
92 
94  LabelPosition( const LabelPosition& other );
95 
96  ~LabelPosition() { delete nextPart; }
97 
103  bool isIn( double *bbox );
104 
110  bool isIntersect( double *bbox );
111 
117  bool isInside( double *bbox );
118 
125  bool isInConflict( LabelPosition *ls );
126 
128  void getBoundingBox( double amin[2], double amax[2] ) const;
129 
131  double getDistanceToPoint( double xp, double yp ) const;
132 
134  bool crossesLine( PointSet* line ) const;
135 
137  bool crossesBoundary( PointSet* polygon ) const;
138 
142  int polygonIntersectionCost( PointSet* polygon ) const;
143 
146  bool intersectsWithPolygon( PointSet* polygon ) const;
147 
149  void offsetPosition( double xOffset, double yOffset );
150 
154  int getId() const;
155 
156 
160  FeaturePart * getFeaturePart();
161 
162  int getNumOverlaps() const { return nbOverlap; }
163  void resetNumOverlaps() { nbOverlap = 0; } // called from problem.cpp, pal.cpp
164 
165  int getProblemFeatureId() const { return probFeat; }
166 
169  void setProblemIds( int probFid, int lpId )
170  {
171  probFeat = probFid;
172  id = lpId;
173  if ( nextPart ) nextPart->setProblemIds( probFid, lpId );
174  }
175 
179  double cost() const { return mCost; }
180 
185  void setCost( double newCost ) { mCost = newCost; }
186 
192  void setConflictsWithObstacle( bool conflicts );
193 
197  bool conflictsWithObstacle() const { return mHasObstacleConflict; }
198 
200  void validateCost();
201 
206  double getX( int i = 0 ) const;
207 
212  double getY( int i = 0 ) const;
213 
214  double getWidth() const { return w; }
215  double getHeight() const { return h; }
216 
221  double getAlpha() const;
222  bool getReversed() const { return reversed; }
223  bool getUpsideDown() const { return upsideDown; }
224 
225  Quadrant getQuadrant() const { return quadrant; }
226  LabelPosition* getNextPart() const { return nextPart; }
227  void setNextPart( LabelPosition* next ) { nextPart = next; }
228 
229  // -1 if not multi-part
230  int getPartId() const { return partId; }
231  void setPartId( int id ) { partId = id; }
232 
234  int incrementUpsideDownCharCount() { return ++mUpsideDownCharCount; }
235 
237  int upsideDownCharCount() const { return mUpsideDownCharCount; }
238 
239  void removeFromIndex( RTree<LabelPosition*, double, 2, double> *index );
240  void insertIntoIndex( RTree<LabelPosition*, double, 2, double> *index );
241 
242  typedef struct
243  {
246  } PruneCtx;
247 
249  static bool pruneCallback( LabelPosition *candidatePosition, void *ctx );
250 
251  // for counting number of overlaps
252  typedef struct
253  {
255  int *nbOv;
256  double *cost;
257  double *inactiveCost;
258  //int *feat;
259  } CountContext;
260 
261  /*
262  * count overlap, ctx = p_lp
263  */
264  static bool countOverlapCallback( LabelPosition *lp, void *ctx );
265 
266  static bool countFullOverlapCallback( LabelPosition *lp, void *ctx );
267 
268  static bool removeOverlapCallback( LabelPosition *lp, void *ctx );
269 
270  // for polygon cost calculation
271  static bool polygonObstacleCallback( pal::FeaturePart *obstacle, void *ctx );
272 
273  protected:
274 
275  int id;
276 
278 
279  // bug # 1 (maxence 10/23/2008)
280  int probFeat;
281 
283 
284  double alpha;
285  double w;
286  double h;
287 
289  int partId;
290 
291  //True if label direction is the same as line / polygon ring direction.
292  //Could be used by the application to draw a directional arrow ('<' or '>')
293  //if the layer arrangement is P_LINE
294  bool reversed;
295 
297 
299 
300  bool isInConflictSinglePart( LabelPosition* lp );
301  bool isInConflictMultiPart( LabelPosition* lp );
302 
303  private:
304  double mCost;
305  bool mHasObstacleConflict;
306  int mUpsideDownCharCount;
307 
310  int partCount() const;
311 
315  double polygonIntersectionCostForParts( PointSet* polygon ) const;
316 
317  };
318 
319 } // end namespace
320 
321 #endif
FeaturePart * feature
static unsigned index
int upsideDownCharCount() const
Returns the number of upside down characters for this label position.
double getWidth() const
void setCost(double newCost)
Sets the candidate label position&#39;s geographical cost.
int incrementUpsideDownCharCount()
Increases the count of upside down characters for this label position.
double cost() const
Returns the candidate label position&#39;s geographical cost.
Main Pal labelling class.
Definition: pal.h:84
bool conflictsWithObstacle() const
Returns whether the position is marked as conflicting with an obstacle feature.
int getProblemFeatureId() const
LabelPosition * nextPart
Quadrant getQuadrant() const
LabelPosition * getNextPart() const
Main class to handle feature.
Definition: feature.h:89
bool getReversed() const
void setPartId(int id)
bool getUpsideDown() const
void setNextPart(LabelPosition *next)
int getPartId() const
double getHeight() const
LabelPosition is a candidate feature label position.
Definition: labelposition.h:51
int getNumOverlaps() const
Quadrant
Position of label candidate relative to feature.
Definition: labelposition.h:61
void setProblemIds(int probFid, int lpId)
Set problem feature ID and assigned label candidate ID.
Data structure to compute polygon&#39;s candidates costs.
LabelPosition::Quadrant quadrant