[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