Hi list,

 

I'm trying to plot OS Mastermap data using Mapnik, and am having a bit of
trouble with the placement of the cartographic labels.

Rather than having the labels sourced from shape attributes, the dataset
defines all label text as separate features with:

- a point location

- the anchor location of the text relative to the point (i.e. Top left,
Middle bottom etc.)

- the angle at which the text should be oriented (rather curiously, measured
as an integer value in 10ths of a degree from 0 - 3599)

 

If I use a TextSymbolizer with placement=point, then I can place the labels
at the correct position relative to the point using a combination of the
vertical_alignment and dx/dy properties, but there doesn't seem to be any
way to specify the angle at which the text should be drawn. (i.e. there's no
equivalent to MapServer's ANGLE property)

 

So, instead, I've been applying some old-school trigonmetry to artificially
create lines at the appropriate angle, either starting or ending at the
anchor point in question, and drawing the text on the line using a
TextSymbolizer with the placement=line model instead. It's a lot slower,
since it's probably invoking lots of clever "wrapping text to wiggly lines"
computations that aren't required for my single line segment scenario, but
it does (nearly) get the results I want.

The problem I now have is that, by using the placement=line model, I appear
to have sacrificed the ability to specify whereabouts along the line the
label gets placed - there is no horizontal-alignment attribute when using a
TextSymbolizer on a line as far as I can tell - the label is always placed
in the centre of the line. 

That means the only way I can get the label drawn in the right place is if I
create the line to be exactly of the right length for the label to fit. If I
create it too big, the label is effectively "padded" away from its anchor
point (which lies at one end of the line) and misplaced. But, if I create
the line too small, the TextSymbolizer label attached to it won't be
rendered at all. The problem is that, seeing as I'm using a non-fixed width
font, the length of the text string (and therefore the offset) is different
for every individual label - I've tried computing an approximate line length
per length of label, but it's not reliable enough to be used.

 

Does anybody have any smart workarounds (or perhaps, a magical text-angle
property that I'm unaware of!) as to how to create angled text anchored to a
point?

 

Thanks!

_______________________________________________
Mapnik-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/mapnik-users

Reply via email to