def delete_caches(sender, instance, **kwargs): _log.debug('Deleting caches for {0}'.format(instance.title)) if isinstance(instance, Style): CacheManager.get().remove_caches_for_style(instance.slug) elif isinstance(instance, Layer): CacheManager.get().remove_caches_for_layer(instance.slug)
def prepare_wms(self, layers, srs, styles, bgcolor=None, transparent=True, **kwargs): """Take a WMS query and turn it into the appropriate MML file, if need be. Or look up the cached MML file""" _log.debug('prepare wms {0} {1}'.format(layers, styles)) if not os.path.exists(LAYER_CACHE_PATH): os.makedirs(LAYER_CACHE_PATH) # just in case it's not there yet. cached_filename = CacheManager.cache_entry_name( layers, srs, styles, bgcolor=bgcolor, transparent=transparent, query=kwargs['query'] if 'query' in kwargs else None ) _log.debug('cache entry {0}'.format(cached_filename)) layer_specs = [] for layer in layers: if "#" in layer: layer, kwargs['sublayer'] = layer.split("#") _log.debug('pulling layer {0}'.format(layer)) rendered_layer = models.Layer.objects.get(slug=layer) driver = rendered_layer.data_resource.driver_instance layer_spec = driver.get_rendering_parameters(**kwargs) layer_specs.append((rendered_layer, layer_spec)) if not os.path.exists(cached_filename + ".xml"): # not an else as previous clause may remove file. try: with open(cached_filename + ".lock", 'w') as w: self.compile_mapfile(cached_filename, srs, styles, *layer_specs) os.unlink(cached_filename + ".lock") except sh.ErrorReturnCode_1, e: os.unlink(cached_filename + ".lock") raise RuntimeError(str(e.stderr))
def tms(request, layer, z=None, x=None, y=None, **kwargs): if z and x and y: z = int(z) x = int(x) y = int(y) table = None if '#' in layer: layer_slug, table = layer.split('#') else: layer_slug = layer # dispatch.api_accessed.send(RenderedLayer, instance=layer_instance, user=user) style = request.GET.get( 'style', Layer.objects.get(slug=layer_slug).default_style.slug) cache = CacheManager.get().get_tile_cache([layer], [style]) rendered, png = cache.fetch_tile(z, x, y) _log.debug("returning tile {z}/{x}/{y} with size {png}".format( z=z, x=x, y=y, png=len(png))) rsp = HttpResponse(png, content_type='image/png') rsp['Content-Disposition'] = 'attachment; filename="{z}.{x}.{y}.png"'.format( z=z, x=x, y=y) return rsp else: return HttpResponseRedirect( reverse('layer-page', kwargs={'slug': layer}))
def seed_layer(request, layer): mnz = int(request.GET['minz']) mxz = int( request.GET['maxz'] ) # anything greater would cause a DOS attack. We should do it manually mnx = int(request.GET['minx']) mxx = int(request.GET['maxx']) mny = int(request.GET['miny']) mxy = int(request.GET['maxy']) layer = Layer.objects.get(slug=layer) style = request.GET.get('style', layer.default_style) user = authorize(request, page=layer, edit=True) dispatch.api_accessed.send(Layer, instance=layer, user=user) CacheManager.get().get_tile_cache(layers=[layer], styles=[style]).seed_tiles( mnz, mxz, mnx, mny, mxx, mxy) return HttpResponse()
def test_fetch_tile(layer): mgr = CacheManager.get() filename = mgr.cache_entry_name(styles=[layer.default_style.slug], layers=[layer.slug]) if os.path.exists(filename + '.mbtiles'): os.unlink(filename + '.mbtiles') cc = mgr.get_tile_cache( styles=[layer.default_style.slug], layers=[layer.slug], ) rendered, tile = cc.fetch_tile(0, 0, 0) assert rendered rendered, tile = cc.fetch_tile(0, 0, 0) assert not rendered with open('test_fetch_tile.0.0.0.png', 'wb') as output: output.write(tile) rendered, tile = cc.fetch_tile(1, 0, 0) with open('test_fetch_tile.1.0.0.png', 'wb') as output: output.write(tile) rendered, tile = cc.fetch_tile(1, 1, 1) with open('test_fetch_tile.1.1.1.png', 'wb') as output: output.write(tile) rendered, tile = cc.fetch_tile(2, 0, 0) with open('test_fetch_tile.2.0.0.png', 'wb') as output: output.write(tile) rendered, tile = cc.fetch_tile(2, 1, 1) with open('test_fetch_tile.2.1.1.png', 'wb') as output: output.write(tile) rendered, tile = cc.fetch_tile(2, 2, 2) with open('test_fetch_tile.2.2.2.png', 'wb') as output: output.write(tile)
def trim_tile_caches(sender, instance, *args, **kwargs): if sender is Style: CacheManager.get().remove_caches_for_style(instance) elif sender is Layer: CacheManager.get().remove_caches_for_layer(instance)
def shave_tile_caches(sender, instance, bbox, *args, **kwargs): CacheManager.get().shave_caches(instance, bbox)