QGIS API Documentation 3.43.0-Master (b60ef06885e)
feature.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 FEATURE_H
31#define FEATURE_H
32
33#define SIP_NO_FILE
34
35
36#include "qgis_core.h"
37#include "pointset.h"
38#include "labelposition.h" // for LabelPosition enum
39#include "qgslabelfeature.h"
41#include <iostream>
42#include <fstream>
43#include <cmath>
44#include <QString>
45
46namespace pal
47{
48 class LabelPosition;
49 class FeaturePart;
50
57 class CORE_EXPORT FeaturePart : public PointSet
58 {
59
60 public:
61
64 {
67 NegativeOffset
68 };
69
75 FeaturePart( QgsLabelFeature *lf, const GEOSGeometry *geom );
76
77 FeaturePart( const FeaturePart &other );
78
82 ~FeaturePart() override;
83
87 QgsLabelFeature *feature() { return mLF; }
88
92 Layer *layer();
93
97 QgsFeatureId featureId() const;
98
102 std::size_t maximumPointCandidates() const;
103
107 std::size_t maximumLineCandidates() const;
108
112 std::size_t maximumPolygonCandidates() const;
113
117 std::vector<std::unique_ptr<LabelPosition> > createCandidates( Pal *pal );
118
127 std::size_t createCandidatesAroundPoint( double x, double y, std::vector<std::unique_ptr<LabelPosition> > &lPos, double angle );
128
137 std::size_t createCandidatesOverPoint( double x, double y, std::vector<std::unique_ptr<LabelPosition> > &lPos, double angle );
138
147 std::size_t createCandidateCenteredOverPoint( double x, double y, std::vector<std::unique_ptr<LabelPosition> > &lPos, double angle );
148
155 std::unique_ptr< LabelPosition > createCandidatePointOnSurface( PointSet *mapShape );
156
165 std::size_t createCandidatesAtOrderedPositionsOverPoint( double x, double y, std::vector<std::unique_ptr<LabelPosition> > &lPos, double angle );
166
175 std::size_t createCandidatesAlongLine( std::vector<std::unique_ptr<LabelPosition> > &lPos, PointSet *mapShape, bool allowOverrun, Pal *pal );
176
184 std::size_t createHorizontalCandidatesAlongLine( std::vector<std::unique_ptr<LabelPosition> > &lPos, PointSet *mapShape, Pal *pal );
185
194 std::size_t createCandidatesAlongLineNearStraightSegments( std::vector<std::unique_ptr<LabelPosition> > &lPos, PointSet *mapShape, Pal *pal );
195
206 std::size_t createCandidatesAlongLineNearMidpoint( std::vector<std::unique_ptr<LabelPosition> > &lPos, PointSet *mapShape, double initialCost = 0.0, Pal *pal = nullptr );
207
219 std::unique_ptr< LabelPosition > curvedPlacementAtOffset( PointSet *mapShape, const std::vector<double> &pathDistances,
220 QgsTextRendererUtils::LabelLineDirection direction, double distance, bool &labeledLineSegmentIsRightToLeft, bool applyAngleConstraints,
222
231 std::size_t createCurvedCandidatesAlongLine( std::vector<std::unique_ptr<LabelPosition> > &lPos, PointSet *mapShape, bool allowOverrun, Pal *pal );
232
240 std::size_t createCandidatesForPolygon( std::vector<std::unique_ptr<LabelPosition> > &lPos, PointSet *mapShape, Pal *pal );
241
248 std::size_t createCandidatesOutsidePolygon( std::vector<std::unique_ptr<LabelPosition> > &lPos, Pal *pal );
249
256 bool hasSameLabelFeatureAs( FeaturePart *part ) const;
257
261 double getLabelWidth( double angle = 0.0 ) const { return mLF->size( angle ).width(); }
262
266 double getLabelHeight( double angle = 0.0 ) const { return mLF->size( angle ).height(); }
267
272 double getLabelDistance() const { return mLF->distLabel(); }
273
275 bool hasFixedRotation() const { return mLF->hasFixedAngle(); }
276
278 double fixedAngle() const { return mLF->fixedAngle(); }
279
281 bool hasFixedPosition() const { return mLF->hasFixedPosition(); }
282
287 bool alwaysShow() const { return mLF->alwaysShow(); }
288
292 const QgsLabelObstacleSettings &obstacleSettings() const { return mLF->obstacleSettings(); }
293
295 double repeatDistance() const { return mLF->repeatDistance(); }
296
298 int getNumSelfObstacles() const { return mHoles.count(); }
300 FeaturePart *getSelfObstacle( int i ) { return mHoles.at( i ); }
301
303 bool isConnected( FeaturePart *p2 );
304
309 bool mergeWithFeaturePart( FeaturePart *other );
310
316 void addSizePenalty( std::vector<std::unique_ptr<LabelPosition> > &lPos, double bbx[4], double bby[4] ) const;
317
322 double calculatePriority() const;
323
325 bool onlyShowUprightLabels() const;
326
331 int totalRepeats() const;
332
337 void setTotalRepeats( int repeats );
338
339 protected:
340
341 QgsLabelFeature *mLF = nullptr;
342 QList<FeaturePart *> mHoles;
343
345 void extractCoords( const GEOSGeometry *geom );
346
347 private:
348
349 Qgis::LabelQuadrantPosition quadrantFromOffset() const;
350
351 int mTotalRepeats = 0;
352
353 mutable std::size_t mCachedMaxLineCandidates = 0;
354 mutable std::size_t mCachedMaxPolygonCandidates = 0;
355
356 FeaturePart &operator= ( const FeaturePart & ) = delete;
357 };
358
359} // end namespace pal
360
361#endif
LabelQuadrantPosition
Label quadrant positions.
Definition qgis.h:1219
Describes a feature that should be used within the labeling engine.
Contains settings related to how the label engine treats features as obstacles.
LabelLineDirection
Controls behavior of curved text with respect to line directions.
QFlags< CurvedTextFlag > CurvedTextFlags
Flags controlling behavior of curved text generation.
Represents a part of a label feature.
Definition feature.h:58
bool hasFixedRotation() const
Returns true if the feature's label has a fixed rotation.
Definition feature.h:275
double getLabelHeight(double angle=0.0) const
Returns the height of the label, optionally taking an angle (in radians) into account.
Definition feature.h:266
QList< FeaturePart * > mHoles
Definition feature.h:342
double getLabelDistance() const
Returns the distance from the anchor point to the label.
Definition feature.h:272
bool hasFixedPosition() const
Returns true if the feature's label has a fixed position.
Definition feature.h:281
double fixedAngle() const
Returns the fixed angle for the feature's label.
Definition feature.h:278
double repeatDistance() const
Returns the distance between repeating labels for this feature.
Definition feature.h:295
int getNumSelfObstacles() const
Gets number of holes (inner rings) - they are considered as obstacles.
Definition feature.h:298
double getLabelWidth(double angle=0.0) const
Returns the width of the label, optionally taking an angle (in radians) into account.
Definition feature.h:261
const QgsLabelObstacleSettings & obstacleSettings() const
Returns the feature's obstacle settings.
Definition feature.h:292
bool alwaysShow() const
Returns true if the feature's label should always been shown, even when it collides with other labels...
Definition feature.h:287
QgsLabelFeature * feature()
Returns the parent feature.
Definition feature.h:87
PathOffset
Path offset variances used in curved placement.
Definition feature.h:64
FeaturePart * getSelfObstacle(int i)
Gets hole (inner ring) - considered as obstacle.
Definition feature.h:300
A set of features which influence the labeling process.
Definition layer.h:62
Main Pal labeling class.
Definition pal.h:83
The underlying raw pal geometry class.
Definition pointset.h:77
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
struct GEOSGeom_t GEOSGeometry
Definition util.h:41