QGIS API Documentation  2.12.0-Lyon
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 
48  class CORE_EXPORT LabelPosition : public PointSet
49  {
50  friend class CostCalculator;
51  friend class PolygonCostCalculator;
52 
53  public:
54 
58  enum Quadrant
59  {
68  QuadrantBelowRight
69  };
70 
85  LabelPosition( int id, double x1, double y1,
86  double w, double h,
87  double alpha, double cost,
88  FeaturePart *feature, bool isReversed = false, Quadrant quadrant = QuadrantOver );
89 
91  LabelPosition( const LabelPosition& other );
92 
93  ~LabelPosition() { delete nextPart; }
94 
100  bool isIn( double *bbox );
101 
107  bool isIntersect( double *bbox );
108 
114  bool isInside( double *bbox );
115 
122  bool isInConflict( LabelPosition *ls );
123 
125  void getBoundingBox( double amin[2], double amax[2] ) const;
126 
128  double getDistanceToPoint( double xp, double yp ) const;
129 
131  bool crossesLine( PointSet* line ) const;
132 
134  bool crossesBoundary( PointSet* polygon ) const;
135 
139  int polygonIntersectionCost( PointSet* polygon ) const;
140 
142  void offsetPosition( double xOffset, double yOffset );
143 
147  int getId() const;
148 
149 
153  FeaturePart * getFeaturePart();
154 
155  double getNumOverlaps() const { return nbOverlap; }
156  void resetNumOverlaps() { nbOverlap = 0; } // called from problem.cpp, pal.cpp
157 
158  int getProblemFeatureId() const { return probFeat; }
161  void setProblemIds( int probFid, int lpId )
162  {
163  probFeat = probFid; id = lpId;
164  if ( nextPart ) nextPart->setProblemIds( probFid, lpId );
165  }
166 
170  double cost() const { return mCost; }
171 
176  void setCost( double newCost ) { mCost = newCost; }
177 
183  void setConflictsWithObstacle( bool conflicts );
184 
188  bool conflictsWithObstacle() const { return mHasObstacleConflict; }
189 
191  void validateCost();
192 
197  double getX( int i = 0 ) const;
202  double getY( int i = 0 ) const;
203 
204  double getWidth() const { return w; }
205  double getHeight() const { return h; }
206 
211  double getAlpha() const;
212  bool getReversed() const { return reversed; }
213  bool getUpsideDown() const { return upsideDown; }
214 
215  Quadrant getQuadrant() const { return quadrant; }
216 
217  void print();
218 
219  LabelPosition* getNextPart() const { return nextPart; }
220  void setNextPart( LabelPosition* next ) { nextPart = next; }
221 
222  // -1 if not multi-part
223  int getPartId() const { return partId; }
224  void setPartId( int id ) { partId = id; }
225 
226 
227  void removeFromIndex( RTree<LabelPosition*, double, 2, double> *index );
228  void insertIntoIndex( RTree<LabelPosition*, double, 2, double> *index );
229 
230  typedef struct
231  {
234  } PruneCtx;
235 
237  static bool pruneCallback( LabelPosition *lp, void *ctx );
238 
239  // for sorting
240  static bool costShrink( void *l, void *r );
241  static bool costGrow( void *l, void *r );
242 
243  // for counting number of overlaps
244  typedef struct
245  {
247  int *nbOv;
248  double *cost;
249  double *inactiveCost;
250  //int *feat;
251  } CountContext;
252 
253  /*
254  * count overlap, ctx = p_lp
255  */
256  static bool countOverlapCallback( LabelPosition *lp, void *ctx );
257 
258  static bool countFullOverlapCallback( LabelPosition *lp, void *ctx );
259 
260  static bool removeOverlapCallback( LabelPosition *lp, void *ctx );
261 
262  // for polygon cost calculation
263  static bool polygonObstacleCallback( pal::FeaturePart *obstacle, void *ctx );
264 
265  protected:
266 
267  int id;
268 
270 
271  // bug # 1 (maxence 10/23/2008)
272  int probFeat;
273 
275 
276  double alpha;
277  double w;
278  double h;
279 
281  int partId;
282 
283  //True if label direction is the same as line / polygon ring direction.
284  //Could be used by the application to draw a directional arrow ('<' or '>')
285  //if the layer arrangement is P_LINE
286  bool reversed;
287 
289 
291 
292  bool isInConflictSinglePart( LabelPosition* lp );
293  bool isInConflictMultiPart( LabelPosition* lp );
294 
295  private:
296  double mCost;
297  bool mHasObstacleConflict;
298 
301  int partCount() const;
302 
306  double polygonIntersectionCostForParts( PointSet* polygon ) const;
307 
308  };
309 
310 } // end namespace
311 
312 #endif
FeaturePart * feature
static unsigned index
double getWidth() const
void setCost(double newCost)
Sets the candidate label position's geographical cost.
double cost() const
Returns the candidate label position's geographical cost.
Pal main class.
Definition: pal.h:111
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:79
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:48
Quadrant
Position of label candidate relative to feature.
Definition: labelposition.h:58
double getNumOverlaps() const
void setProblemIds(int probFid, int lpId)
Set problem feature ID and assigned label candidate ID.
Data structure to compute polygon's candidates costs.
LabelPosition::Quadrant quadrant