make poi_markers fully work with uploads via API, and fix scaling

when using non-standard DPI for bitmap files (mostly)
dev-multipage-gpx
Hartmut Holzgraefe 2018-09-09 21:27:13 +00:00
rodzic 0485e296cb
commit 1c7f1f16c9
4 zmienionych plików z 51 dodań i 37 usunięć

3
.gitmodules vendored
Wyświetl plik

@ -4,3 +4,6 @@
[submodule "templates/umap/maki"]
path = templates/umap/maki
url = https://github.com/mapbox/maki.git
[submodule "templates/poi_markers/Font-Awesome-SVG-PNG"]
path = templates/poi_markers/Font-Awesome-SVG-PNG
url = https://github.com/encharm/Font-Awesome-SVG-PNG

Wyświetl plik

@ -123,49 +123,53 @@ class PoiIndexRenderer:
return area
def _render_header(self, ctx, area, dpi, color, label, logo = None):
f = dpi / UTILS.PT_PER_INCH;
ctx.save()
ctx.translate(10, 10)
ctx.translate(10*f, 10*f)
c = Color(color);
ctx.set_source_rgb(c.red, c.green, c.blue)
ctx.rectangle( 0, 0, area.w - 20, dpi * 0.8)
ctx.rectangle( 0, 0, (area.w - 20)*f, dpi * 0.8)
ctx.fill()
x = 5
x = 5*f
if logo != None:
logo_path = os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', '..', '..', 'Font-Awesome-SVG-PNG', 'white', 'svg', logo + '.svg'))
os.path.dirname(__file__), '..', '..', 'templates', 'poi_markers', 'Font-Awesome-SVG-PNG', 'white', 'svg', logo + '.svg'))
if os.path.isfile(logo_path):
rsvg = Rsvg.Handle()
svg = rsvg.new_from_file(logo_path)
scale = dpi * 0.6 / svg.props.height;
x += svg.props.width * scale + 10
x += svg.props.width * scale + 10*f
ctx.save()
ctx.translate(5, 5)
ctx.translate(5*f, 5*f)
ctx.scale(scale, scale)
svg.render_cairo(ctx)
ctx.restore()
else:
LOG.debug("icon not found %s" % logo_path)
LOG.warning("icon not found %s" % logo_path)
ctx.set_source_rgb(1, 1, 1)
ctx.select_font_face("Droid Sans Bold",
cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
ctx.set_font_size(dpi - 30)
ctx.set_font_size(dpi*0.6)
x_bearing, y_bearing, width, height = ctx.text_extents(label)[:4]
ctx.move_to(x, 10 - y_bearing)
ctx.move_to(x, 10*f - y_bearing)
ctx.show_text(label)
ctx.restore()
return dpi * 0.8
def _render_item(self, ctx, area, dpi, color, number, label, gridlabel, logo = None):
x = 5
f = dpi / UTILS.PT_PER_INCH;
x = 5*f
marker_path = os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', '..', 'images', 'marker.svg'))
@ -183,8 +187,8 @@ class PoiIndexRenderer:
rsvg = Rsvg.Handle()
svg = rsvg.new_from_data(data.encode())
scale = 50.0 / svg.props.height;
x += 35
scale = 50.0 * f/ svg.props.height;
x += 35*f
ctx.save()
@ -199,38 +203,39 @@ class PoiIndexRenderer:
cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
x_bearing, y_bearing, width, height = ctx.text_extents(number)[:4]
ctx.set_font_size((dpi - 30)/(len(number)+1))
ctx.move_to(20 - width/2, 25)
ctx.set_font_size((dpi*0.6)/(len(number)+1))
ctx.move_to(20*f - f*width/2, 25*f)
ctx.show_text(number)
ctx.restore()
if logo != None:
logo_path = os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', '..', '..', 'Font-Awesome-SVG-PNG', 'black', 'svg', logo + '.svg'))
os.path.dirname(__file__), '..', '..', 'templates', 'poi_markers', 'Font-Awesome-SVG-PNG', 'black', 'svg', logo + '.svg'))
if os.path.isfile(logo_path):
svg = rsvg.Handle(logo_path)
rsvg = Rsvg.Handle()
svg = rsvg.new_from_file(logo_path)
scale = min(dpi * 0.6 / svg.props.height, dpi * 0.6 / svg.props.width);
ctx.save()
ctx.translate(x + 5, 5)
ctx.translate(x + 5, 5*f)
ctx.scale(scale, scale)
svg.render_cairo(ctx)
ctx.restore()
x += svg.props.width * scale + 10
x += svg.props.width * scale + 10*f
else:
LOG.debug("icon not found %s" % logo_path)
LOG.warning("icon not found %s" % logo_path)
ctx.save()
ctx.set_source_rgb(0, 0, 0)
ctx.select_font_face("Droid Sans",
cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
ctx.set_font_size(dpi - 30)
ctx.set_font_size(dpi*0.6)
x_bearing, y_bearing, width, height = ctx.text_extents(label)[:4]
ctx.move_to(x, 10 - y_bearing)
ctx.move_to(x, 10*f - y_bearing)
ctx.show_text(label)
ctx.select_font_face("Droid Sans Mono",
@ -240,7 +245,7 @@ class PoiIndexRenderer:
gridlabel = gridParts.group(1) + '-' + gridParts.group(2)
x_bearing, y_bearing, width, height = ctx.text_extents(gridlabel)[:4]
ctx.move_to(area.w - width - 15, 10 + height)
ctx.move_to((area.w - 15)*f - width, 10*f + height)
ctx.show_text(gridlabel)
ctx.restore()
@ -248,10 +253,12 @@ class PoiIndexRenderer:
return dpi * 0.7
def render(self, ctx, area, dpi = UTILS.PT_PER_INCH):
f = dpi / UTILS.PT_PER_INCH;
ctx.save()
ctx.translate(area.x, area.y)
ctx.translate(area.x*f, area.y*f)
ctx.set_source_rgb(1, 1, 1)
ctx.rectangle(0, 0, area.w, area.h)
ctx.rectangle(0, 0, area.w*f, area.h*f)
ctx.fill()
n = 0

Wyświetl plik

@ -1,6 +1,7 @@
import cairo
import os
import sys
import math
import qrcode
import qrcode.image.svg
import gi
@ -20,19 +21,19 @@ def render(renderer, ctx):
##
## Draw the creator notice
##
ctx.save()
#ctx.save()
#
# Move to the right position
ctx.translate(safe_margin_dots + usable_area_width_dots/2.3,
( safe_margin_dots + title_margin_dots
+ usable_area_height_dots
+ copyright_margin_dots/4. ) )
#ctx.translate(safe_margin_dots + usable_area_width_dots/2.3,
# ( safe_margin_dots + title_margin_dots
# + usable_area_height_dots
# + copyright_margin_dots/4. ) )
# Draw the copyright notice
self._draw_creator_notice(ctx, usable_area_width_dots,
copyright_margin_dots,
osm_date=osm_date)
ctx.restore()
#self._draw_creator_notice(ctx, usable_area_width_dots,
# copyright_margin_dots,
# osm_date=osm_date)
#ctx.restore()
# place POI markers on map canvas
n = 0
@ -40,11 +41,11 @@ def render(renderer, ctx):
for poi in category.items:
n = n + 1
lat, lon = poi.endpoint1.get_latlong()
renderer._marker(category.color, str(n), lat, lon, ctx, dpi)
renderer._marker(category.color, str(n), lat, lon, ctx, renderer.dpi)
# place "you are here" circle if coordinates are given
if renderer.street_index.lat != False:
x,y = renderer._latlon2xy(renderer.street_index.lat, renderer.street_index.lon, dpi)
x,y = renderer._latlon2xy(renderer.street_index.lat, renderer.street_index.lon, renderer.dpi)
ctx.save()
ctx.translate(x, y)
ctx.set_source_rgba(1, 0, 0, 0.8)

Wyświetl plik

@ -83,10 +83,10 @@ class SinglePageRenderer(Renderer):
index_position (str): None or 'side' (index on side),
'bottom' (index at bottom).
"""
Renderer.__init__(self, db, rc, tmpdir, dpi)
# Prepare the index
if rc.poi_file:
self.street_index = PoiIndex(rc.poi_file)
else:
@ -194,6 +194,9 @@ class SinglePageRenderer(Renderer):
float(self._map_coords[3]), # H
dpi))
if self.rc.poi_file:
self._overlay_effects.append('poi_markers')
# Prepare the grid
if index_position:
self.grid = self._create_grid(self._map_canvas, dpi)