app.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import uuid
  2. import threading
  3. import time
  4. import queue
  5. import os
  6. import zipfile
  7. import shutil
  8. import sys
  9. from flask import Flask
  10. from flask import render_template
  11. from flask import request
  12. from flask import json, jsonify
  13. from MAVProxy.modules.mavproxy_map import srtm
  14. from terrain_gen import add_offset
  15. # The output folder for all zipped terrain requests
  16. app = Flask(__name__,static_url_path='/terrain', static_folder='outputTer',)
  17. def clamp(n, smallest, largest):
  18. return max(smallest, min(n, largest))
  19. def getDatFile(lat, lon):
  20. if lat < 0:
  21. NS = 'S'
  22. else:
  23. NS = 'N'
  24. if lon < 0:
  25. EW = 'W'
  26. else:
  27. EW = 'E'
  28. return "%c%02u%c%03u.DAT" % (NS, min(abs(int(lat)), 99),
  29. EW, min(abs(int(lon)), 999))
  30. def compressFiles(fileList, uuidkey, outfolder):
  31. # create a zip file comprised of dat tiles
  32. zipthis = os.path.join(os.getcwd(), outfolder, uuidkey + '.zip')
  33. terrain_zip = zipfile.ZipFile(zipthis, 'w')
  34. try:
  35. for fileSingle in fileList:
  36. # terrain_zip.write(os.path.join(folder, file), file, compress_type = zipfile.ZIP_DEFLATED)
  37. terrain_zip.write(fileSingle, os.path.basename(fileSingle), compress_type = zipfile.ZIP_DEFLATED)
  38. except:
  39. print("Unexpected error:", sys.exc_info()[0])
  40. terrain_zip.close()
  41. return False
  42. terrain_zip.close()
  43. return True
  44. @app.route('/')
  45. def index():
  46. return render_template('index.html')
  47. @app.route('/generate', methods = ['GET', 'POST'])
  48. def generate():
  49. if request.method == 'POST':
  50. # parse and sanitise the input
  51. try:
  52. # request.form['username']
  53. lat = float(request.form['lat'])
  54. lon = float(request.form['long'])
  55. radius = int(request.form['radius'])
  56. assert lat < 90
  57. assert lon < 180
  58. assert lat > -90
  59. assert lon > -180
  60. radius = clamp(radius, 1, 400)
  61. except:
  62. print("Bad data")
  63. return render_template('generate.html', error = "Error with input")
  64. # UUID for this terrain generation
  65. uuidkey = str(uuid.uuid1())
  66. # get a list of files required to cover area
  67. filelist = []
  68. done = set()
  69. for dx in range(-radius, radius):
  70. for dy in range(-radius, radius):
  71. (lat2,lon2) = add_offset(lat*1e7, lon*1e7, dx*1000.0, dy*1000.0)
  72. lat_int = int(round(lat2 * 1.0e-7))
  73. lon_int = int(round(lon2 * 1.0e-7))
  74. tag = (lat_int, lon_int)
  75. if tag in done:
  76. #numpercent += 1
  77. continue
  78. done.add(tag)
  79. #create_degree(downloader, lat_int, lon_int, folderthis, spacing)
  80. filelist.append(os.path.join(os.getcwd(), "processedTerrain", getDatFile(lat_int, lon_int)))
  81. #create_degree(downloader, lat, lon, folderthis, spacing)
  82. #filelist.append(getDatFile(lat, lon))
  83. print(filelist)
  84. #compress
  85. success = compressFiles(filelist, uuidkey, 'outputTer')
  86. if success:
  87. print("Generated " + "/terrain/" + uuidkey + ".zip")
  88. return render_template('generate.html', urlkey="/terrain/" + uuidkey + ".zip", uuidkey=uuidkey)
  89. else:
  90. print("Failed " + "/terrain/" + uuidkey + ".zip")
  91. return render_template('generate.html', error = "Processing terrain", uuidkey=uuidkey)
  92. else:
  93. print("Bad get")
  94. return render_template('generate.html', error = "Need to use POST, not GET")