improve python pmtiles-serve [#14]

This commit is contained in:
Brandon Liu
2021-06-12 19:43:50 +08:00
parent 08653afd52
commit 3184ec323a

View File

@@ -1,26 +1,34 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys import argparse
import re
import json
import http.server import http.server
import json
import re
from socketserver import ThreadingMixIn from socketserver import ThreadingMixIn
import sys
from pmtiles.reader import read from pmtiles.reader import read
# https://docs.python.org/3/library/http.server.html
class ThreadingSimpleServer(ThreadingMixIn, http.server.HTTPServer): class ThreadingSimpleServer(ThreadingMixIn, http.server.HTTPServer):
pass pass
if len(sys.argv) <= 1: parser = argparse.ArgumentParser(description='Convert between PMTiles and other archive formats.')
print("Usage: pmtiles-serve PMTILES_FILE") parser.add_argument('pmtiles_file',help='PMTiles archive to serve')
exit(1) parser.add_argument('port',help='Port to bind to')
parser.add_argument('--bind', help='Address to bind server to: default localhost')
parser.add_argument('--cors-allow-all', help='Return Access-Control-Allow-Origin:* header',action='store_true')
args = parser.parse_args()
with read(sys.argv[1]) as reader: with read(args.pmtiles_file) as reader:
fmt = reader.metadata['format'] fmt = reader.metadata['format']
class Handler(http.server.SimpleHTTPRequestHandler): class Handler(http.server.SimpleHTTPRequestHandler):
def do_GET(self): def do_GET(self):
if self.path == "/metadata": if self.path == "/metadata":
self.send_response(200) self.send_response(200)
if args.cors_allow_all:
self.send_header('Access-Control-Allow-Origin','*')
self.end_headers() self.end_headers()
self.wfile.write(json.dumps(reader.metadata).encode('utf-8')) self.wfile.write(json.dumps(reader.metadata).encode('utf-8'))
return return
@@ -40,11 +48,16 @@ with read(sys.argv[1]) as reader:
self.wfile.write("tile not found".encode('utf-8')) self.wfile.write("tile not found".encode('utf-8'))
return return
self.send_response(200) self.send_response(200)
self.end_headers() if args.cors_allow_all:
self.send_header('Content-Type','image/png') self.send_header('Access-Control-Allow-Origin','*')
if fmt == 'pbf':
self.send_header('Content-Type','application/x-protobuf')
else:
self.send_header('Content-Type','image/' + fmt)
self.end_headers() self.end_headers()
self.wfile.write(data) self.wfile.write(data)
print('serving localhost:8000/{z}/{x}/{y}.' + fmt) bind = args.bind or 'localhost'
httpd = ThreadingSimpleServer(('', 8000), Handler) print(f'serving {bind}:{args.port}/{{z}}/{{x}}/{{y}}.{fmt}, for development only')
httpd = ThreadingSimpleServer((args.bind or '', int(args.port)), Handler)
httpd.serve_forever() httpd.serve_forever()