Skip to content

Commit 58bce92

Browse files
authored
Merge pull request #185 from UW-Macrostrat/stats-tile
Usage stats tile route
2 parents 28bf4a8 + e62057f commit 58bce92

File tree

4 files changed

+90
-3
lines changed

4 files changed

+90
-3
lines changed

services/tileserver/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ test:
1111
poetry run pytest -s -x
1212

1313
docker-build:
14-
docker build -t tileserver .
14+
docker build -t macrostrat-tileserver .
1515

1616
styles:
1717
npm install -g carto
1818
poetry run tileserver create-mapnik-xml mapnik-xml-test
1919

2020
docker-run:
21-
docker run -p 8000:8000 --env-file .env tileserver
21+
docker run -p 8000:8000 --env-file .env macrostrat-tileserver

services/tileserver/macrostrat/tileserver/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ async def shutdown_event():
204204

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

207+
from .usage_stats import router as usage_stats_router
208+
209+
app.include_router(usage_stats_router, tags=["Usage stats"], prefix="/usage-stats")
210+
207211

208212
@app.get("/carto/rotation-models")
209213
async def rotation_models():

services/tileserver/macrostrat/tileserver/fossils/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
@router.get("/fossils/{z}/{x}/{y}")
13-
async def rgeom(
13+
async def tile_query(
1414
request: Request,
1515
z: int,
1616
x: int,
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from pathlib import Path
2+
from typing import List
3+
4+
from buildpg import V, render
5+
from fastapi import APIRouter, Request, Response
6+
from timvt.resources.enums import MimeTypes
7+
8+
from macrostrat.tileserver_utils import VectorTileResponse
9+
from macrostrat.utils import get_logger
10+
11+
from ..utils import get_layer_sql
12+
13+
log = get_logger(__name__)
14+
15+
router = APIRouter()
16+
17+
__here__ = Path(__file__).parent
18+
19+
20+
@router.get("/{slug}/{z}/{x}/{y}")
21+
async def get_tile(
22+
request: Request,
23+
slug: str,
24+
z: int,
25+
x: int,
26+
y: int,
27+
):
28+
"""Get a tile from the tileserver."""
29+
pool = request.app.state.pool
30+
31+
if slug != "macrostrat" and slug != "rockd":
32+
raise ValueError(
33+
"Invalid slug provided. Only 'macrostrat' and 'rockd' are supported."
34+
)
35+
36+
where = (
37+
"AND date >= (NOW() - INTERVAL '24 hours')"
38+
if "today" in request.query_params
39+
else ""
40+
)
41+
42+
query = f"""
43+
WITH
44+
tile AS (
45+
SELECT ST_TileEnvelope({z}, {x}, {y}) AS envelope,
46+
tile_layers.geographic_envelope({x}, {y}, {z}, 0.01) AS envelope_4326
47+
),
48+
points AS (
49+
SELECT
50+
id,
51+
tile_layers.tile_geom(
52+
ST_Intersection(
53+
ST_SetSRID(ST_MakePoint(lng, lat), 4326),
54+
envelope_4326
55+
),
56+
envelope
57+
) AS geom
58+
FROM usage_stats.{slug}_stats, tile
59+
WHERE
60+
lat IS NOT NULL AND lng IS NOT NULL
61+
AND ST_Intersects(
62+
ST_SetSRID(ST_MakePoint(lng, lat), 4326),
63+
envelope_4326
64+
)
65+
{where}
66+
)
67+
68+
SELECT ST_AsMVT(
69+
points.*,
70+
'default',
71+
4096,
72+
'geom'
73+
) AS mvt
74+
FROM points
75+
"""
76+
77+
q, p = render(query, **{})
78+
q = q.replace("textarray", "text[]")
79+
80+
async with pool.acquire() as con:
81+
data = await con.fetchval(q, *p)
82+
83+
return Response(data, media_type=MimeTypes.pbf.value)

0 commit comments

Comments
 (0)