QGIS API Documentation 3.39.0-Master (d85f3c2a281)
Loading...
Searching...
No Matches
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
41namespace 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
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
97 LabelPosition( const LabelPosition &other );
98
99 ~LabelPosition() override;
100
106 bool intersects( const GEOSPreparedGeometry *geometry );
107
113 bool within( const GEOSPreparedGeometry *geometry );
114
123 bool isInConflict( const LabelPosition *ls ) const;
124
131 void getBoundingBox( double amin[2], double amax[2] ) const;
132
138 QgsRectangle boundingBox() const;
139
145 QgsRectangle boundingBoxForCandidateConflicts( Pal *pal ) const;
146
151 bool outerBoundingBoxIntersects( const LabelPosition *other ) const;
152
160 double getDistanceToPoint( double xp, double yp, bool useOuterBounds ) const;
161
167 bool crossesLine( PointSet *line ) const;
168
174 bool crossesBoundary( PointSet *polygon ) const;
175
180 int polygonIntersectionCost( PointSet *polygon ) const;
181
187 bool intersectsWithPolygon( PointSet *polygon ) const;
188
192 int getId() const;
193
197 FeaturePart *getFeaturePart() const;
198
199 int getNumOverlaps() const { return nbOverlap; }
200 void resetNumOverlaps() { nbOverlap = 0; } // called from problem.cpp, pal.cpp
201
205 void incrementNumOverlaps() { nbOverlap++; }
206
210 void decrementNumOverlaps() { nbOverlap++; }
211
212 int getProblemFeatureId() const { return probFeat; }
213
218 void setProblemIds( int probFid, int lpId )
219 {
220 probFeat = probFid;
221 id = lpId;
222 if ( mNextPart ) mNextPart->setProblemIds( probFid, lpId );
223 }
224
229 double cost() const { return mCost; }
230
236 void setCost( double newCost ) { mCost = newCost; }
237
244 void setConflictsWithObstacle( bool conflicts );
245
250 bool conflictsWithObstacle() const { return mHasObstacleConflict; }
251
258 void setHasHardObstacleConflict( bool conflicts );
259
266 bool hasHardObstacleConflict() const { return mHasHardConflict; }
267
269 void validateCost();
270
275 double getX( int i = 0 ) const;
276
281 double getY( int i = 0 ) const;
282
283 double getWidth() const { return w; }
284 double getHeight() const { return h; }
285
289 double getAlpha() const;
290
291 bool getReversed() const { return reversed; }
292 bool getUpsideDown() const { return upsideDown; }
293
294 Quadrant getQuadrant() const { return quadrant; }
295
301 LabelPosition *nextPart() const { return mNextPart.get(); }
302
308 void setNextPart( std::unique_ptr< LabelPosition > next ) { mNextPart = std::move( next ); }
309
310 // -1 if not multi-part
311 int getPartId() const { return partId; }
312 void setPartId( int id ) { partId = id; }
313
319 void setUpsideDownCharCount( int count ) { mUpsideDownCharCount = count ; }
320
326 int upsideDownCharCount() const { return mUpsideDownCharCount; }
327
331 void removeFromIndex( PalRtree<LabelPosition> &index );
332
336 void insertIntoIndex( PalRtree<LabelPosition> &index );
337
343 const GEOSGeometry *multiPartGeom() const;
344
350 const GEOSPreparedGeometry *preparedMultiPartGeom() const;
351
357 const GEOSPreparedGeometry *preparedOuterBoundsGeom() const;
358
367 unsigned int globalId() const { return mGlobalId; }
368
375 void setGlobalId( unsigned int id ) { mGlobalId = id; }
376
380 double angleDifferential();
381
382 protected:
383
384 int id;
385
386 FeaturePart *feature = nullptr;
387
388 // bug # 1 (maxence 10/23/2008)
390
392
394 double alpha;
395
396 double w;
397 double h;
398
400
401 //True if label direction is the same as line / polygon ring direction.
402 //Could be used by the application to draw a directional arrow ('<' or '>')
403 //if the layer arrangement is P_LINE
405
407
409
410 private:
411
412 unsigned int mGlobalId = 0;
413 std::unique_ptr< LabelPosition > mNextPart;
414
415 std::vector< double > mOuterBoundsX;
416 std::vector< double > mOuterBoundsY;
417
418 double mOuterBoundsXMin = std::numeric_limits<double>::max();
419 double mOuterBoundsXMax = std::numeric_limits<double>::lowest();
420 double mOuterBoundsYMin = std::numeric_limits<double>::max();
421 double mOuterBoundsYMax = std::numeric_limits<double>::lowest();
422
423 geos::unique_ptr mOuterBoundsGeos;
424 const GEOSPreparedGeometry *mPreparedOuterBoundsGeos = nullptr;
425
426 double mCost;
427 bool mHasObstacleConflict;
428 bool mHasHardConflict = false;
429 int mUpsideDownCharCount;
430
434 int partCount() const;
435
440 double polygonIntersectionCostForParts( PointSet *polygon ) const;
441
445 void createMultiPartGeosGeom() const;
446
447 bool isInConflictMultiPart( const LabelPosition *lp ) const;
448
449 void createOuterBoundsGeom();
450
451 LabelPosition &operator=( const LabelPosition & ) = delete;
452 };
453
454} // end namespace
455
456#endif
A rtree spatial index for use in the pal labeling engine.
Definition palrtree.h:36
A rectangle specified with double values.
Calculates label candidate costs considering different factors.
Main class to handle feature.
Definition feature.h:65
LabelPosition is a candidate feature label position.
Quadrant
Position of label candidate relative to feature.
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.
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
LabelPosition * nextPart() const
Returns the next part of this label position (i.e.
Main Pal labeling class.
Definition pal.h:84
The underlying raw pal geometry class.
Definition pointset.h:77
struct GEOSGeom_t GEOSGeometry
Definition util.h:41