kopia lustrzana https://github.com/hholzgra/ocitysmap
				
				
				
			Merge branch 'cover-page'
						commit
						0d5768547c
					
				| 
						 | 
				
			
			@ -31,6 +31,8 @@ import cairo
 | 
			
		|||
import mapnik
 | 
			
		||||
import coords
 | 
			
		||||
import locale
 | 
			
		||||
import pangocairo
 | 
			
		||||
import pango
 | 
			
		||||
 | 
			
		||||
from itertools import groupby
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -310,8 +312,89 @@ class MultiPageRenderer(Renderer):
 | 
			
		|||
        c1 = self._proj.inverse(mapnik.Coord(envelope.maxx, envelope.maxy))
 | 
			
		||||
        return coords.BoundingBox(c0.y, c0.x, c1.y, c1.x)
 | 
			
		||||
 | 
			
		||||
    def _render_front_page(self, ctx, cairo_surface, dpi):
 | 
			
		||||
 | 
			
		||||
        ctx.save()
 | 
			
		||||
 | 
			
		||||
        # Draw a nice grey rectangle covering the whole page
 | 
			
		||||
        ctx.set_source_rgb(.85,.85,.85)
 | 
			
		||||
        ctx.rectangle(Renderer.PRINT_SAFE_MARGIN_PT,
 | 
			
		||||
                      Renderer.PRINT_SAFE_MARGIN_PT,
 | 
			
		||||
                      self._usable_area_width_pt,
 | 
			
		||||
                      self._usable_area_height_pt)
 | 
			
		||||
        ctx.fill()
 | 
			
		||||
 | 
			
		||||
        ctx.save()
 | 
			
		||||
 | 
			
		||||
        # Translate into the working area, taking another
 | 
			
		||||
        # PRINT_SAFE_MARGIN_PT inside the grey area.
 | 
			
		||||
        ctx.translate(2 * Renderer.PRINT_SAFE_MARGIN_PT,
 | 
			
		||||
                      2 * Renderer.PRINT_SAFE_MARGIN_PT)
 | 
			
		||||
        w = self._usable_area_width_pt - 2 * Renderer.PRINT_SAFE_MARGIN_PT
 | 
			
		||||
        h = self._usable_area_height_pt - 2 * Renderer.PRINT_SAFE_MARGIN_PT
 | 
			
		||||
 | 
			
		||||
        # Draw a light blue block which will contain the name of the
 | 
			
		||||
        # city being rendered.
 | 
			
		||||
        blue_w = w
 | 
			
		||||
        blue_h = 0.3 * h
 | 
			
		||||
        ctx.set_source_rgb(0.807, 0.898, 0.964)
 | 
			
		||||
        ctx.rectangle(0, 0, blue_w, blue_h)
 | 
			
		||||
        ctx.fill()
 | 
			
		||||
 | 
			
		||||
        # Prepare the title text layout
 | 
			
		||||
        pc = pangocairo.CairoContext(ctx)
 | 
			
		||||
        layout = pc.create_layout()
 | 
			
		||||
        layout.set_width(int(0.7 * w * pango.SCALE))
 | 
			
		||||
        layout.set_alignment(pango.ALIGN_CENTER)
 | 
			
		||||
        fd = pango.FontDescription("Georgia Bold")
 | 
			
		||||
        fd.set_size(pango.SCALE)
 | 
			
		||||
        layout.set_font_description(fd)
 | 
			
		||||
        layout.set_text(self.rc.title)
 | 
			
		||||
        self._adjust_font_size(layout, fd, 0.7 * blue_w, 0.8 * blue_h)
 | 
			
		||||
 | 
			
		||||
        # Draw the title
 | 
			
		||||
        text_x, text_y, text_w, text_h = layout.get_extents()[1]
 | 
			
		||||
        ctx.save()
 | 
			
		||||
        ctx.set_source_rgb(0, 0, 0)
 | 
			
		||||
        ctx.translate((blue_w / 2) - (text_w / 2.0) / pango.SCALE - text_x / pango.SCALE,
 | 
			
		||||
                      (blue_h / 2) - (text_h / 2.0) / pango.SCALE - text_y / pango.SCALE)
 | 
			
		||||
        pc.show_layout(layout)
 | 
			
		||||
        ctx.restore()
 | 
			
		||||
 | 
			
		||||
        # Create the nice small map
 | 
			
		||||
        map_canvas = MapCanvas(self.rc.stylesheet,
 | 
			
		||||
                               self.rc.bounding_box,
 | 
			
		||||
                               w, 0.5 * h, dpi,
 | 
			
		||||
                               extend_bbox_to_ratio=True)
 | 
			
		||||
 | 
			
		||||
        # We will render it slightly below the title
 | 
			
		||||
        ctx.translate(0, 0.3 * h + Renderer.PRINT_SAFE_MARGIN_PT)
 | 
			
		||||
 | 
			
		||||
        # Add the shape that greys out everything that is outside of
 | 
			
		||||
        # the administrative boundary.
 | 
			
		||||
        exterior = shapely.wkt.loads(map_canvas.get_actual_bounding_box().as_wkt())
 | 
			
		||||
        interior = shapely.wkt.loads(self.rc.polygon_wkt)
 | 
			
		||||
        shade_wkt = exterior.difference(interior).wkt
 | 
			
		||||
        shade = maplib.shapes.PolyShapeFile(self.rc.bounding_box,
 | 
			
		||||
                os.path.join(self.tmpdir, 'shape_overview_cover.shp'),
 | 
			
		||||
                             'shade-overview-cover')
 | 
			
		||||
        shade.add_shade_from_wkt(shade_wkt)
 | 
			
		||||
        map_canvas.add_shape_file(shade)
 | 
			
		||||
 | 
			
		||||
        # Render the map !
 | 
			
		||||
        map_canvas.render()
 | 
			
		||||
        mapnik.render(map_canvas.get_rendered_map(), ctx)
 | 
			
		||||
 | 
			
		||||
        ctx.restore()
 | 
			
		||||
        ctx.restore()
 | 
			
		||||
 | 
			
		||||
        cairo_surface.show_page()
 | 
			
		||||
 | 
			
		||||
    def render(self, cairo_surface, dpi, osm_date):
 | 
			
		||||
        ctx = cairo.Context(cairo_surface)
 | 
			
		||||
 | 
			
		||||
        self._render_front_page(ctx, cairo_surface, dpi)
 | 
			
		||||
 | 
			
		||||
        for i, (canvas, grid) in enumerate(self.pages):
 | 
			
		||||
            ctx.save()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue