Skip to content

Commit 28bf4a8

Browse files
authored
Merge pull request #181 from UW-Macrostrat/fossil-tileserver
Fossil tile route
2 parents ddc22fb + 38b5ece commit 28bf4a8

File tree

6 files changed

+123
-1
lines changed

6 files changed

+123
-1
lines changed

services/tileserver/Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ test:
1111
poetry run pytest -s -x
1212

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

1616
styles:
1717
npm install -g carto
1818
poetry run tileserver create-mapnik-xml mapnik-xml-test
19+
20+
docker-run:
21+
docker run -p 8000:8000 --env-file .env tileserver
Binary file not shown.

services/tileserver/macrostrat/tileserver/__init__.py

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

197197
app.include_router(checkins_router, tags=["Checkins"], prefix="/checkins/tiles")
198198

199+
from .fossils import router as fossils_router
200+
201+
app.include_router(fossils_router, tags=["PBDB"], prefix="/pbdb")
202+
199203
from .integrations import router as integrations_router
200204

201205
app.include_router(integrations_router, tags=["Integrations"], prefix="/integrations")
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from pathlib import Path
2+
3+
from buildpg import render
4+
from fastapi import APIRouter, Request, Response
5+
from timvt.resources.enums import MimeTypes
6+
7+
router = APIRouter()
8+
9+
__here__ = Path(__file__).parent
10+
11+
12+
@router.get("/fossils/{z}/{x}/{y}")
13+
async def rgeom(
14+
request: Request,
15+
z: int,
16+
x: int,
17+
y: int,
18+
):
19+
"""Get a tile from the tileserver."""
20+
pool = request.app.state.pool
21+
22+
if "cluster" in request.query_params:
23+
cluster_val = request.query_params["cluster"]
24+
cluster = cluster_val.lower() not in ("false", "0", "no")
25+
26+
else:
27+
cluster = True
28+
29+
if cluster:
30+
query = __here__ / "queries" / "clustered.sql"
31+
else:
32+
query = __here__ / "queries" / "unclustered.sql"
33+
34+
query = query.read_text()
35+
query = query.strip()
36+
if query.endswith(";"):
37+
query = query[:-1]
38+
39+
params = {
40+
"z": z,
41+
"x": x,
42+
"y": y,
43+
}
44+
45+
q, p = render(query, **params)
46+
q = q.replace("textarray", "text[]")
47+
48+
async with pool.acquire() as con:
49+
data = await con.fetchval(q, *p)
50+
51+
return Response(data, media_type=MimeTypes.pbf.value)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
WITH
2+
tile AS (
3+
SELECT ST_TileEnvelope(:z, :x, :y) AS envelope,
4+
tile_layers.geographic_envelope(:x, :y, :z, 0.01) AS envelope_4326
5+
),
6+
collections AS (
7+
SELECT
8+
collection_no,
9+
name,
10+
tile_layers.tile_geom(
11+
ST_Intersection(geom, envelope_4326),
12+
envelope
13+
) AS geom
14+
FROM macrostrat.pbdb_collections, tile
15+
WHERE
16+
geom IS NOT NULL
17+
AND ST_Intersects(geom, envelope_4326)
18+
),
19+
mvt_features AS (
20+
SELECT collection_no,
21+
ST_SnapToGrid(geom, 256, 256) AS cluster_geom,
22+
geom
23+
FROM collections
24+
),
25+
grouped_features AS (
26+
SELECT
27+
tile_utils.cluster_expansion_zoom(ST_Collect(geom), :z) AS expansion_zoom,
28+
count(*) AS n,
29+
st_centroid(ST_Collect(geom)) AS geom,
30+
CASE
31+
WHEN count(*) < 2 THEN string_agg(f.collection_no::text, ',')
32+
ELSE null
33+
END AS collection_no
34+
FROM mvt_features f
35+
GROUP BY cluster_geom
36+
)
37+
SELECT ST_AsMVT(row) AS mvt
38+
FROM (SELECT * FROM grouped_features) AS row;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
WITH
2+
tile AS (
3+
SELECT ST_TileEnvelope(:z, :x, :y) AS envelope,
4+
tile_layers.geographic_envelope(:x, :y, :z, 0.01) AS envelope_4326
5+
),
6+
collections AS (
7+
SELECT
8+
collection_no,
9+
name,
10+
tile_layers.tile_geom(
11+
ST_Intersection(geom, envelope_4326),
12+
envelope
13+
) AS geom
14+
FROM macrostrat.pbdb_collections, tile
15+
WHERE
16+
geom IS NOT NULL
17+
AND ST_Intersects(geom, envelope_4326)
18+
)
19+
20+
SELECT ST_AsMVT(
21+
collections.*,
22+
'default',
23+
4096,
24+
'geom'
25+
) AS mvt
26+
FROM collections;

0 commit comments

Comments
 (0)