#!/usr/bin/env python ''' Check a set of terrain files for corruption ''' import os #from multiprocessing import Pool from multiprocessing.pool import ThreadPool import argparse import time import gzip import shutil import struct import crc16 from terrain_gen import TERRAIN_GRID_BLOCK_SIZE_Y, east_blocks, IO_BLOCK_SIZE, TERRAIN_GRID_FORMAT_VERSION, GridBlock # IO block size is 2048 # Actual size is 1821 bytes # Last 227 bytes is filling def check_filled(block, lat_int, lon_int, grid_spacing): '''check a block for validity''' if len(block) != IO_BLOCK_SIZE - 227: print("Bad size {0} of {1}".format(len(block), IO_BLOCK_SIZE)) return False (bitmap, lat, lon, crc, version, spacing) = struct.unpack(" 2 or abs(lon_int - (lon/1E7)) > 2: print("Bad lat/lon: {0}, {1}".format((lat/1E7), (lon/1E7))) return False if spacing != 100: print("Bad spacing: " + str(spacing)) return False if bitmap != (1<<56)-1: print("Bad bitmap") return False block = block[:16] + struct.pack(" 6000 or total_blocks < 900: print(file) print("Error: Has {0} blocks".format(total_blocks)) # 2b. Does each block have the correct CRC and fields? if total_blocks != 0: lat_min = 90 * 1.0e7 lat_max = -90 * 1.0e7 lon_min = 180 * 1.0e7 lon_max = -180 * 1.0e7 for blocknum in range(total_blocks): block = tile[(blocknum * IO_BLOCK_SIZE):((blocknum + 1)* IO_BLOCK_SIZE)-227] ret = check_filled(block, lat_int, lon_int, 100) if not ret: print(file) print("Bad data in block {0} of {1}".format(blocknum, total_blocks)) else: (lat, lon) = ret lat_min = min(lat_min, lat) lat_max = max(lat_max, lat) lon_min = min(lon_min, lon) lon_max = max(lon_max, lon) lat_min *= 1.0e-7 lat_max *= 1.0e-7 lon_min *= 1.0e-7 lon_max *= 1.0e-7 if abs(lat_max-lat_min) < 0.99 or abs(lon_max-lon_min) < 1.00 or abs(lat_max-lat_min) > 1.01 or abs(lon_max-lon_min) > 1.07: print(file) print("Bad tile") print("Tile covers ({0},{1}) to ({2},{3})".format(lat_min, lon_min, lat_max, lon_max)) print("Tile size is ({0:.4f}, {1:.4f}) degrees".format(lat_max-lat_min, lon_max-lon_min)) else: print("Bad tile: " + file) print("Done!")