diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4d4f498 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +/src/output/**/** +/src/temp/** \ No newline at end of file diff --git a/.gitignore b/.gitignore index d0dea4f..f9c43e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -output/ -temp/ \ No newline at end of file +src/output/ +src/temp/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2204069 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM python:3.8 + +WORKDIR /app +COPY src/requirements.txt ./ + +RUN pip install -r requirements.txt + +# Bundle app source +COPY src /app + +EXPOSE 8080 +CMD [ "python", "server.py" ] \ No newline at end of file diff --git a/README.md b/README.md index 0f3fe5a..d798fdd 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,21 @@ This tiny python based script allows you to download map tiles from Google, Bing python server.py ``` -If your web browser doesn't open a map afterwards, navigate to `UI\index.htm` and open it manually. The output tiles will be in the `output\{timestamp}\` directory by default. +Then open up your web browser and navigate to `http://localhost:8080`. The output map tiles will be in the `output\{timestamp}\` directory by default. ## Requirements -Needs **Python 3.5** and a modern web browser. Other Python versions could work but aren't yet tested. +Needs **Python 3.0+**, [Pillow](https://pypi.org/project/Pillow/) library, and a modern web browser. Other Python versions could work but aren't yet tested. If you can't install manually, try docker for easy setup. + +## Via Docker + +Docker is a pretty simple way to install and contain applications. [Install Docker on your system](https://www.docker.com/products/docker-desktop), and paste this on your command line: + +```sh +docker run -v $PWD/output:/app/output/ -p 8080:8080 -it aliashraf/map-tiles-downloader +``` + +Now open the browser and head over to `http://localhost:8080`. The downloaded maps will be stored in the `output` directory. ## Purpose @@ -31,6 +41,9 @@ I design map related things as a hobby, and often I have to work with offline ma - Super easy to use map UI to select region and options - Multi-threading to download tiles in parallel - Cross platform, use any OS as long as it has Python and a browser +- Dockerfile available for easy setup +- Supports 2x/Hi-Res/Retina/512x512 tiles my merging multiple tiles +- Supports downloading to file as well as mbtile format - Select multiple zoom levels in one go - Ability to ignore tiles already downloaded - Specify any custom file name format @@ -50,4 +63,4 @@ For latest releases and announcements, check out my site: [aliashraf.net](http:/ This software is released under the [MIT License](LICENSE). Please read LICENSE for information on the software availability and distribution. -Copyright (c) 2018 [Ali Ashraf](http://aliashraf.net) \ No newline at end of file +Copyright (c) 2020 [Ali Ashraf](http://aliashraf.net) \ No newline at end of file diff --git a/server.py b/server.py deleted file mode 100644 index 05d3b97..0000000 --- a/server.py +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env python - -from http.server import BaseHTTPRequestHandler, HTTPServer -from socketserver import ThreadingMixIn -import threading - -from urllib.parse import urlparse -from urllib.parse import parse_qs -from urllib.parse import parse_qsl -import urllib.request -import cgi -import uuid -import random -import string -from cgi import parse_header, parse_multipart -import argparse -import uuid -import random -import time -import json -import shutil -import ssl -import glob -import os -import base64 - -lock = threading.Lock() - -class serverHandler(BaseHTTPRequestHandler): - - def ensureDirectory(self, directory): - - thisPath = os.path.join('output', directory) - - lock.acquire() - try: - - if not os.path.exists('temp'): - os.makedirs('temp') - - if not os.path.exists('output'): - os.makedirs('output') - - - if not os.path.exists(thisPath): - os.makedirs(thisPath) - - finally: - lock.release() - - return thisPath - - def randomString(self): - return uuid.uuid4().hex.upper()[0:6] - - def downloadFile(self, url, destination): - - code = 0 - - # monkey patching SSL certificate issue - # DONT use it in a prod/sensitive environment - ssl._create_default_https_context = ssl._create_unverified_context - - try: - path, response = urllib.request.urlretrieve(url, destination) - code = 200 - except urllib.error.URLError as e: - if not hasattr(e, "code"): - print(e) - code = -1 - else: - code = e.code - - return code - - - def do_POST(self): - - ctype, pdict = parse_header(self.headers['content-type']) - pdict['boundary'] = bytes(pdict['boundary'].encode('ascii')) - postvars = parse_multipart(self.rfile, pdict) - - parts = urlparse(self.path) - if parts.path == '/download-tile': - - x = int(postvars['x'][0]) - y = int(postvars['y'][0]) - z = int(postvars['z'][0]) - quad = str(postvars['quad'][0].decode("utf-8")) - timestamp = int(postvars['timestamp'][0]) - outputDirectory = str(postvars['outputDirectory'][0].decode("utf-8")) - outputFile = str(postvars['outputFile'][0].decode("utf-8")) - source = str(postvars['source'][0].decode("utf-8")) - - replaceMap = { - "x": str(x), - "y": str(y), - "z": str(z), - "quad": quad, - "timestamp": str(timestamp), - } - - for key, value in replaceMap.items(): - newKey = str("{" + str(key) + "}") - outputDirectory = outputDirectory.replace(newKey, value) - outputFile = outputFile.replace(newKey, value) - source = source.replace(newKey, value) - - result = {} - - thisPath = self.ensureDirectory(outputDirectory); - filePath = os.path.join(thisPath, outputFile) - - print("\n") - - if os.path.isfile(filePath): - result["code"] = 200 - result["message"] = 'Tile already exists' - - print("EXISTS: " + filePath) - - else: - tempFile = self.randomString() + ".png" - tempFilePath = os.path.join("temp", tempFile) - - result["code"] = self.downloadFile(source, tempFilePath) - - print("HIT: " + source + "\n" + "RETURN: " + str(result["code"])) - - if os.path.isfile(tempFilePath): - shutil.copyfile(tempFilePath, filePath) - os.remove(tempFilePath) - - result["message"] = 'Tile Downloaded' - print("SAVE: " + filePath) - - else: - result["message"] = 'Download failed' - - - if os.path.isfile(filePath): - with open(filePath, "rb") as image_file: - result["image"] = base64.b64encode(image_file.read()).decode("utf-8") - - - self.send_response(200) - self.send_header("Access-Control-Allow-Origin", "*") - self.send_header("Content-Type", "application/json") - self.end_headers() - self.wfile.write(json.dumps(result).encode('utf-8')) - return - -class serverThreadedHandler(ThreadingMixIn, HTTPServer): - """Handle requests in a separate thread.""" - -def run(): - print('Starting Server...') - server_address = ('', 11291) - httpd = serverThreadedHandler(server_address, serverHandler) - print('Running Server...') - - os.startfile('UI\\index.htm', 'open') - print("Open UI\\index.htm to view the application.") - - httpd.serve_forever() - -run() diff --git a/UI/async.min.js b/src/UI/async.min.js similarity index 100% rename from UI/async.min.js rename to src/UI/async.min.js diff --git a/UI/fonts/fonts.css b/src/UI/fonts/fonts.css similarity index 100% rename from UI/fonts/fonts.css rename to src/UI/fonts/fonts.css diff --git a/UI/fonts/inconsolata-v16-latin-700.eot b/src/UI/fonts/inconsolata-v16-latin-700.eot similarity index 100% rename from UI/fonts/inconsolata-v16-latin-700.eot rename to src/UI/fonts/inconsolata-v16-latin-700.eot diff --git a/UI/fonts/inconsolata-v16-latin-700.svg b/src/UI/fonts/inconsolata-v16-latin-700.svg similarity index 100% rename from UI/fonts/inconsolata-v16-latin-700.svg rename to src/UI/fonts/inconsolata-v16-latin-700.svg diff --git a/UI/fonts/inconsolata-v16-latin-700.ttf b/src/UI/fonts/inconsolata-v16-latin-700.ttf similarity index 100% rename from UI/fonts/inconsolata-v16-latin-700.ttf rename to src/UI/fonts/inconsolata-v16-latin-700.ttf diff --git a/UI/fonts/inconsolata-v16-latin-700.woff b/src/UI/fonts/inconsolata-v16-latin-700.woff similarity index 100% rename from UI/fonts/inconsolata-v16-latin-700.woff rename to src/UI/fonts/inconsolata-v16-latin-700.woff diff --git a/UI/fonts/inconsolata-v16-latin-700.woff2 b/src/UI/fonts/inconsolata-v16-latin-700.woff2 similarity index 100% rename from UI/fonts/inconsolata-v16-latin-700.woff2 rename to src/UI/fonts/inconsolata-v16-latin-700.woff2 diff --git a/UI/fonts/inconsolata-v16-latin-regular.eot b/src/UI/fonts/inconsolata-v16-latin-regular.eot similarity index 100% rename from UI/fonts/inconsolata-v16-latin-regular.eot rename to src/UI/fonts/inconsolata-v16-latin-regular.eot diff --git a/UI/fonts/inconsolata-v16-latin-regular.svg b/src/UI/fonts/inconsolata-v16-latin-regular.svg similarity index 100% rename from UI/fonts/inconsolata-v16-latin-regular.svg rename to src/UI/fonts/inconsolata-v16-latin-regular.svg diff --git a/UI/fonts/inconsolata-v16-latin-regular.ttf b/src/UI/fonts/inconsolata-v16-latin-regular.ttf similarity index 100% rename from UI/fonts/inconsolata-v16-latin-regular.ttf rename to src/UI/fonts/inconsolata-v16-latin-regular.ttf diff --git a/UI/fonts/inconsolata-v16-latin-regular.woff b/src/UI/fonts/inconsolata-v16-latin-regular.woff similarity index 100% rename from UI/fonts/inconsolata-v16-latin-regular.woff rename to src/UI/fonts/inconsolata-v16-latin-regular.woff diff --git a/UI/fonts/inconsolata-v16-latin-regular.woff2 b/src/UI/fonts/inconsolata-v16-latin-regular.woff2 similarity index 100% rename from UI/fonts/inconsolata-v16-latin-regular.woff2 rename to src/UI/fonts/inconsolata-v16-latin-regular.woff2 diff --git a/UI/fonts/open-sans-v15-latin-300.eot b/src/UI/fonts/open-sans-v15-latin-300.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-300.eot rename to src/UI/fonts/open-sans-v15-latin-300.eot diff --git a/UI/fonts/open-sans-v15-latin-300.svg b/src/UI/fonts/open-sans-v15-latin-300.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-300.svg rename to src/UI/fonts/open-sans-v15-latin-300.svg diff --git a/UI/fonts/open-sans-v15-latin-300.ttf b/src/UI/fonts/open-sans-v15-latin-300.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-300.ttf rename to src/UI/fonts/open-sans-v15-latin-300.ttf diff --git a/UI/fonts/open-sans-v15-latin-300.woff b/src/UI/fonts/open-sans-v15-latin-300.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-300.woff rename to src/UI/fonts/open-sans-v15-latin-300.woff diff --git a/UI/fonts/open-sans-v15-latin-300.woff2 b/src/UI/fonts/open-sans-v15-latin-300.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-300.woff2 rename to src/UI/fonts/open-sans-v15-latin-300.woff2 diff --git a/UI/fonts/open-sans-v15-latin-300italic.eot b/src/UI/fonts/open-sans-v15-latin-300italic.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-300italic.eot rename to src/UI/fonts/open-sans-v15-latin-300italic.eot diff --git a/UI/fonts/open-sans-v15-latin-300italic.svg b/src/UI/fonts/open-sans-v15-latin-300italic.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-300italic.svg rename to src/UI/fonts/open-sans-v15-latin-300italic.svg diff --git a/UI/fonts/open-sans-v15-latin-300italic.ttf b/src/UI/fonts/open-sans-v15-latin-300italic.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-300italic.ttf rename to src/UI/fonts/open-sans-v15-latin-300italic.ttf diff --git a/UI/fonts/open-sans-v15-latin-300italic.woff b/src/UI/fonts/open-sans-v15-latin-300italic.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-300italic.woff rename to src/UI/fonts/open-sans-v15-latin-300italic.woff diff --git a/UI/fonts/open-sans-v15-latin-300italic.woff2 b/src/UI/fonts/open-sans-v15-latin-300italic.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-300italic.woff2 rename to src/UI/fonts/open-sans-v15-latin-300italic.woff2 diff --git a/UI/fonts/open-sans-v15-latin-600.eot b/src/UI/fonts/open-sans-v15-latin-600.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-600.eot rename to src/UI/fonts/open-sans-v15-latin-600.eot diff --git a/UI/fonts/open-sans-v15-latin-600.svg b/src/UI/fonts/open-sans-v15-latin-600.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-600.svg rename to src/UI/fonts/open-sans-v15-latin-600.svg diff --git a/UI/fonts/open-sans-v15-latin-600.ttf b/src/UI/fonts/open-sans-v15-latin-600.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-600.ttf rename to src/UI/fonts/open-sans-v15-latin-600.ttf diff --git a/UI/fonts/open-sans-v15-latin-600.woff b/src/UI/fonts/open-sans-v15-latin-600.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-600.woff rename to src/UI/fonts/open-sans-v15-latin-600.woff diff --git a/UI/fonts/open-sans-v15-latin-600.woff2 b/src/UI/fonts/open-sans-v15-latin-600.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-600.woff2 rename to src/UI/fonts/open-sans-v15-latin-600.woff2 diff --git a/UI/fonts/open-sans-v15-latin-600italic.eot b/src/UI/fonts/open-sans-v15-latin-600italic.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-600italic.eot rename to src/UI/fonts/open-sans-v15-latin-600italic.eot diff --git a/UI/fonts/open-sans-v15-latin-600italic.svg b/src/UI/fonts/open-sans-v15-latin-600italic.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-600italic.svg rename to src/UI/fonts/open-sans-v15-latin-600italic.svg diff --git a/UI/fonts/open-sans-v15-latin-600italic.ttf b/src/UI/fonts/open-sans-v15-latin-600italic.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-600italic.ttf rename to src/UI/fonts/open-sans-v15-latin-600italic.ttf diff --git a/UI/fonts/open-sans-v15-latin-600italic.woff b/src/UI/fonts/open-sans-v15-latin-600italic.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-600italic.woff rename to src/UI/fonts/open-sans-v15-latin-600italic.woff diff --git a/UI/fonts/open-sans-v15-latin-600italic.woff2 b/src/UI/fonts/open-sans-v15-latin-600italic.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-600italic.woff2 rename to src/UI/fonts/open-sans-v15-latin-600italic.woff2 diff --git a/UI/fonts/open-sans-v15-latin-700.eot b/src/UI/fonts/open-sans-v15-latin-700.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-700.eot rename to src/UI/fonts/open-sans-v15-latin-700.eot diff --git a/UI/fonts/open-sans-v15-latin-700.svg b/src/UI/fonts/open-sans-v15-latin-700.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-700.svg rename to src/UI/fonts/open-sans-v15-latin-700.svg diff --git a/UI/fonts/open-sans-v15-latin-700.ttf b/src/UI/fonts/open-sans-v15-latin-700.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-700.ttf rename to src/UI/fonts/open-sans-v15-latin-700.ttf diff --git a/UI/fonts/open-sans-v15-latin-700.woff b/src/UI/fonts/open-sans-v15-latin-700.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-700.woff rename to src/UI/fonts/open-sans-v15-latin-700.woff diff --git a/UI/fonts/open-sans-v15-latin-700.woff2 b/src/UI/fonts/open-sans-v15-latin-700.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-700.woff2 rename to src/UI/fonts/open-sans-v15-latin-700.woff2 diff --git a/UI/fonts/open-sans-v15-latin-700italic.eot b/src/UI/fonts/open-sans-v15-latin-700italic.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-700italic.eot rename to src/UI/fonts/open-sans-v15-latin-700italic.eot diff --git a/UI/fonts/open-sans-v15-latin-700italic.svg b/src/UI/fonts/open-sans-v15-latin-700italic.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-700italic.svg rename to src/UI/fonts/open-sans-v15-latin-700italic.svg diff --git a/UI/fonts/open-sans-v15-latin-700italic.ttf b/src/UI/fonts/open-sans-v15-latin-700italic.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-700italic.ttf rename to src/UI/fonts/open-sans-v15-latin-700italic.ttf diff --git a/UI/fonts/open-sans-v15-latin-700italic.woff b/src/UI/fonts/open-sans-v15-latin-700italic.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-700italic.woff rename to src/UI/fonts/open-sans-v15-latin-700italic.woff diff --git a/UI/fonts/open-sans-v15-latin-700italic.woff2 b/src/UI/fonts/open-sans-v15-latin-700italic.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-700italic.woff2 rename to src/UI/fonts/open-sans-v15-latin-700italic.woff2 diff --git a/UI/fonts/open-sans-v15-latin-800.eot b/src/UI/fonts/open-sans-v15-latin-800.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-800.eot rename to src/UI/fonts/open-sans-v15-latin-800.eot diff --git a/UI/fonts/open-sans-v15-latin-800.svg b/src/UI/fonts/open-sans-v15-latin-800.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-800.svg rename to src/UI/fonts/open-sans-v15-latin-800.svg diff --git a/UI/fonts/open-sans-v15-latin-800.ttf b/src/UI/fonts/open-sans-v15-latin-800.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-800.ttf rename to src/UI/fonts/open-sans-v15-latin-800.ttf diff --git a/UI/fonts/open-sans-v15-latin-800.woff b/src/UI/fonts/open-sans-v15-latin-800.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-800.woff rename to src/UI/fonts/open-sans-v15-latin-800.woff diff --git a/UI/fonts/open-sans-v15-latin-800.woff2 b/src/UI/fonts/open-sans-v15-latin-800.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-800.woff2 rename to src/UI/fonts/open-sans-v15-latin-800.woff2 diff --git a/UI/fonts/open-sans-v15-latin-800italic.eot b/src/UI/fonts/open-sans-v15-latin-800italic.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-800italic.eot rename to src/UI/fonts/open-sans-v15-latin-800italic.eot diff --git a/UI/fonts/open-sans-v15-latin-800italic.svg b/src/UI/fonts/open-sans-v15-latin-800italic.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-800italic.svg rename to src/UI/fonts/open-sans-v15-latin-800italic.svg diff --git a/UI/fonts/open-sans-v15-latin-800italic.ttf b/src/UI/fonts/open-sans-v15-latin-800italic.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-800italic.ttf rename to src/UI/fonts/open-sans-v15-latin-800italic.ttf diff --git a/UI/fonts/open-sans-v15-latin-800italic.woff b/src/UI/fonts/open-sans-v15-latin-800italic.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-800italic.woff rename to src/UI/fonts/open-sans-v15-latin-800italic.woff diff --git a/UI/fonts/open-sans-v15-latin-800italic.woff2 b/src/UI/fonts/open-sans-v15-latin-800italic.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-800italic.woff2 rename to src/UI/fonts/open-sans-v15-latin-800italic.woff2 diff --git a/UI/fonts/open-sans-v15-latin-italic.eot b/src/UI/fonts/open-sans-v15-latin-italic.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-italic.eot rename to src/UI/fonts/open-sans-v15-latin-italic.eot diff --git a/UI/fonts/open-sans-v15-latin-italic.svg b/src/UI/fonts/open-sans-v15-latin-italic.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-italic.svg rename to src/UI/fonts/open-sans-v15-latin-italic.svg diff --git a/UI/fonts/open-sans-v15-latin-italic.ttf b/src/UI/fonts/open-sans-v15-latin-italic.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-italic.ttf rename to src/UI/fonts/open-sans-v15-latin-italic.ttf diff --git a/UI/fonts/open-sans-v15-latin-italic.woff b/src/UI/fonts/open-sans-v15-latin-italic.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-italic.woff rename to src/UI/fonts/open-sans-v15-latin-italic.woff diff --git a/UI/fonts/open-sans-v15-latin-italic.woff2 b/src/UI/fonts/open-sans-v15-latin-italic.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-italic.woff2 rename to src/UI/fonts/open-sans-v15-latin-italic.woff2 diff --git a/UI/fonts/open-sans-v15-latin-regular.eot b/src/UI/fonts/open-sans-v15-latin-regular.eot similarity index 100% rename from UI/fonts/open-sans-v15-latin-regular.eot rename to src/UI/fonts/open-sans-v15-latin-regular.eot diff --git a/UI/fonts/open-sans-v15-latin-regular.svg b/src/UI/fonts/open-sans-v15-latin-regular.svg similarity index 100% rename from UI/fonts/open-sans-v15-latin-regular.svg rename to src/UI/fonts/open-sans-v15-latin-regular.svg diff --git a/UI/fonts/open-sans-v15-latin-regular.ttf b/src/UI/fonts/open-sans-v15-latin-regular.ttf similarity index 100% rename from UI/fonts/open-sans-v15-latin-regular.ttf rename to src/UI/fonts/open-sans-v15-latin-regular.ttf diff --git a/UI/fonts/open-sans-v15-latin-regular.woff b/src/UI/fonts/open-sans-v15-latin-regular.woff similarity index 100% rename from UI/fonts/open-sans-v15-latin-regular.woff rename to src/UI/fonts/open-sans-v15-latin-regular.woff diff --git a/UI/fonts/open-sans-v15-latin-regular.woff2 b/src/UI/fonts/open-sans-v15-latin-regular.woff2 similarity index 100% rename from UI/fonts/open-sans-v15-latin-regular.woff2 rename to src/UI/fonts/open-sans-v15-latin-regular.woff2 diff --git a/UI/index.htm b/src/UI/index.htm similarity index 73% rename from UI/index.htm rename to src/UI/index.htm index 0421b5c..f089415 100644 --- a/UI/index.htm +++ b/src/UI/index.htm @@ -5,7 +5,8 @@ - + + @@ -47,11 +48,11 @@ Search an Area -
-

+ +

-

+
@@ -62,9 +63,11 @@ Select a Region -

- Draw a rectangle -

+
3 @@ -73,7 +76,7 @@ Configure
-

+