map-machine/roentgen/server.py
2021-07-11 03:12:14 +03:00

58 lines
1.8 KiB
Python

import logging
from http.server import BaseHTTPRequestHandler, HTTPServer
from pathlib import Path
from typing import Optional
from roentgen.raster import rasterize
from roentgen.tile import Tile
class Handler(BaseHTTPRequestHandler):
update_cache: bool = False
def __init__(self, request, client_address, server):
super().__init__(request, client_address, server)
def write(self, message):
if isinstance(message, bytes):
self.wfile.write(message)
else:
self.wfile.write(message.encode("utf-8"))
def do_GET(self):
parts = self.path.split("/")
if not (len(parts) == 5 and not parts[0] and parts[1] == "tiles"):
return
zoom = int(parts[2])
x = int(parts[3])
y = int(parts[4])
png_path = Path("tiles") / Path(f"tile_{zoom}_{x}_{y}.png")
if self.update_cache:
svg_path = Path("tiles") / Path(f"tile_{zoom}_{x}_{y}.svg")
if not png_path.exists():
if not svg_path.exists():
tile = Tile(x, y, zoom)
tile.draw(Path("tiles"))
rasterize(svg_path, png_path)
if zoom != 18:
return
if png_path.exists():
with png_path.open("rb") as input_file:
self.send_response(200)
self.send_header("Content-type", "image/png")
self.end_headers()
self.write(input_file.read())
return
def ui(args):
server: Optional[HTTPServer] = None
try:
port: int = 8080
server = HTTPServer(("", port), Handler)
server.serve_forever()
logging.info(f"Server started on port {port}.")
finally:
if server:
server.socket.close()