def seed(self, layer, grid, level_range, time): print layer, grid, level_range, time host = "http://localhost/browse/ows" level_0_num_tiles_y = 2 # rows level_0_num_tiles_x = 4 # cols mesh_cache = MeshCache() for tileLevel in level_range: tiles_x = level_0_num_tiles_x * pow(2, tileLevel); tiles_y = level_0_num_tiles_y * pow(2, tileLevel) #find which tiles are crossed by extent tile_width = 360 / (tiles_x) tile_height = 180 / (tiles_y) #coverage = eoxs_models.Coverage.objects.get(identifier=result.identifier) layer_obj = models.DatasetSeries.objects.get(identifier=layer) # Go through all coverages in layer and seed only the tiles they cross and their time for coverage in models.CurtainCoverage.objects.filter(collections__in=[layer_obj.pk]): #cycle through tiles for col in range(tiles_x): for row in range(tiles_y): west = -180 + (col * tile_width) east = west + tile_width north = 90 - (row * tile_height) south = north - tile_height if (coverage.footprint.intersects(Polygon.from_bbox( (west,south,east,north) ))): time = isoformat(coverage.begin_time) + "/" + isoformat(coverage.end_time) print ('[W3DSGetTileHandler::seed] processing %s / %s / %s / %s / %s/ %s' % (layer, grid, tileLevel, col, row, time)) logger.debug('[W3DSGetTileHandler::seed] processing %s / %s / %s / %s / %s/ %s' % (layer, grid, tileLevel, col, row, time)) if not mesh_cache.lookup(layer, grid, tileLevel, col, row, time): mesh_cache.request_and_store(layer, grid, tileLevel, col, row, time)
def handle(self, request): decoder = W3DSGetTileKVPDecoder(request.GET) layer = decoder.layer grid = decoder.crs level = decoder.tilelevel col = decoder.tilecol row = decoder.tilerow time = decoder.time # magic seeding request: if level == 9999: logger.debug('[W3DSGetTileHandler::handle] started seeding for levels %s-%s:' % (col, row)) self.seed(layer, grid, range(col, row), time) return ('{ "status:" "finished seeding of levels %s-%s" }' % (col, row), 'application/json') logger.debug('[W3DSGetTileHandler::handle] %s / %s / %s / %s / %s / %s' % (layer, grid, level, col, row, time)) mesh_cache = MeshCache() tile_geo = mesh_cache.lookup(layer, grid, level, col, row, time) if not tile_geo: print 'No tile geometry available, requesting from source (MeshFactory) ...' tile_geo = mesh_cache.request_and_store(layer, grid, level, col, row, time) # print 'TILE_GEO: ', tile_geo if not tile_geo: raise Exception('Could not request data from source (MeshFactory)') logger.debug('[W3DSGetTileHandler::handle] returning tile_geo\n%s:' % (tile_geo,)) # FIXXME: Currently the TimeSlider object is doing the temporal trimming. The cache backend does not # filter timewise yet (which is the clean solution). For now this is working as it should with the # TimeSlider, the clean solution will be implemented at a later point in time. tile_geo = TimeSlider().trim(tile_geo, time, '-') return (tile_geo, 'application/json')