Class TLspLabelingAlgorithm
- All Implemented Interfaces:
ILcdCloneable
,ILspLabelingAlgorithm
,Cloneable
This algorithm is a greedy algorithm that uses a ALspLabelLocationProvider
to retrieve possible placements. It tries to place labels in the
order provided to the createLabelIterator
method. It tries to place
them one by one, and when it cannot be placed without overlap, it is omitted.
- 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 new algorithm with a default label location provider.TLspLabelingAlgorithm
(ALspLabelLocationProvider aLabelLocationProvider) Creates a new algorithm based on the given label location provider. -
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.int
Returns the threshold priority for forced placement.Returns the label location provider used by this algorithm.int
Returns the maximum number of placements tried per label.double
Returns the quality setting.boolean
Returns if this algorithm reuses the previous label locations.void
setForcedPlacementThresholdPriority
(int aPriority) Sets the threshold priority for forced placement.void
setMaxPlacementsPerLabel
(int aMaxPlacementsPerLabel) Sets the maximum number of placements per label that is tried.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
-
TLspLabelingAlgorithm
public TLspLabelingAlgorithm()Creates a new algorithm with a default label location provider. The default provider will return placements based on the cardinal and inter-cardinal directions. -
TLspLabelingAlgorithm
Creates a new algorithm based on the given label location provider.- Parameters:
aLabelLocationProvider
- a label location provider.
-
-
Method Details
-
getLabelLocationProvider
Returns the label location provider used by this algorithm.- Returns:
- the label location provider
-
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:
-
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:
-
setForcedPlacementThresholdPriority
public void setForcedPlacementThresholdPriority(int aPriority) Sets the threshold priority for forced placement. The labels of objects with a priority value less than or equal to the threshold priority value will always be placed, even if the algorithm could not find any suitable place for the label. This makes it possible for labels to overlap. The default value is-1
, in which case no forced painting is done.- Parameters:
aPriority
- the threshold priority for forced placement.- See Also:
-
getForcedPlacementThresholdPriority
public int getForcedPlacementThresholdPriority()Returns the threshold priority for forced placement.- Returns:
- the threshold priority for forced placement.
- See Also:
-
getMaxPlacementsPerLabel
public int getMaxPlacementsPerLabel()Returns the maximum number of placements tried per label.- Returns:
- the maximum number of placements tried per label.
- See Also:
-
setMaxPlacementsPerLabel
public void setMaxPlacementsPerLabel(int aMaxPlacementsPerLabel) Sets the maximum number of placements per label that is tried. This number doesn't include a placement tried for the previous location of the label. By default, the maximum number of placements per label isInteger.MAX_VALUE
, i.e. all possible placements are tried.- Parameters:
aMaxPlacementsPerLabel
- the maximum number of placements tried per label.- 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:
-