[kde-edu]: Label placing in Marble

Torsten Rahn torsten.rahn at credativ.de
Mon Oct 30 05:54:14 CET 2006


Hi,

I only found out this morning that placing labels had been a topic during the 
last few days. 
If you followed my blog/SVN commits you might have seen that I had worked on 
that same topic independently with regard to Marble during the past 2 weeks.

http://developer.kde.org/~tackat/marble/marble7.jpg

While the API might not be very pretty or generic, the algorithm might be of 
interest. My personal predefined requirements were:

- placemarks are allowed to be in four corner positions only. This has the 
disadvantage that in very, very rare circumstances for a map, labels might 
row up in the same horizontal line like Benoit had pointed out. However if 
you allow too many or random positions for the labels around the labeled 
points itself then it's actually harder in practice for the reader to assign 
the label correctly unless the label density is low. I also don't want lines 
to connect labels to the placemarks either (you usually don't see such in 
printed maps either). Also random positions make it harder to calculate the 
best position as you need expensive stuff like calculating the manhattan 
length, etc.  
- placemarks should be placed in order of importance (as a criteria I take the 
population) and should rather be "dropped" from the map than painted 
overlapping.
- labels should be placed in one go

I used a similar method as the 100x100 grid you're using to speed up 
calculation:
As I allow two possible positions above the labeled point and two below, that 
takes up 2*fontheight ((+x pixels if you want some distance between)) in 
terms of possibly covered height. So I divide the whole screen into 
horizontal rows of the height 2*fontheight. While assigning positions I sort 
each labeled position into one of those rows and compare the subsequent 
points only with the "own" row and the two direct neighbour rows.
(I also thought about optimizing in terms of horizontal space, but that turned 
out not to save any significant time)
That whole procedure is pretty fast and hence serves my needs. :-)

Next algorithm I plan to extend this to is rivers and oceans (which I intend 
to handle the same way).

Torsten





More information about the kde-edu mailing list