From 5cad398951091755ce207bd697a55600d83f0143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 10 Oct 2017 14:39:11 +0200 Subject: [PATCH] map tile rendering base --- src/c3nav/mapdata/render/__init__.py | 1 + src/c3nav/mapdata/render/svg.py | 9 +++++++ src/c3nav/mapdata/urls.py | 7 +++++ src/c3nav/mapdata/views.py | 40 ++++++++++++++++++++++++++++ src/c3nav/urls.py | 2 ++ 5 files changed, 59 insertions(+) create mode 100644 src/c3nav/mapdata/render/__init__.py create mode 100644 src/c3nav/mapdata/render/svg.py create mode 100644 src/c3nav/mapdata/urls.py create mode 100644 src/c3nav/mapdata/views.py diff --git a/src/c3nav/mapdata/render/__init__.py b/src/c3nav/mapdata/render/__init__.py new file mode 100644 index 00000000..b85bda98 --- /dev/null +++ b/src/c3nav/mapdata/render/__init__.py @@ -0,0 +1 @@ +from c3nav.mapdata.render.svg import render_svg # noqa diff --git a/src/c3nav/mapdata/render/svg.py b/src/c3nav/mapdata/render/svg.py new file mode 100644 index 00000000..4bd4ca04 --- /dev/null +++ b/src/c3nav/mapdata/render/svg.py @@ -0,0 +1,9 @@ +from c3nav.mapdata.utils.svg import SVGImage + + +def render_svg(level, miny, minx, maxy, maxx, scale=1): + svg = SVGImage(bounds=((miny, minx), (maxy, maxx)), scale=scale) + + # todo: render + + return svg.get_xml() diff --git a/src/c3nav/mapdata/urls.py b/src/c3nav/mapdata/urls.py new file mode 100644 index 00000000..bd481b9d --- /dev/null +++ b/src/c3nav/mapdata/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url + +from c3nav.mapdata.views import tile + +urlpatterns = [ + url(r'^(?P\d+)/(?P\d+)/(?P-?\d+)/(?P-?\d+).(?Ppng|svg)$', tile, name='mapdata.tile'), +] diff --git a/src/c3nav/mapdata/views.py b/src/c3nav/mapdata/views.py new file mode 100644 index 00000000..cc4cafd1 --- /dev/null +++ b/src/c3nav/mapdata/views.py @@ -0,0 +1,40 @@ +import subprocess + +from django.http import Http404, HttpResponse +from django.shortcuts import get_object_or_404 +from shapely.geometry import box + +from c3nav.mapdata.models import Level, Source +from c3nav.mapdata.render import render_svg + + +def tile(request, level, zoom, x, y, format): + zoom = int(zoom) + if not (0 <= zoom <= 10): + raise Http404 + + bounds = Source.max_bounds() + + x, y = int(x), int(y) + size = 256/2**zoom + minx = size * x + miny = size * y + maxx = minx + size + maxy = miny + size + + if not box(bounds[0][1], bounds[0][0], bounds[1][1], bounds[1][0]).intersects(box(minx, miny, maxx, maxy)): + raise Http404 + + level = get_object_or_404(Level, pk=level) + + svg = render_svg(level, miny, minx, maxy, maxx, scale=2**zoom) + + if format == 'svg': + response = HttpResponse(svg, 'image/svg+xml') + elif format == 'png': + p = subprocess.run(('rsvg-convert', '--format', 'png'), input=svg.encode(), stdout=subprocess.PIPE, check=True) + response = HttpResponse(p.stdout, content_type="image/png") + else: + raise ValueError + + return response diff --git a/src/c3nav/urls.py b/src/c3nav/urls.py index 091965e4..d6047a75 100644 --- a/src/c3nav/urls.py +++ b/src/c3nav/urls.py @@ -6,11 +6,13 @@ from django.contrib import admin import c3nav.api.urls import c3nav.editor.urls +import c3nav.mapdata.urls import c3nav.site.urls urlpatterns = [ url(r'^editor/', include(c3nav.editor.urls)), url(r'^api/', include(c3nav.api.urls, namespace='api')), + url(r'^map/', include(c3nav.mapdata.urls)), url(r'^admin/', admin.site.urls), url(r'^locales/', include('django.conf.urls.i18n')), url(r'^', include(c3nav.site.urls)),