2121from tilequeue .tile import coord_int_zoom_up
2222from tilequeue .tile import coord_marshall_int
2323from tilequeue .tile import coord_unmarshall_int
24- from tilequeue .tile import parse_expired_coord_string
24+ from tilequeue .tile import parse_expired_coord_string , deserialize_coord
2525from tilequeue .tile import seed_tiles
2626from tilequeue .tile import tile_generator_for_multiple_bounds
2727from tilequeue .tile import tile_generator_for_single_bounds
2828from tilequeue .tile import zoom_mask
2929from tilequeue .top_tiles import parse_top_tiles
30+ from tilequeue .utils import grouper
3031from tilequeue .worker import DataFetch
3132from tilequeue .worker import ProcessAndFormatData
3233from tilequeue .worker import QueuePrint
@@ -1214,6 +1215,79 @@ def tilequeue_dump_tiles_of_interest(cfg, peripherals):
12141215 )
12151216
12161217
1218+ def tilequeue_load_tiles_of_interest (cfg , peripherals ):
1219+ """
1220+ Given a newline-delimited file containing tile coordinates in
1221+ `zoom/column/row` format, load those tiles into a new Redis SET
1222+ alongside the existing one, then RENAME the new to the old.
1223+ """
1224+ logger = make_logger (cfg , 'load_tiles_of_interest' )
1225+ logger .info ('Loading tiles of interest' )
1226+
1227+ toi_filename = "toi.txt"
1228+ chunk_size = 10000
1229+ new_toi_key = cfg .redis_cache_set_key + "-new"
1230+ old_toi_key = cfg .redis_cache_set_key + "-old"
1231+
1232+ # Make a raw Redis client so we can do low-level set manipulation
1233+ redis_client = make_redis_client (cfg )
1234+
1235+ logger .info (
1236+ 'Adding tiles of interest from %s to key %s' ,
1237+ toi_filename ,
1238+ new_toi_key ,
1239+ )
1240+
1241+ if redis_client .exists (new_toi_key ):
1242+ raise Exception (
1243+ "Can't load new TOI because key {} exists. "
1244+ "Delete it and try again" .format (new_toi_key )
1245+ )
1246+
1247+ n_added = 0
1248+ with open (toi_filename , 'r' ) as f :
1249+ for lines in grouper (f , chunk_size ):
1250+ coords = [
1251+ coord_marshall_int (deserialize_coord (l ))
1252+ for l in lines if l is not None
1253+ ]
1254+ n_added += redis_client .sadd (new_toi_key , * coords )
1255+ logger .info ("%s total tiles added" , n_added )
1256+
1257+ logger .info (
1258+ 'Finished adding %s tiles of interest from %s to key %s' ,
1259+ n_added ,
1260+ toi_filename ,
1261+ new_toi_key ,
1262+ )
1263+
1264+ if redis_client .rename (cfg .redis_cache_set_key , old_toi_key ):
1265+ logger .info (
1266+ 'Successfully moved existing TOI at %s to %s' ,
1267+ cfg .redis_cache_set_key ,
1268+ old_toi_key ,
1269+ )
1270+ else :
1271+ raise Exception (
1272+ "Moving existing TOI failed. WARNING: There's "
1273+ "probably no TOI key and this is bad!"
1274+ )
1275+
1276+ if redis_client .rename (new_toi_key , cfg .redis_cache_set_key ):
1277+ logger .info (
1278+ 'Successfully moved new TOI at %s into use at %s' ,
1279+ new_toi_key ,
1280+ cfg .redis_cache_set_key ,
1281+ )
1282+ else :
1283+ raise Exception (
1284+ "Moving new TOI failed. WARNING: There's "
1285+ "probably no TOI key and this is bad!"
1286+ )
1287+
1288+ logger .info ("Finished loading TOI." )
1289+
1290+
12171291class TileArgumentParser (argparse .ArgumentParser ):
12181292 def error (self , message ):
12191293 sys .stderr .write ('error: %s\n ' % message )
@@ -1235,6 +1309,8 @@ def tilequeue_main(argv_args=None):
12351309 ('intersect' , create_command_parser (tilequeue_intersect )),
12361310 ('dump-tiles-of-interest' ,
12371311 create_command_parser (tilequeue_dump_tiles_of_interest )),
1312+ ('load-tiles-of-interest' ,
1313+ create_command_parser (tilequeue_load_tiles_of_interest )),
12381314 ('enqueue-tiles-of-interest' ,
12391315 create_command_parser (tilequeue_enqueue_tiles_of_interest )),
12401316 ('tile-size' , create_command_parser (tilequeue_tile_sizes )),
0 commit comments