98 lines
2.5 KiB
Python
98 lines
2.5 KiB
Python
from flask import Flask, Response, abort, render_template, send_file
|
|
from flask_cors import CORS
|
|
from pymbtiles import MBtiles
|
|
import os
|
|
|
|
from cachetools import LRUCache
|
|
|
|
tile_cache = LRUCache(maxsize=5000)
|
|
|
|
app = Flask(__name__)
|
|
CORS(app)
|
|
|
|
MBTILES_PATH = os.path.join(app.root_path, "static", "data-files/cobertura.mbtiles")
|
|
|
|
def flip_y(z, y):
|
|
return (1 << z) - 1 - y
|
|
|
|
@app.route("/")
|
|
def index():
|
|
return render_template("index.html")
|
|
|
|
|
|
@app.route("/tiles/<int:z>/<int:x>/<int:y>.pbf")
|
|
def tiles(z, x, y):
|
|
y = flip_y(z, y)
|
|
key = (z, x, y)
|
|
|
|
if key in tile_cache:
|
|
tile = tile_cache[key]
|
|
else:
|
|
with MBtiles(MBTILES_PATH) as mbtiles:
|
|
tile = mbtiles.read_tile(z, x, y)
|
|
if tile is None:
|
|
abort(404)
|
|
if isinstance(tile, tuple):
|
|
tile = tile[0]
|
|
tile_cache[key] = tile
|
|
|
|
return Response(
|
|
tile,
|
|
mimetype="application/x-protobuf",
|
|
headers={
|
|
"Content-Encoding": "gzip",
|
|
"Cache-Control": "public, max-age=86400"
|
|
}
|
|
)
|
|
|
|
# return Response(
|
|
# tile,
|
|
# mimetype="application/x-protobuf",
|
|
# headers={
|
|
# "Content-Encoding": "gzip",
|
|
# "Cache-Control": "no-store, no-cache, must-revalidate, max-age=0"
|
|
# }
|
|
# )
|
|
|
|
|
|
@app.route("/api/poligonos-edos")
|
|
def poligonos_edos():
|
|
response = send_file(
|
|
os.path.join(app.root_path, "static/data-files", "poligonos_edos_mx.json"),
|
|
mimetype="application/geo+json",
|
|
max_age=86400
|
|
)
|
|
response.headers["Access-Control-Allow-Origin"] = "*"
|
|
return response
|
|
|
|
# @app.route("/api/poligonos-edos")
|
|
# def poligonos_edos():
|
|
# response = send_file(
|
|
# os.path.join(app.root_path, "static/data-files", "poligonos_edos_mx.json"),
|
|
# mimetype="application/geo+json",
|
|
# max_age=0
|
|
# )
|
|
# response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0"
|
|
# response.headers["Access-Control-Allow-Origin"] = "*"
|
|
# return response
|
|
|
|
|
|
@app.route("/file/download/<path:filename>")
|
|
def download_file(filename):
|
|
file_path = os.path.join(app.root_path, "static/data-files", filename)
|
|
if not os.path.isfile(file_path):
|
|
abort(404)
|
|
return send_file(
|
|
file_path,
|
|
as_attachment=True
|
|
)
|
|
|
|
|
|
@app.errorhandler(404)
|
|
def page_not_found(error):
|
|
return render_template("404.html"), 404
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app.run(debug=True, threaded=True)
|