| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import uuid
- import threading
- import time
- import queue
- import os
- import zipfile
- import shutil
- import sys
- from flask import Flask
- from flask import render_template
- from flask import request
- from flask import json, jsonify
- from MAVProxy.modules.mavproxy_map import srtm
- from terrain_gen import add_offset
- # The output folder for all zipped terrain requests
- app = Flask(__name__,static_url_path='/terrain', static_folder='outputTer',)
- def clamp(n, smallest, largest):
- return max(smallest, min(n, largest))
- def getDatFile(lat, lon):
- if lat < 0:
- NS = 'S'
- else:
- NS = 'N'
- if lon < 0:
- EW = 'W'
- else:
- EW = 'E'
- return "%c%02u%c%03u.DAT" % (NS, min(abs(int(lat)), 99),
- EW, min(abs(int(lon)), 999))
- def compressFiles(fileList, uuidkey, outfolder):
- # create a zip file comprised of dat tiles
- zipthis = os.path.join(os.getcwd(), outfolder, uuidkey + '.zip')
- terrain_zip = zipfile.ZipFile(zipthis, 'w')
-
- try:
- for fileSingle in fileList:
- # terrain_zip.write(os.path.join(folder, file), file, compress_type = zipfile.ZIP_DEFLATED)
- terrain_zip.write(fileSingle, os.path.basename(fileSingle), compress_type = zipfile.ZIP_DEFLATED)
- except:
- print("Unexpected error:", sys.exc_info()[0])
- terrain_zip.close()
- return False
-
-
- terrain_zip.close()
- return True
- @app.route('/')
- def index():
- return render_template('index.html')
- @app.route('/generate', methods = ['GET', 'POST'])
- def generate():
- if request.method == 'POST':
- # parse and sanitise the input
- try:
- # request.form['username']
- lat = float(request.form['lat'])
- lon = float(request.form['long'])
- radius = int(request.form['radius'])
- assert lat < 90
- assert lon < 180
- assert lat > -90
- assert lon > -180
- radius = clamp(radius, 1, 400)
- except:
- print("Bad data")
- return render_template('generate.html', error = "Error with input")
- # UUID for this terrain generation
- uuidkey = str(uuid.uuid1())
- # get a list of files required to cover area
- filelist = []
- done = set()
- for dx in range(-radius, radius):
- for dy in range(-radius, radius):
- (lat2,lon2) = add_offset(lat*1e7, lon*1e7, dx*1000.0, dy*1000.0)
- lat_int = int(round(lat2 * 1.0e-7))
- lon_int = int(round(lon2 * 1.0e-7))
- tag = (lat_int, lon_int)
- if tag in done:
- #numpercent += 1
- continue
- done.add(tag)
- #create_degree(downloader, lat_int, lon_int, folderthis, spacing)
- filelist.append(os.path.join(os.getcwd(), "processedTerrain", getDatFile(lat_int, lon_int)))
- #create_degree(downloader, lat, lon, folderthis, spacing)
- #filelist.append(getDatFile(lat, lon))
- print(filelist)
- #compress
- success = compressFiles(filelist, uuidkey, 'outputTer')
-
- if success:
- print("Generated " + "/terrain/" + uuidkey + ".zip")
- return render_template('generate.html', urlkey="/terrain/" + uuidkey + ".zip", uuidkey=uuidkey)
- else:
- print("Failed " + "/terrain/" + uuidkey + ".zip")
- return render_template('generate.html', error = "Processing terrain", uuidkey=uuidkey)
- else:
- print("Bad get")
- return render_template('generate.html', error = "Need to use POST, not GET")
|