Class TLspInPathLabelingAlgorithm
- All Implemented Interfaces:
ILcdCloneable
,ILspLabelingAlgorithm
,Cloneable
Labeling algorithm that tries to place labels inside a path and keeps them inside the view. This algorithm checks the painted paths that are within the view and tries to add labels to them. These are located within the area defined by the path. This algorithm is typically used for placing labels for polygons or other closed shapes.
Note that this implementation does not support "holes" in paths.
The used label painter must be an ILspStampLocationLabelPainter
.
If not, the label will not be placed. The placed label location will be a
TLspStampLabelLocation
.
This algorithm has a computational overhead because it keeps the label inside the view. In order to use
a faster algorithm, that doesn't keep the label inside the view, TLspFixedInPathLabelLocationProvider
can be used.
- Since:
- 2012.0
-
Nested Class Summary
Nested classes/interfaces inherited from interface com.luciad.view.lightspeed.label.algorithm.ILspLabelingAlgorithm
ILspLabelingAlgorithm.LabelContext
-
Field Summary
Fields inherited from class com.luciad.view.lightspeed.label.algorithm.discrete.ALspDiscreteLabelingAlgorithm
CONSECUTIVE_LABEL_CONFLICT_FAIL_COUNT_KEY, CONSECUTIVE_LABEL_FAIL_COUNT_KEY, LABEL_ATTEMPT_COUNT_KEY, LABEL_CONFLICT_FAIL_COUNT_KEY, LABEL_FAIL_COUNT_KEY, LABEL_PLACED_COUNT_KEY, TOTAL_LABEL_COUNT_KEY
-
Constructor Summary
ConstructorDescriptionCreates a newTLspInPathLabelingAlgorithm
that can be used to place labels inside paths. -
Method Summary
Modifier and TypeMethodDescriptionclone()
MakesObject.clone()
public.protected Iterator
<TLspLabelID> createLabelIterator
(List<TLspLabelID> aLabels, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Creates a newIterator
that iterates over theTLspLabelID
s.protected ILspLabelPlacementEvaluator
createLabelPlacementEvaluator
(List<TLspLabelID> aLabels, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Creates a newILspLabelPlacementEvaluator
using the given parameters.protected Iterator
<TLspLabelPlacement> createLabelPlacementIterator
(TLspLabelID aLabel, ALspLabelLocations aCurrentLabelLocations, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Creates a newIterator
that iterates over theTLspLabelPlacement
s for the given label.double
Returns the minimum contour length for a clipped polygon to contain a label.double
Returns the quality setting.boolean
Returns if this algorithm reuses the previous label locations.void
setClipEdgeOffsets
(int aLeftOffset, int aRightOffset, int aBottomOffset, int aTopOffset) Calling this methods lets you define a clipping rectangle within the view.void
setMinimumPathLength
(double aMinimumPathLength) Sets the minimum outline length for a clipped polygon to contain a label.void
setQuality
(double aQuality) Sets the quality.void
setReusePreviousLocations
(boolean aReusePreviousLocations) When set totrue
, this algorithm will try to reuse the previous label locations.Methods inherited from class com.luciad.view.lightspeed.label.algorithm.discrete.ALspDiscreteLabelingAlgorithm
placeLabels
-
Constructor Details
-
TLspInPathLabelingAlgorithm
public TLspInPathLabelingAlgorithm()Creates a newTLspInPathLabelingAlgorithm
that can be used to place labels inside paths. These paths are created by a default path provider that discretizes the anchor of a label (seeILspLabelPainter.getAnchorObject
) or the domain object if no anchor is defined explicitly.
-
-
Method Details
-
setQuality
public void setQuality(double aQuality) Description copied from class:ALspDiscreteLabelingAlgorithm
Sets the quality. If the quality setting is high, the algorithm will try to place more labels. If it is low, the algorithm will only try to place a small portion of the labels, making label placement faster. Setting the quality to e.g.
0.5
can dramatically improve the label placement performance in some cases.E.g. it is possible that due to the quality setting, this algorithm will only try to place 10% of the labels. This may still result in high quality results, but this depends on the used data. In general, using a lower quality setting will still work well when the data (and its labels) are distributed uniformly over the screen.
By default, the quality is set to
1.0.
- Specified by:
setQuality
in classALspDiscreteLabelingAlgorithm
- Parameters:
aQuality
- the new quality. This is a number in [0, 1].- See Also:
-
getQuality
public double getQuality()Description copied from class:ALspDiscreteLabelingAlgorithm
Returns the quality setting.- Specified by:
getQuality
in classALspDiscreteLabelingAlgorithm
- Returns:
- the quality setting.
- See Also:
-
isReusePreviousLocations
public boolean isReusePreviousLocations()Returns if this algorithm reuses the previous label locations.- Returns:
true
if this algorithm reuses the previous label locations.- See Also:
-
setReusePreviousLocations
public void setReusePreviousLocations(boolean aReusePreviousLocations) When set totrue
, this algorithm will try to reuse the previous label locations. Reusing previous label locations causes the labels to be more stable, i.e. labels don't always move when for example the view is panned, or when objects are selected. This is because label positions are only recalculated when the previous label location has become invalid.The default value is
true
.- Parameters:
aReusePreviousLocations
-true
to enable reusing previous label locations, andfalse
to disable it.- See Also:
-
getMinimumPathLength
public double getMinimumPathLength()Returns the minimum contour length for a clipped polygon to contain a label.- Returns:
- the minimum contour length for a clipped polygon to contain a label.
- See Also:
-
setMinimumPathLength
public void setMinimumPathLength(double aMinimumPathLength) Sets the minimum outline length for a clipped polygon to contain a label. This length is expressed in pixels and should be positive. When a clipped polygon has an outline length smaller than the given length, no label will be placed.The default value is 0 pixels, i.e. no clipped polygon will be excluded.
- Parameters:
aMinimumPathLength
- the minimal length for a clipped polygon to contain a label.
-
setClipEdgeOffsets
public void setClipEdgeOffsets(int aLeftOffset, int aRightOffset, int aBottomOffset, int aTopOffset) Calling this methods lets you define a clipping rectangle within the view. This labeling algorithm will then try to keep the labels inside this clipping rectangle. By default, all offsets are 0, meaning that the clipping rectangle is the same as the view rectangle.- Parameters:
aLeftOffset
- the offset from the left edge of the viewaRightOffset
- the offset from the right edge of the viewaBottomOffset
- the offset from the bottom edge of the viewaTopOffset
- the offset from the top edge of the view- Since:
- 2018.0
-
clone
Description copied from interface:ILcdCloneable
Makes
When for example extending fromObject.clone()
public.java.lang.Object
, it can be implemented like this:public Object clone() { try { return super.clone(); } catch ( CloneNotSupportedException e ) { // Cannot happen: extends from Object and implements Cloneable (see also Object.clone) throw new RuntimeException( e ); } }
- Specified by:
clone
in interfaceILcdCloneable
- Overrides:
clone
in classALspDiscreteLabelingAlgorithm
- See Also:
-
createLabelIterator
protected Iterator<TLspLabelID> createLabelIterator(List<TLspLabelID> aLabels, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Description copied from class:ALspDiscreteLabelingAlgorithm
Creates a newIterator
that iterates over theTLspLabelID
s. The abstract algorithm will continue iterating overTLspLabelID
s as long asIterator.hasNext()
returnstrue
. When it returnsfalse
, no more label placements will be tried, andplaceLabels
returns.Iterator.hasNext()
should always be called before callingIterator.next()
, and if it returnstrue
,Iterator.next()
should never returnnull
.The implementation of this method should be as independent as possible. It should not rely on
createLabelPlacementIterator
orcreateLabelPlacementEvaluator
. Not respecting this might result in unexpected behaviour when wrapping or extending this class.Override this method to provide a custom implementation.
- Specified by:
createLabelIterator
in classALspDiscreteLabelingAlgorithm
- Parameters:
aLabels
- a list of labels that need to be placed.aLabelContext
- the label info object.aConflictChecker
- the conflict checker to be used when evaluating placements.aView
- the view.- Returns:
- a new
Iterator
that iterates overTLspLabelID
s.
-
createLabelPlacementIterator
protected Iterator<TLspLabelPlacement> createLabelPlacementIterator(TLspLabelID aLabel, ALspLabelLocations aCurrentLabelLocations, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Description copied from class:ALspDiscreteLabelingAlgorithm
Creates a newIterator
that iterates over theTLspLabelPlacement
s for the given label. The abstract algorithm will continue iterating overTLspLabelPlacement
s as long asIterator.hasNext()
returnstrue
. When it returnsfalse
, a new label will be tried.Iterator.hasNext()
should always be called before callingIterator.next()
, and if it returnstrue
,Iterator.next()
should never returnnull
.The implementation of this method should be as independent as possible. It should not rely on
createLabelIterator
orcreateLabelPlacementEvaluator
. Not respecting this might result in unexpected behaviour when wrapping or extending this class.The returned
TLspLabelPlacement
should be correctly initialized, that is it should at least be able to return a valid label location, bounds rectangle and bounds rotation. It should also reference its correspondingTLspLabelID
.Override this method to provide a custom implementation.
- Specified by:
createLabelPlacementIterator
in classALspDiscreteLabelingAlgorithm
- Parameters:
aLabel
- the identifier for which an iterator should be created.aCurrentLabelLocations
- an ALspLabelLocations object containing locations for the currently placed labels.aLabelContext
- the label info object.aConflictChecker
- the conflict checker to be used when evaluating placements.aView
- the view.- Returns:
- a new
Iterator
that iterates overTLspLabelPlacement
s.
-
createLabelPlacementEvaluator
protected ILspLabelPlacementEvaluator createLabelPlacementEvaluator(List<TLspLabelID> aLabels, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Description copied from class:ALspDiscreteLabelingAlgorithm
Creates a newILspLabelPlacementEvaluator
using the given parameters. It evaluates the placements returned bycreateLabelPlacementIterator
, and returns aPlacementResult
to denote if the placement should be used for its label or not.The following actions are undertaken for the following placement results :
PlacementResult.SUCCESS
: the given placement will be used for its label, it will be added to the list of placed representations, and it will be added to the givenILspLabelConflictChecker
. After that,ILspLabelPlacementEvaluator.placementApplied
will be called and no more placements are tried for the label.PlacementResult.FALLBACK
: the abstract algorithm will try to find an other placements which returnsPlacementResult.SUCCESS
. When no such placement is found, this placement will be added to the list of placed labels, and it will be added to the givenILspLabelConflictChecker
. After that,ILspLabelPlacementEvaluator.placementApplied
will be called.PlacementResult.TRY_NEW_PLACEMENT
: the abstract algorithm will try to find an other placement which returnsPlacementResult.SUCCESS
orPlacementResult.FALLBACK
. When no such placement is found,ILspLabelPlacementEvaluator.noPlacementApplied
is called.PlacementResult.FAILED
: the abstract algorithm will immediately callILspLabelPlacementEvaluator.noPlacementApplied
and will not try to find other placements for the label.
Override this method to provide a custom implementation.
- Specified by:
createLabelPlacementEvaluator
in classALspDiscreteLabelingAlgorithm
- Parameters:
aLabels
- a list of labels.aLabelContext
- the label info object.aConflictChecker
- the conflict checker to be used when evaluating placements.aView
- the view- Returns:
- a new
ILspLabelPlacementEvaluator
. - See Also:
-