[OSM-talk-fr] Un rendu statique pour ma commune
Nicolas Dumoulin
nicolas_openstreetmap.org at dumoulin63.net
Mar 1 Fév 14:55:06 UTC 2011
Le mardi 1 février 2011 15:20:05 Maurice, vous avez écrit :
> Sensible à l'avis d'un cartographe, je remarque deux graves manquements
> sur ta carte:
> 1) l'orientation, même si on peut supposer le nord par défaut en haut de la
> carte;
> 2) l'échelle, indispensable.
Je te l'accorde, mais ça faisait pas partie de la demande :-)
J'ai fait d'autres plans avec ces informations complémentaires
http://osm.dumoulin63.net/rendus/fub2011.zip
Pour générer l'échelle, voici mon code (pas encore documenté, mais une doc est à venir encore une fois) :
# constant used to convert from metres (i.e. map units) to points (i.e. screen/paper units)
# (72 points per inch, 1/2.54 inches per cm) see http://oliverobrien.co.uk/2010/03/map-adornments-with-cairo/
S2P=72/0.0254
factor=2
def myCairoDraw(m, map_uri, imgx, imgy):
# With cairo
import cairo, math
surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, imgx, imgy)
ctx = cairo.Context(surface)
mapnik.render(m, ctx)
legendW=550*factor
legendH=150*factor
ctx.translate (imgx-legendW, imgy-legendH)
# Frame
pat = cairo.LinearGradient (0.0, 0.0, 0.0, 150.0)
pat.add_color_stop_rgba (1, 0.8, 0.8, 0.8, 0.5) # First stop, 50% opacity
pat.add_color_stop_rgba (0, 1, 1, 1, 1) # Last stop, 100% opacity
ctx.rectangle (0, 0, legendW, legendH) # Rectangle(x0, y0, x1, y1)
ctx.set_source (pat)
ctx.fill ()
ctx.set_source_rgb(0.2, 0.2, 0.2)
ctx.select_font_face("Georgia", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
ctx.translate(50*factor,0)
# Title
ctx.translate(0,40*factor)
ctx.move_to(0, 0)
ctx.set_font_size(14*factor)
ctx.show_text("Congrès de la FUB 2011 − Clermont-Ferrand")
ctx.set_font_size(12*factor)
# Scale
ctx.translate(0,40*factor)
drawScale(ctx, 270*factor,m.scale_denominator())
# Orientation
ctx.save()
ctx.translate(350*factor, 0)
ctx.set_font_size(16*factor)
ctx.move_to(0,0)
ctx.show_text("N")
ctx.set_font_size(12*factor)
ctx.translate(30*factor, 0)
ctx.set_line_width(1*factor)
ctx.move_to(0, -20*factor)
ctx.line_to(10*factor, 10*factor)
ctx.line_to(0, 5*factor)
ctx.line_to(-10*factor, 10*factor)
ctx.close_path()
ctx.fill()
ctx.restore()
# Attribution text
ctx.translate(0,40*factor)
ctx.move_to(0, 0)
ctx.show_text("Données © OpenStreetMap et ses contributeurs CC-By-SA-2.0")
surface.write_to_png (map_uri)
def drawScale(ctx, length, scale):
scaleMeters=length/scale*S2P
divider=1;
while (scaleMeters/divider > 10):
divider = divider * 10;
maxMeters=int(scaleMeters)/divider*divider
maxScaleLength = maxMeters*scale/S2P
#print str(scale)+" "+str(270/scale*S2P)+" "+str(divider)+" "+str(maxMeters)+" "+str(maxScaleLength)
ctx.set_line_width(3*factor)
ctx.move_to(0, 10*factor)
ctx.line_to(maxScaleLength, 10*factor)
ctx.stroke()
drawScaleTick(ctx, ctx.get_line_width())
drawScaleTick(ctx, maxScaleLength/2)
drawScaleTick(ctx, maxScaleLength)
ctx.move_to(-10*factor, 0)
ctx.show_text("0")
ctx.move_to(maxScaleLength/2-20*factor, 0)
ctx.show_text(str(maxMeters/2)+"m")
ctx.move_to(maxScaleLength-20*factor, 0)
ctx.show_text(str(maxMeters)+"m")
def drawScaleTick(ctx, position):
ctx.move_to(position-ctx.get_line_width()/2, 10*factor)
ctx.line_to(position-ctx.get_line_width()/2, 5*factor)
ctx.stroke()
--
Nicolas Dumoulin
http://wiki.openstreetmap.org/wiki/User:NicolasDumoulin
Plus d'informations sur la liste de diffusion Talk-fr