Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions services/tileserver/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ test:
poetry run pytest -s -x

docker-build:
docker build -t tileserver .
docker build -t macrostrat-tileserver .

styles:
npm install -g carto
poetry run tileserver create-mapnik-xml mapnik-xml-test

docker-run:
docker run -p 8000:8000 --env-file .env tileserver
docker run -p 8000:8000 --env-file .env macrostrat-tileserver
4 changes: 4 additions & 0 deletions services/tileserver/macrostrat/tileserver/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,10 @@ async def shutdown_event():

app.include_router(integrations_router, tags=["Integrations"], prefix="/integrations")

from .usage_stats import router as usage_stats_router

app.include_router(usage_stats_router, tags=["Usage stats"], prefix="/usage-stats")


@app.get("/carto/rotation-models")
async def rotation_models():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


@router.get("/fossils/{z}/{x}/{y}")
async def rgeom(
async def tile_query(
request: Request,
z: int,
x: int,
Expand Down
83 changes: 83 additions & 0 deletions services/tileserver/macrostrat/tileserver/usage_stats/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
from pathlib import Path
from typing import List

from buildpg import V, render
from fastapi import APIRouter, Request, Response
from timvt.resources.enums import MimeTypes

from macrostrat.tileserver_utils import VectorTileResponse
from macrostrat.utils import get_logger

from ..utils import get_layer_sql

log = get_logger(__name__)

router = APIRouter()

__here__ = Path(__file__).parent


@router.get("/{slug}/{z}/{x}/{y}")
async def get_tile(
request: Request,
slug: str,
z: int,
x: int,
y: int,
):
"""Get a tile from the tileserver."""
pool = request.app.state.pool

if slug != "macrostrat" and slug != "rockd":
raise ValueError(
"Invalid slug provided. Only 'macrostrat' and 'rockd' are supported."
)

where = (
"AND date >= (NOW() - INTERVAL '24 hours')"
if "today" in request.query_params
else ""
)

query = f"""
WITH
tile AS (
SELECT ST_TileEnvelope({z}, {x}, {y}) AS envelope,
tile_layers.geographic_envelope({x}, {y}, {z}, 0.01) AS envelope_4326
),
points AS (
SELECT
id,
tile_layers.tile_geom(
ST_Intersection(
ST_SetSRID(ST_MakePoint(lng, lat), 4326),
envelope_4326
),
envelope
) AS geom
FROM usage_stats.{slug}_stats, tile
WHERE
lat IS NOT NULL AND lng IS NOT NULL
AND ST_Intersects(
ST_SetSRID(ST_MakePoint(lng, lat), 4326),
envelope_4326
)
{where}
)

SELECT ST_AsMVT(
points.*,
'default',
4096,
'geom'
) AS mvt
FROM points
"""

q, p = render(query, **{})
q = q.replace("textarray", "text[]")

async with pool.acquire() as con:
data = await con.fetchval(q, *p)

return Response(data, media_type=MimeTypes.pbf.value)