QGIS API Documentation  2.11.0-Master
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 
137  int getNumPointsInPolygon( PointSet* polygon ) const;
138 
140  void offsetPosition( double xOffset, double yOffset );
141 
145  int getId() const;
146 
147 
151  FeaturePart * getFeaturePart();
152 
153  double getNumOverlaps() const { return nbOverlap; }
154  void resetNumOverlaps() { nbOverlap = 0; } // called from problem.cpp, pal.cpp
155 
156  int getProblemFeatureId() const { return probFeat; }
159  void setProblemIds( int probFid, int lpId )
160  {
161  probFeat = probFid; id = lpId;
162  if ( nextPart ) nextPart->setProblemIds( probFid, lpId );
163  }
164 
166  QString getLayerName() const;
167 
171  double cost() const { return mCost; }
172 
177  void setCost( double newCost ) { mCost = newCost; }
178 
184  void setConflictsWithObstacle( bool conflicts );
185 
189  bool conflictsWithObstacle() const { return mHasObstacleConflict; }
190 
192  void validateCost();
193 
198  double getX( int i = 0 ) const;
203  double getY( int i = 0 ) const;
204 
205  double getWidth() const { return w; }
206  double getHeight() const { return h; }
207 
212  double getAlpha() const;
213  bool getReversed() const { return reversed; }
214  bool getUpsideDown() const { return upsideDown; }
215 
216  Quadrant getQuadrant() const { return quadrant; }
217 
218  void print();
219 
220  LabelPosition* getNextPart() const { return nextPart; }
221  void setNextPart( LabelPosition* next ) { nextPart = next; }
222 
223  // -1 if not multi-part
224  int getPartId() const { return partId; }
225  void setPartId( int id ) { partId = id; }
226 
227 
228  void removeFromIndex( RTree<LabelPosition*, double, 2, double> *index );
229  void insertIntoIndex( RTree<LabelPosition*, double, 2, double> *index );
230 
231  typedef struct
232  {
235  } PruneCtx;
236 
238  static bool pruneCallback( LabelPosition *lp, void *ctx );
239 
240  // for sorting
241  static bool costShrink( void *l, void *r );
242  static bool costGrow( void *l, void *r );
243 
244  // for counting number of overlaps
245  typedef struct
246  {
248  int *nbOv;
249  double *cost;
250  double *inactiveCost;
251  //int *feat;
252  } CountContext;
253 
254  /*
255  * count overlap, ctx = p_lp
256  */
257  static bool countOverlapCallback( LabelPosition *lp, void *ctx );
258 
259  static bool countFullOverlapCallback( LabelPosition *lp, void *ctx );
260 
261  static bool removeOverlapCallback( LabelPosition *lp, void *ctx );
262 
263  // for polygon cost calculation
264  static bool polygonObstacleCallback( pal::FeaturePart *obstacle, void *ctx );
265 
266  protected:
267 
268  int id;
269 
271 
272  // bug # 1 (maxence 10/23/2008)
273  int probFeat;
274 
276 
277  double alpha;
278  double w;
279  double h;
280 
282  int partId;
283 
284  //True if label direction is the same as line / polygon ring direction.
285  //Could be used by the application to draw a directional arrow ('<' or '>')
286  //if the layer arrangement is P_LINE
287  bool reversed;
288 
290 
292 
293  bool isInConflictSinglePart( LabelPosition* lp );
294  bool isInConflictMultiPart( LabelPosition* lp );
295 
296  private:
297  double mCost;
298  bool mHasObstacleConflict;
299 
300  };
301 
302 } // end namespace
303 
304 #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:109
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:203
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