This repository has been archived by the owner on Nov 7, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
main.py
71 lines (56 loc) · 2.19 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import os
import http
import click
import folium
import tempfile
import atexit
import itertools
from http.server import HTTPServer
from multiprocessing import Pool
from PIL import Image, ImageColor
import parser
ZOOM_LEVEL = 4
def serve_http(port, folder):
class Handler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=folder, **kwargs)
http_server = HTTPServer(("", port), Handler)
print("http://127.0.0.1:{}/index.html".format(port))
http_server.serve_forever()
def generate_image(tile, tmp_folder):
print("generating image for tile: {}".format(tile.id))
size = parser.TILE_WIDTH*parser.BITMAP_WIDTH // ZOOM_LEVEL
im = Image.new("RGBA", (size, size), (255, 255, 255, 0))
for block in tile.blocks.values():
for i in range(parser.BITMAP_WIDTH):
for j in range(parser.BITMAP_WIDTH):
x = block.x * parser.BITMAP_WIDTH + i
y = block.y * parser.BITMAP_WIDTH + j
x //= ZOOM_LEVEL
y //= ZOOM_LEVEL
if block.is_visited(i, j):
im.putpixel((x, y), ImageColor.getcolor('black', 'RGB'))
im.save(os.path.join(tmp_folder.name, "{}.png".format(tile.id)))
@click.command()
@click.option('--port', default=8080, help='http port for the web ui')
@click.argument('DIR')
def main(port, dir):
"""Load [Fog of World] data from DIR.
DIR is the path to the [Fog of World] folder, the given folder should contain a subfolder [Sync].
"""
fog_map = parser.FogMap(dir)
tmp_folder = tempfile.TemporaryDirectory()
def exit_handler():
tmp_folder.cleanup()
atexit.register(exit_handler)
m = folium.Map()
with Pool(4) as pool:
pool.starmap(generate_image, zip(fog_map.tile_map.values(), itertools.repeat(tmp_folder)))
for tile in fog_map.tile_map.values():
folium.raster_layers.ImageOverlay(
"http://127.0.0.1:{}/{}.png".format(port, tile.id), tile.bounds(), opacity=1).add_to(m)
print(tile.bounds())
m.save(os.path.join(tmp_folder.name, "index.html"))
serve_http(port, tmp_folder.name)
if __name__ == "__main__":
main()