offline_gen.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. import gzip
  13. import shutil
  14. from MAVProxy.modules.mavproxy_map import srtm
  15. from terrain_gen import create_degree
  16. def worker(downloader, lat, long, targetFolder, startedTiles, totTiles):
  17. # only create if the output file does not exists
  18. if os.path.exists(datafile(lat, long, targetFolder) + '.gz'):
  19. print("Skipping existing compressed tile {0} of {1} ({2:.3f}%)".format(startedTiles, totTiles, ((startedTiles)/totTiles)*100))
  20. return
  21. if not os.path.exists(datafile(lat, long, targetFolder)):
  22. create_degree(downloader, lat, long, targetFolder, 100)
  23. print("Created tile {0} of {1}".format(startedTiles, totTiles))
  24. else:
  25. print("Skipping existing tile {0} of {1} ({2:.3f}%)".format(startedTiles, totTiles, ((startedTiles)/totTiles)*100))
  26. # and compress
  27. with open(datafile(lat, long, targetFolder), 'rb') as f_in:
  28. with gzip.open(datafile(lat, long, targetFolder) + '.gz', 'wb') as f_out:
  29. shutil.copyfileobj(f_in, f_out)
  30. os.remove(datafile(lat, long, targetFolder))
  31. print("Done tile {0} of {1} ({2:.3f}%)".format(startedTiles, totTiles, ((startedTiles)/totTiles)*100))
  32. print("Folder is {0:.0f}Mb in size".format(get_size(targetFolder)/(1024*1024)))
  33. def datafile(lat, lon, folder):
  34. if lat < 0:
  35. NS = 'S'
  36. else:
  37. NS = 'N'
  38. if lon < 0:
  39. EW = 'W'
  40. else:
  41. EW = 'E'
  42. name = folder + "/%c%02u%c%03u.DAT" % (NS, min(abs(int(lat)), 99),
  43. EW, min(abs(int(lon)), 999))
  44. return name
  45. def get_size(start_path = '.'):
  46. total_size = 0
  47. for dirpath, dirnames, filenames in os.walk(start_path):
  48. for f in filenames:
  49. fp = os.path.join(dirpath, f)
  50. # skip if it is symbolic link
  51. if not os.path.islink(fp):
  52. # other threads may be moving files whilst we're getting folder
  53. # size here
  54. try:
  55. total_size += os.path.getsize(fp)
  56. except FileNotFoundError:
  57. pass
  58. return total_size
  59. if __name__ == '__main__':
  60. global filelistDownloadActive
  61. # Create the parser
  62. parser = argparse.ArgumentParser(description='ArduPilot Terrain DAT file generator')
  63. # Add the arguments
  64. # Folder to store processed DAT files
  65. parser.add_argument('-folder', action="store", dest="folder", default="processedTerrain")
  66. # Number of threads to use
  67. parser.add_argument('-processes', action="store", dest="processes", type=int, default=4)
  68. # Latitude range
  69. parser.add_argument('-latitude', action="store", dest="latitude", type=int, default=60)
  70. args = parser.parse_args()
  71. downloader = srtm.SRTMDownloader(debug=False, cachedir='srtmcache')
  72. downloader.loadFileList()
  73. targetFolder = os.path.join(os.getcwd(), args.folder)
  74. #create folder if required
  75. try:
  76. os.mkdir(targetFolder)
  77. except FileExistsError:
  78. pass
  79. print("Storing in " + targetFolder)
  80. # store the threads
  81. processes = []
  82. # make tileID's
  83. tileID = []
  84. i = 0
  85. for long in range(-180, 180):
  86. for lat in range (-args.latitude, args.latitude):
  87. tileID.append([lat, long, i])
  88. i += 1
  89. # total number of tiles
  90. totTiles = len(tileID)
  91. startedTiles = 0
  92. # Use a pool of workers to process
  93. with ThreadPool(args.processes-1) as p:
  94. reslist = [p.apply_async(worker, args=(downloader, td[0], td[1], targetFolder, td[2], len(tileID))) for td in tileID]
  95. for result in reslist:
  96. result.get()
  97. print("--------------------------")
  98. print("All tiles generated!")
  99. print("--------------------------")