Class ALspDiscreteLabelingAlgorithm
- All Implemented Interfaces:
ILcdCloneable
,ILspLabelingAlgorithm
,Cloneable
- Direct Known Subclasses:
ALspDiscreteLabelingAlgorithmWrapper
,TLspCompositeDiscreteLabelingAlgorithm
,TLspCurvedPathLabelingAlgorithm
,TLspInPathLabelingAlgorithm
,TLspLabelingAlgorithm
,TLspOnPathLabelingAlgorithm
This abstract class implements an abstract algorithm that can be used to compute label
placements. It tries a discrete number of placements for each label. It does so by first
iterating over all representations using an Iterator
. While iterating over the
representations, the algorithm iterates over a discrete number of placements for each
representation. It does so by using an other Iterator
. Each time a placement is returned,
this placement is evaluated using an ILspLabelPlacementEvaluator
. If the evaluator approves the placement for the representation, it
is added to the list of placements to be painted.
This abstract class also makes sure that the representations are sorted using their priority.
This abstract implementation also makes sure that edited or sticky label locations are correctly handled. So implementations of this abstract algorithm should not try to handle sticky or edited labels themselves.
When implementing this abstract algorithm, the following methods should be implemented :
When wrapping an ALspDiscreteLabelingAlgorithm
, these methods should be
implemented by creating an iterator or evaluator using the delegate algorithm, and returning a
wrapped iterator of evaluator. See also ALspDiscreteLabelingAlgorithmWrapper
.
This abstract class also stores a few statistics in the properties
of the ILspLabelingAlgorithm.LabelContext
. Algorithms can
choose to use these properties to implement certain features, like optimizations. The following
statistics are generated:
TOTAL_LABEL_COUNT_KEY
: the total amount of labels to be placed.LABEL_ATTEMPT_COUNT_KEY
: the amount of labels for which a placement was tried.CONSECUTIVE_LABEL_FAIL_COUNT_KEY
: the consecutive amount of labels for which no placement was found.CONSECUTIVE_LABEL_CONFLICT_FAIL_COUNT_KEY
: the consecutive amount of labels for which no placement was found due to conflicts in theILspLabelConflictChecker
.LABEL_FAIL_COUNT_KEY
: the amount of labels for which the algorithm didn't find a placement.LABEL_CONFLICT_FAIL_COUNT_KEY
: the amount of labels for which the algorithm didn't find a placement due to conflicts in theILspLabelConflictChecker
.LABEL_PLACED_COUNT_KEY
: the amount of labels for which the algorithm has found a placement.
- Since:
- 2012.0
-
Nested Class Summary
Nested classes/interfaces inherited from interface com.luciad.view.lightspeed.label.algorithm.ILspLabelingAlgorithm
ILspLabelingAlgorithm.LabelContext
-
Field Summary
Modifier and TypeFieldDescriptionstatic final String
This key is used to store the consecutive amount of labels for which no placement was found due to conflicts in theILspLabelConflictChecker
.static final String
This key is used to store the consecutive amount of labels for which no placement was found.static final String
This key is used to store the amount of labels for which the algorithm has tried to find a placement.static final String
This key is used to store the total amount of labels for which the algorithms has failed to find a placement due to a conflict in theILspLabelConflictChecker
.static final String
This key is used to store the total amount of labels for which the algorithm has failed to find a placement.static final String
This key is used to store the total amount of labels for which the algorithm has found a placement.static final String
This key is used to store the total amount of labels placed by the algorithm. -
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionclone()
MakesObject.clone()
public.protected abstract Iterator
<TLspLabelID> createLabelIterator
(List<TLspLabelID> aLabels, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Creates a newIterator
that iterates over theTLspLabelID
s.protected abstract ILspLabelPlacementEvaluator
createLabelPlacementEvaluator
(List<TLspLabelID> aLabels, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Creates a newILspLabelPlacementEvaluator
using the given parameters.protected abstract 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.abstract double
Returns the quality setting.final List
<TLspLabelPlacement> placeLabels
(List<TLspLabelID> aLabelIDs, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) abstract void
setQuality
(double aQuality) Sets the quality.
-
Field Details
-
TOTAL_LABEL_COUNT_KEY
This key is used to store the total amount of labels placed by the algorithm. This amount is stored in the properties as anInteger
.- See Also:
-
LABEL_ATTEMPT_COUNT_KEY
This key is used to store the amount of labels for which the algorithm has tried to find a placement. This amount is stored in the properties as anInteger
.- See Also:
-
CONSECUTIVE_LABEL_FAIL_COUNT_KEY
This key is used to store the consecutive amount of labels for which no placement was found. E.g. when the last 5 attempts to place a label failed, this property will be5
. When after that, a label placement succeeds, the property will be reset to0
. This amount is stored in the properties as anInteger
.- See Also:
-
CONSECUTIVE_LABEL_CONFLICT_FAIL_COUNT_KEY
This key is used to store the consecutive amount of labels for which no placement was found due to conflicts in theILspLabelConflictChecker
. E.g. when the last 5 attempts to place a label failed, this property will be5
. When after that, a label placement succeeds, the property will be reset to0
. This amount is stored in the properties as anInteger
.- See Also:
-
LABEL_CONFLICT_FAIL_COUNT_KEY
This key is used to store the total amount of labels for which the algorithms has failed to find a placement due to a conflict in theILspLabelConflictChecker
. This amount is stored in the properties as anInteger
.- See Also:
-
LABEL_FAIL_COUNT_KEY
This key is used to store the total amount of labels for which the algorithm has failed to find a placement. This amount is stored in the properties as anInteger
.- See Also:
-
LABEL_PLACED_COUNT_KEY
This key is used to store the total amount of labels for which the algorithm has found a placement. This amount is stored in the properties as anInteger
.- See Also:
-
-
Constructor Details
-
ALspDiscreteLabelingAlgorithm
public ALspDiscreteLabelingAlgorithm()
-
-
Method Details
-
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 classObject
- See Also:
-
setQuality
public abstract void setQuality(double aQuality) 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.
- Parameters:
aQuality
- the new quality. This is a number in [0, 1].- See Also:
-
getQuality
public abstract double getQuality()Returns the quality setting.- Returns:
- the quality setting.
- See Also:
-
placeLabels
public final List<TLspLabelPlacement> placeLabels(List<TLspLabelID> aLabelIDs, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) Description copied from interface:ILspLabelingAlgorithm
This method computes a list of label placements for the given
List
of labels. The returned label placements should contain a valid label location and label bounds. They should also point to their correspondingTLspLabelID
The returned
List
ofTLspLabelPlacement
s contains label placements that are either visible or invisible. When a placement is present in the list, it means that the location should be stored. When a placement in the list is marked as visible, it means that its location should be marked as visible in thelabel placer
- Specified by:
placeLabels
in interfaceILspLabelingAlgorithm
- Parameters:
aLabelIDs
- the labels to be placed.aLabelContext
- provides context information, such as priorities, PaintState, ...aConflictChecker
- the conflict checker that can be used to detect conflicts between labels.aView
- the view.- Returns:
- a list of label placements.
-
createLabelIterator
protected abstract Iterator<TLspLabelID> createLabelIterator(List<TLspLabelID> aLabels, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) 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.
- 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 abstract 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. 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.
- 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 abstract ILspLabelPlacementEvaluator createLabelPlacementEvaluator(List<TLspLabelID> aLabels, ILspLabelingAlgorithm.LabelContext aLabelContext, ILspLabelConflictChecker aConflictChecker, ILspView aView) 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.
- 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:
-