offline_gen.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #!/usr/bin/env python3
  2. '''
  3. Generation of all dat files at 100m spacing.
  4. Preprocessing so the website doesn't have to
  5. This will take a long time to process!
  6. '''
  7. import os
  8. #from multiprocessing import Pool
  9. from multiprocessing.pool import ThreadPool
  10. import argparse
  11. import time
  12. from MAVProxy.modules.mavproxy_map import srtm
  13. from terrain_gen import create_degree
  14. def worker(downloader, lat, long, targetFolder, startedTiles, totTiles):
  15. create_degree(downloader, lat, long, targetFolder, 100)
  16. print("Done tile {0} of {1} ({2:.3f}%)".format(startedTiles, totTiles, ((startedTiles)/totTiles)*100))
  17. print("Folder is {0:.0f}Mb in size".format(get_size(targetFolder)/(1024*1024)))
  18. def get_size(start_path = '.'):
  19. total_size = 0
  20. for dirpath, dirnames, filenames in os.walk(start_path):
  21. for f in filenames:
  22. fp = os.path.join(dirpath, f)
  23. # skip if it is symbolic link
  24. if not os.path.islink(fp):
  25. total_size += os.path.getsize(fp)
  26. return total_size
  27. if __name__ == '__main__':
  28. global filelistDownloadActive
  29. # Create the parser
  30. parser = argparse.ArgumentParser(description='ArduPilot Terrain DAT file generator')
  31. # Add the arguments
  32. # Folder to store processed DAT files
  33. parser.add_argument('-folder', action="store", dest="folder", default="processedTerrain")
  34. # Number of threads to use
  35. parser.add_argument('-processes', action="store", dest="processes", type=int, default=4)
  36. # Latitude range
  37. parser.add_argument('-latitude', action="store", dest="latitude", type=int, default=60)
  38. args = parser.parse_args()
  39. downloader = srtm.SRTMDownloader(debug=False, cachedir='srtmcache')
  40. downloader.loadFileList()
  41. targetFolder = os.path.join(os.getcwd(), args.folder)
  42. #create folder if required
  43. try:
  44. os.mkdir(targetFolder)
  45. except FileExistsError:
  46. pass
  47. print("Storing in " + targetFolder)
  48. # store the threads
  49. processes = []
  50. # make tileID's
  51. tileID = []
  52. i = 0
  53. for long in range(-180, 180):
  54. for lat in range (-args.latitude, args.latitude):
  55. tileID.append([lat, long, i])
  56. i += 1
  57. # total number of tiles
  58. totTiles = len(tileID)
  59. startedTiles = 0
  60. # Use a pool of workers to process
  61. with ThreadPool(args.processes-1) as p:
  62. reslist = [p.apply_async(worker, args=(downloader, td[0], td[1], targetFolder, td[2], len(tileID))) for td in tileID]
  63. for result in reslist:
  64. result.get()
  65. print("--------------------------")
  66. print("All tiles generated!")
  67. print("--------------------------")