export history
This commit is contained in:
parent
82a46648a1
commit
8205ee51a8
3 changed files with 45 additions and 5 deletions
|
@ -6,6 +6,7 @@ from itertools import chain
|
|||
import numpy as np
|
||||
from django.conf import settings
|
||||
from django.db.models.signals import m2m_changed, post_delete
|
||||
from PIL import Image
|
||||
from shapely import prepared
|
||||
from shapely.geometry import box
|
||||
from shapely.ops import unary_union
|
||||
|
@ -56,10 +57,13 @@ class MapHistory:
|
|||
|
||||
def save(self, filename):
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(struct.pack('<BHHHHH', self.resolution, self.x, self.y, *reversed(self.data.shape),
|
||||
len(self.updates)))
|
||||
f.write(struct.pack('<'+'II'*len(self.updates), *chain(*self.updates)))
|
||||
f.write(self.data.tobytes('C'))
|
||||
self.write(f)
|
||||
|
||||
def write(self, f):
|
||||
f.write(struct.pack('<BHHHHH', self.resolution, self.x, self.y, *reversed(self.data.shape),
|
||||
len(self.updates)))
|
||||
f.write(struct.pack('<'+'II'*len(self.updates), *chain(*self.updates)))
|
||||
f.write(self.data.tobytes('C'))
|
||||
|
||||
def add_new(self, geometry):
|
||||
prep = prepared.prep(geometry)
|
||||
|
@ -125,6 +129,18 @@ class MapHistory:
|
|||
self.y += miny
|
||||
self.data = self.data[miny:maxy+1, minx:maxx+1]
|
||||
|
||||
def to_image(self):
|
||||
from c3nav.mapdata.models import Source
|
||||
(miny, minx), (maxy, maxx) = Source.max_bounds()
|
||||
|
||||
height, width = self.data.shape
|
||||
image_data = np.zeros((int(math.ceil((maxy-miny)/self.resolution)),
|
||||
int(math.ceil((maxx-minx)/self.resolution))), dtype=np.uint8)
|
||||
visible_data = (self.data.astype(float)*255/(len(self.updates)-1)).clip(0, 255).astype(np.uint8)
|
||||
image_data[self.y:self.y+height, self.x:self.x+width] = visible_data
|
||||
|
||||
return Image.fromarray(np.flip(image_data, axis=0), 'L')
|
||||
|
||||
|
||||
class GeometryChangeTracker:
|
||||
def __init__(self):
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from c3nav.mapdata.views import tile
|
||||
from c3nav.mapdata.views import history, tile
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^(?P<level>\d+)/(?P<zoom>\d+)/(?P<x>-?\d+)/(?P<y>-?\d+).(?P<format>png|svg)$', tile, name='mapdata.tile'),
|
||||
url(r'^history/(?P<level>\d+)/(?P<mode>base|render).(?P<format>png|data)$', history, name='mapdata.history'),
|
||||
]
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
import os
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.http import Http404, HttpResponse, HttpResponseNotModified
|
||||
from django.shortcuts import get_object_or_404
|
||||
from shapely.geometry import box
|
||||
|
||||
from c3nav.mapdata.cache import MapHistory
|
||||
from c3nav.mapdata.models import Level, MapUpdate, Source
|
||||
from c3nav.mapdata.render.svg import SVGRenderer
|
||||
|
||||
|
@ -88,3 +91,23 @@ def tile(request, level, zoom, x, y, format):
|
|||
response['Cache-Control'] = 'no-cache'
|
||||
|
||||
return response
|
||||
|
||||
|
||||
def history(request, level, mode, format):
|
||||
if not request.user.is_superuser:
|
||||
raise PermissionDenied
|
||||
level = get_object_or_404(Level, pk=level)
|
||||
|
||||
if mode == 'render' and level.on_top_of_id is None:
|
||||
raise Http404
|
||||
|
||||
history = MapHistory.open(os.path.join(settings.CACHE_ROOT, 'level_%s_%d' % (mode, level.pk)))
|
||||
if format == 'png':
|
||||
response = HttpResponse(content_type='image/png')
|
||||
history.to_image().save(response, format='PNG')
|
||||
elif format == 'data':
|
||||
response = HttpResponse(content_type='application/octet-stream')
|
||||
history.write(response)
|
||||
else:
|
||||
raise ValueError
|
||||
return response
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue