27 QList<QgsLabelPosition *> searchResults;
30 searchResults.push_back( const_cast< QgsLabelPosition * >( pos ) );
36 QList<QgsLabelPosition *>::const_iterator resultIt = searchResults.constBegin();
37 for ( ; resultIt != searchResults.constEnd(); ++resultIt )
39 if ( ( *resultIt )->labelGeometry.contains( &p ) )
41 posList.push_back( *resultIt );
48 QList<QgsLabelPosition> res;
49 res.reserve( mOwnedPositions.size() );
50 for (
const std::unique_ptr< QgsLabelPosition > &pos : mOwnedPositions )
59 QList<QgsLabelPosition *> searchResults;
60 mSpatialIndex.intersects( r, [&searchResults](
const QgsLabelPosition * pos )->
bool
67 QList<QgsLabelPosition *>::const_iterator resultIt = searchResults.constBegin();
68 for ( ; resultIt != searchResults.constEnd(); ++resultIt )
70 if ( ( *resultIt )->labelGeometry.intersects( r ) )
72 posList.push_back( *resultIt );
84 QVector<QgsPointXY> cornerPoints;
85 cornerPoints.reserve( 4 );
86 double xMin = std::numeric_limits< double >::max();
87 double yMin = std::numeric_limits< double >::max();
88 double xMax = std::numeric_limits< double >::lowest();
89 double yMax = std::numeric_limits< double >::lowest();
90 for (
int i = 0; i < 4; ++i )
93 const QPointF res = mTransform.map( QPointF( labelPos->
getX( i ), labelPos->
getY( i ) ) );
95 xMin = std::min( xMin, res.x() );
96 xMax = std::max( xMax, res.x() );
97 yMin = std::min( yMin, res.y() );
98 yMax = std::max( yMax, res.y() );
102 long long uniqueLinkedId = 0;
104 uniqueLinkedId = linkedId;
106 uniqueLinkedId = mNextFeatureId++;
110 auto newEntry = std::make_unique< QgsLabelPosition >( featureId, -labelPos->
getAlpha() * 180 / M_PI + mMapSettings.rotation(), cornerPoints, bounds,
111 labelPos->
getWidth(), labelPos->
getHeight(), layerName, labeltext, labelfont, labelPos->
getUpsideDown(), diagram, pinned, providerId, labelGeometry, isUnplaced );
112 newEntry->groupedLabelId = uniqueLinkedId;
113 mSpatialIndex.insert( newEntry.get(), bounds );
115 if ( uniqueLinkedId != 0 )
117 mLinkedLabelHash[ uniqueLinkedId ].append( newEntry.get() );
120 mOwnedPositions.emplace_back( std::move( newEntry ) );
124 return insertLabel( next, featureId, layerName, labeltext, labelfont, diagram, pinned, providerId, isUnplaced, uniqueLinkedId );
131 const QPointF origin = position.
origin();
132 const QPointF destination = position.
destination();
134 auto newEntry = std::make_unique< QgsCalloutPosition >( position );
136 mCalloutIndex.insert( newEntry.get(),
QgsRectangle( origin.x(), origin.y(), origin.x(), origin.y() ) );
137 mCalloutIndex.insert( newEntry.get(),
QgsRectangle( destination.x(), destination.y(), destination.x(), destination.y() ) );
139 mOwnedCalloutPositions.emplace_back( std::move( newEntry ) );
146 QList<const QgsCalloutPosition *> searchResults;
147 mCalloutIndex.intersects( rectangle, [&searchResults](
const QgsCalloutPosition * pos )->
bool
149 searchResults.push_back( pos );
153 std::sort( searchResults.begin(), searchResults.end() );
154 searchResults.erase( std::unique( searchResults.begin(), searchResults.end() ), searchResults.end() );
156 return searchResults;
161 return mLinkedLabelHash.value( groupId );
166 mMapSettings = settings;
171 const QgsPointXY center = mMapSettings.visibleExtent().center();
172 mTransform = QTransform::fromTranslate( center.
x(), center.
y() );
173 mTransform.rotate( mMapSettings.rotation() );
174 mTransform.translate( -center.
x(), -center.
y() );
178 mTransform = QTransform();
Represents the calculated placement of a map label callout line.
QPointF origin() const
Returns the origin of the callout line, in map coordinates.
QPointF destination() const
Returns the destination of the callout line, in map coordinates.
A geometry is the spatial representation of a feature.
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygonXY.
Represents the calculated placement of a map label.
QList< QgsLabelPosition * > groupedLabelPositions(long long groupId) const
Returns a list of all label positions sharing the same group ID (i.e.
bool insertLabel(pal::LabelPosition *labelPos, QgsFeatureId featureId, const QString &layerName, const QString &labeltext, const QFont &labelfont, bool diagram=false, bool pinned=false, const QString &providerId=QString(), bool isUnplaced=false, long long linkedId=0)
Inserts label position.
Q_DECL_DEPRECATED void clear()
Removes and deletes all the entries.
void label(const QgsPointXY &p, QList< QgsLabelPosition * > &posList) const
Returns label position(s) at a given point.
void labelsInRect(const QgsRectangle &r, QList< QgsLabelPosition * > &posList) const
Returns label position(s) in given rectangle.
QList< const QgsCalloutPosition * > calloutsInRectangle(const QgsRectangle &rectangle) const
Returns the list of callouts with origins or destinations inside the given rectangle.
bool insertCallout(const QgsCalloutPosition &position)
Inserts a rendered callout position.
void setMapSettings(const QgsMapSettings &settings)
Sets the map settings associated with the labeling run.
QList< QgsLabelPosition > allLabels() const
Returns a list of all labels generated by the labeling run.
Contains configuration for rendering maps.
A rectangle specified with double values.
LabelPosition is a candidate feature label position.
double getAlpha() const
Returns the angle to rotate text (in radians).
double getX(int i=0) const
Returns the down-left x coordinate.
double getY(int i=0) const
Returns the down-left y coordinate.
bool getUpsideDown() const
LabelPosition * nextPart() const
Returns the next part of this label position (i.e.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features