You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.5 KiB
44 lines
1.5 KiB
import uuid
|
|
import subprocess
|
|
import shutil
|
|
from pathlib import Path
|
|
import json
|
|
|
|
def geojson2vt(uploaded_geojson, storage_path = None) -> str:
|
|
"""Convert geojson file to vector tiles
|
|
|
|
Args:
|
|
uploaded_geojson: GeoJSON file uploaded by user
|
|
|
|
Returns:
|
|
str: vector tiles id
|
|
"""
|
|
storage_path = storage_path or ""
|
|
# save the uploaded file
|
|
# get a path to the saved geojson
|
|
geojson_uuid = uuid.uuid4().hex
|
|
uploaded_geojson_path = Path(storage_path, "geojsons", geojson_uuid + ".geojson")
|
|
with open(uploaded_geojson_path, mode="xb") as geojson_file:
|
|
shutil.copyfileobj(uploaded_geojson.file, geojson_file)
|
|
vector_tiles_path = Path(storage_path, "vector_tiles", geojson_uuid)
|
|
tippecanoe_command = f"tippecanoe --maximum-zoom=g --output-to-directory={vector_tiles_path} --drop-densest-as-needed --no-tile-compression {uploaded_geojson_path}"
|
|
subprocess.run(tippecanoe_command, shell=True, check=True) # https://stackoverflow.com/a/51950538/14742462
|
|
metadata_path = Path(vector_tiles_path, "metadata.json")
|
|
with open(metadata_path, "r") as metadata_file:
|
|
metadata = json.load(metadata_file)
|
|
|
|
with open("catalog.json", "r") as catalog_file:
|
|
catalog = json.load(catalog_file)
|
|
catalog.append(metadata)
|
|
|
|
with open("catalog.json", "w") as catalog_file:
|
|
json.dump(catalog, catalog_file, ensure_ascii=False)
|
|
return vector_tiles_id
|
|
|
|
if __name__ == "__main__":
|
|
geojson2vt("ert")
|
|
|
|
|
|
|
|
|