57 lines
1.7 KiB
Python
Executable file
57 lines
1.7 KiB
Python
Executable file
#!/usr/bin/env python
|
|
"""
|
|
Small flask server to serve map tiles.
|
|
"""
|
|
from argparse import ArgumentParser
|
|
import importlib.util
|
|
from http import HTTPStatus
|
|
import errno
|
|
import os.path
|
|
import sys
|
|
from flask import Flask, send_file, Response, render_template
|
|
|
|
# Parse Arguments
|
|
parser = ArgumentParser(description="Map Tile Server")
|
|
parser.add_argument(
|
|
"--tile-path",
|
|
type=str,
|
|
help="Location of map tiles on the filesystem",
|
|
default=f"{os.path.expanduser('~')}/.local/share/marble/maps/earth/openstreetmap"
|
|
)
|
|
parser.add_argument("--port", type=int, help="Port to bind to.", default=9001)
|
|
args = vars(parser.parse_args())
|
|
|
|
|
|
# Try to locate mapserver folder
|
|
root_path = "mapserver"
|
|
if not os.path.isdir(root_path):
|
|
spec_location = importlib.util.find_spec('mapserver')
|
|
if spec_location is None or spec_location.origin is None:
|
|
print("mapserver folder is not in current directory or installed.")
|
|
sys.exit(1)
|
|
root_path = os.path.dirname(spec_location.origin)
|
|
|
|
|
|
app = Flask(__name__, root_path=root_path)
|
|
|
|
@app.route('/tiles/<zoom>/<y>/<x>')
|
|
def tiles(zoom, y, x):
|
|
"""Serve tiles directly from filesystem if found."""
|
|
filename = args['tile_path'] + f"/{zoom}/{x}/{y}.jpg"
|
|
if os.path.isfile(filename):
|
|
return send_file(filename)
|
|
return Response(status=HTTPStatus.NOT_FOUND)
|
|
|
|
@app.route('/')
|
|
def index():
|
|
"""Return a sample fullscreen map application."""
|
|
return render_template("index.html")
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
app.run(port=args['port'])
|
|
except OSError as e:
|
|
if e.errno == errno.EADDRINUSE:
|
|
print("Address-Port Combination in use. Is another servemaps running?")
|
|
os._exit(errno.EADDRINUSE)
|
|
raise e
|