mirror of
https://github.com/enzet/map-machine.git
synced 2025-04-30 18:57:49 +02:00
62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
import logging
|
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
from pathlib import Path
|
|
from typing import Optional
|
|
|
|
from roentgen import workspace
|
|
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)
|
|
self.cache: Path = Path("cache")
|
|
|
|
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])
|
|
tile_path: Path = workspace.get_tile_path()
|
|
png_path = tile_path / f"tile_{zoom}_{x}_{y}.png"
|
|
if self.update_cache:
|
|
svg_path = tile_path / f"tile_{zoom}_{x}_{y}.svg"
|
|
if not png_path.exists():
|
|
if not svg_path.exists():
|
|
tile = Tile(x, y, zoom)
|
|
tile.draw(tile_path, self.cache)
|
|
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(options):
|
|
server: Optional[HTTPServer] = None
|
|
try:
|
|
port: int = 8080
|
|
server = HTTPServer(("", port), Handler)
|
|
server.cache_path = Path(options.cache)
|
|
server.serve_forever()
|
|
logging.info(f"Server started on port {port}.")
|
|
finally:
|
|
if server:
|
|
server.socket.close()
|