Skip to content

Commit 3dbc328

Browse files
update titiler (#35)
* update titiler * add gunicorn * add .env.example
1 parent 698be30 commit 3dbc328

8 files changed

Lines changed: 66 additions & 44 deletions

File tree

‎.env.example‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
ENVIRONMENT=local
2+
POSTGRES_USER=username
3+
POSTGRES_PASS=password
4+
POSTGRES_DBNAME=postgis
5+
POSTGRES_HOST_READER=host.docker.internal
6+
POSTGRES_HOST_WRITER=host.docker.internal
7+
POSTGRES_PORT=5432
8+
WEB_CONCURRENCY=10
9+
VSI_CACHE=TRUE
10+
GDAL_HTTP_MERGE_CONSECUTIVE_RANGES=YES
11+
GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR

‎Dockerfile‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ COPY . ./
2020

2121
ENV APP_HOST=0.0.0.0
2222
ENV APP_PORT=80
23+
ENV RELOAD=""
2324

2425
ENTRYPOINT ["pipenv", "run"]
25-
CMD uvicorn stac_api.app:app --host=${APP_HOST} --port=${APP_PORT} --reload
26+
CMD if [ "$RELOAD" ]; then uvicorn stac_api.app:app --host=${APP_HOST} --port=${APP_PORT} --reload ; \
27+
else gunicorn stac_api.app:app --preload -k uvicorn.workers.UvicornWorker --bind ${APP_HOST}:${APP_PORT} --log-level info; fi

‎Makefile‎

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,7 @@ run_docker = docker run -it --rm \
77
-v $(shell pwd):/app \
88
--env APP_HOST=${APP_HOST} \
99
--env APP_PORT=${APP_PORT} \
10-
--env POSTGRES_USER=username \
11-
--env POSTGRES_PASS=password \
12-
--env POSTGRES_DBNAME=postgis \
13-
--env POSTGRES_HOST_READER=host.docker.internal \
14-
--env POSTGRES_HOST_WRITER=host.docker.internal \
15-
--env POSTGRES_PORT=5432 \
16-
--env ENVIRONMENT=development \
10+
--env-file .env.example \
1711
arturo-ai/stac-api:latest
1812

1913
.PHONY: image

‎Pipfile‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ verify_ssl = "true"
55

66
[packages]
77
uvicorn = ">=0.11.7"
8+
gunicorn = "*"
89
fastapi = {extras = ["all"],version = "*"}
910
alembic = "*"
1011
psycopg2-binary = "*"
@@ -15,7 +16,7 @@ sqlakeyset = "*"
1516
stac-pydantic = ">=1.1.3"
1617
pydantic = {extras=["dotenv"], version="*"}
1718
cogeo-mosaic = "==3.0a10"
18-
titiler = "==0.1a0"
19+
titiler = "==0.1a2"
1920

2021
[dev-packages]
2122
pytest = "*"

‎Pipfile.lock‎

Lines changed: 22 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎stac_api/api/app.py‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55
from sqlalchemy.orm import sessionmaker
66
from starlette.requests import Request
77

8+
from stac_api.api.models import ItemUri
89
from stac_api.api.routers import (
910
create_core_router,
1011
create_tiles_router,
1112
create_transactions_router,
1213
)
14+
from stac_api.api.routes import create_endpoint_with_depends
1315
from stac_api.clients.postgres.core import CoreCrudClient
1416
from stac_api.clients.postgres.tokens import PaginationTokenClient
1517
from stac_api.clients.postgres.transactions import TransactionsClient
1618
from stac_api.clients.tiles.ogc import TilesClient
1719
from stac_api.config import AddOns, ApiExtensions, ApiSettings, inject_settings
1820
from stac_api.errors import DEFAULT_STATUS_CODES, add_exception_handlers
21+
from stac_api.models.ogc import TileSetResource
1922
from stac_api.openapi import config_openapi
2023
from stac_api.utils.dependencies import READER, WRITER
2124

@@ -43,7 +46,17 @@ def create_app(settings: ApiSettings) -> FastAPI:
4346

4447
if settings.add_on_is_enabled(AddOns.tiles):
4548
tiles_client = TilesClient()
46-
app.include_router(create_tiles_router(tiles_client))
49+
app.add_api_route(
50+
name="Get OGC Tiles Resource",
51+
path="/collections/{collectionId}/items/{itemId}/tiles",
52+
response_model=TileSetResource,
53+
response_model_exclude_none=True,
54+
response_model_exclude_unset=True,
55+
methods=["GET"],
56+
endpoint=create_endpoint_with_depends(tiles_client.get_item_tiles, ItemUri),
57+
tags=["OGC Tiles"],
58+
)
59+
app.include_router(create_tiles_router(), prefix="/titiler", tags=["Titiler"])
4760

4861
config_openapi(app)
4962

@@ -72,6 +85,8 @@ async def on_shutdown():
7285
@app.middleware("http")
7386
async def create_db_connection(request: Request, call_next):
7487
"""Create a new database connection for each request"""
88+
if "titiler" in str(request.url):
89+
return await call_next(request)
7590
reader = request.app.state.DB_READER()
7691
writer = request.app.state.DB_WRITER()
7792
READER.set(reader)

‎stac_api/api/routers.py‎

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,19 @@
1717
)
1818
from stac_api.api.routes import create_endpoint_from_model, create_endpoint_with_depends
1919
from stac_api.clients.base import BaseCoreClient, BaseTransactionsClient
20-
from stac_api.clients.tiles.ogc import TilesClient
2120
from stac_api.config import ApiSettings
22-
from stac_api.models import ogc, schemas
21+
from stac_api.models import schemas
2322
from stac_pydantic import ItemCollection
2423
from stac_pydantic.api import ConformanceClasses, LandingPage
2524

2625

27-
def create_tiles_router(client: TilesClient) -> APIRouter:
26+
def create_tiles_router() -> APIRouter:
2827
"""Create API router with OGC tiles endpoints"""
2928
from titiler.endpoints.stac import STACTiler
3029

3130
template_dir = pkg_resources.resource_filename("titiler", "templates")
3231
templates = Jinja2Templates(directory=template_dir)
3332

34-
router = APIRouter()
35-
router.add_api_route(
36-
name="Get OGC Tiles Resource",
37-
path="/collections/{collectionId}/items/{itemId}/tiles",
38-
response_model=ogc.TileSetResource,
39-
response_model_exclude_none=True,
40-
response_model_exclude_unset=True,
41-
methods=["GET"],
42-
endpoint=create_endpoint_with_depends(client.get_item_tiles, ItemUri),
43-
tags=["OGC Tiles"],
44-
)
4533
titiler_router = STACTiler().router
4634

4735
@titiler_router.get("/viewer", response_class=HTMLResponse)
@@ -57,9 +45,8 @@ def stac_demo(request: Request):
5745
media_type="text/html",
5846
)
5947

60-
router.include_router(titiler_router, tags=["Titiler"])
6148
# TODO: add titiler exception handlers
62-
return router
49+
return titiler_router
6350

6451

6552
def create_core_router(client: BaseCoreClient, settings: ApiSettings) -> APIRouter:

‎stac_api/models/links.py‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ def tiles(self) -> OGCTileLink:
138138
"""Create tiles link"""
139139
return OGCTileLink(
140140
href=urljoin(
141-
self.base_url, f"/tiles/{{z}}/{{x}}/{{y}}.png?url={self.item_uri}",
141+
self.base_url,
142+
f"/titiler/tiles/{{z}}/{{x}}/{{y}}.png?url={self.item_uri}",
142143
),
143144
rel=Relations.item,
144145
title="tiles",
@@ -149,7 +150,7 @@ def tiles(self) -> OGCTileLink:
149150
def viewer(self) -> OGCTileLink:
150151
"""Create viewer link"""
151152
return OGCTileLink(
152-
href=urljoin(self.base_url, f"/viewer?url={self.item_uri}"),
153+
href=urljoin(self.base_url, f"/titiler/viewer?url={self.item_uri}"),
153154
rel=Relations.alternate,
154155
type=MimeTypes.html,
155156
title="viewer",
@@ -158,15 +159,18 @@ def viewer(self) -> OGCTileLink:
158159
def tilejson(self) -> OGCTileLink:
159160
"""Create tilejson link"""
160161
return OGCTileLink(
161-
href=urljoin(self.base_url, f"/tilejson.json?url={self.item_uri}"),
162+
href=urljoin(self.base_url, f"/titiler/tilejson.json?url={self.item_uri}"),
162163
rel=Relations.alternate,
163164
type=MimeTypes.json,
164165
title="tilejson",
165166
)
166167

167168
def wmts(self) -> OGCTileLink:
169+
"""Create wmts capabilities link"""
168170
return OGCTileLink(
169-
href=urljoin(self.base_url, f"/WMTSCapabilities.xml?url={self.item_uri}"),
171+
href=urljoin(
172+
self.base_url, f"/titiler/WMTSCapabilities.xml?url={self.item_uri}"
173+
),
170174
rel=Relations.alternate,
171175
type=MimeTypes.xml,
172176
title="WMTS Capabilities",

0 commit comments

Comments
 (0)