6868 " >>> pip install titiler rio-tiler-pds\n " ,
6969 " \n " ,
7070 " \"\"\"\n " ,
71- " from dataclasses import dataclass, field \n " ,
72- " from typing import Dict, Type, Optional, Sequence \n " ,
71+ " from titiler.endpoints.factory import MultiBandTilerFactory, MosaicTilerFactory \n " ,
72+ " from titiler.dependencies import BandsExprParams \n " ,
7373 " \n " ,
74- " from titiler.endpoints.factory import TilerFactory, MosaicTilerFactory\n " ,
75- " from titiler.dependencies import DefaultDependency\n " ,
76- " \n " ,
77- " \n " ,
78- " from rio_tiler.models import Info, Metadata\n " ,
7974 " from rio_tiler_pds.sentinel.aws import S2COGReader\n " ,
8075 " from rio_tiler_pds.sentinel.utils import s2_sceneid_parser\n " ,
8176 " \n " ,
82- " from fastapi import FastAPI, Depends, Query\n " ,
77+ " from fastapi import FastAPI, Query\n " ,
8378 " \n " ,
8479 " \n " ,
85- " @dataclass\n " ,
86- " class CustomPathParams:\n " ,
80+ " def CustomPathParams(\n " ,
81+ " sceneid: str = Query(..., description=\" Sentinel 2 Sceneid.\" )\n " ,
82+ " ):\n " ,
8783 " \"\"\" Create dataset path from args\"\"\"\n " ,
88- " \n " ,
89- " sceneid: str = Query(..., description=\" Landsat 8 Sceneid.\" )\n " ,
90- " scene_metadata: Dict = field(init=False)\n " ,
91- " \n " ,
92- " def __post_init__(self,):\n " ,
93- " \"\"\" Define dataset URL.\"\"\"\n " ,
94- " self.url = self.sceneid\n " ,
95- " self.scene_metadata = s2_sceneid_parser(self.sceneid)\n " ,
96- " \n " ,
97- " \n " ,
98- " def BandsParams(\n " ,
99- " bands: str = Query(\n " ,
100- " ...,\n " ,
101- " title=\" bands names\" ,\n " ,
102- " description=\" comma (',') delimited bands names.\" ,\n " ,
103- " )\n " ,
104- " ) -> Sequence[str]:\n " ,
105- " \"\"\" Bands.\"\"\"\n " ,
106- " return bands.split(\" ,\" )\n " ,
107- " \n " ,
108- " \n " ,
109- " @dataclass\n " ,
110- " class BandsExprParams(DefaultDependency):\n " ,
111- " \"\"\" Band names and Expression parameters.\"\"\"\n " ,
112- " \n " ,
113- " bands: Optional[str] = Query(\n " ,
114- " None,\n " ,
115- " title=\" bands names\" ,\n " ,
116- " description=\" comma (',') delimited bands names.\" ,\n " ,
117- " )\n " ,
118- " expression: Optional[str] = Query(\n " ,
119- " None,\n " ,
120- " title=\" Band Math expression\" ,\n " ,
121- " description=\" rio-tiler's band math expression.\" ,\n " ,
122- " )\n " ,
123- " \n " ,
124- " def __post_init__(self):\n " ,
125- " \"\"\" Post Init.\"\"\"\n " ,
126- " if self.bands is not None:\n " ,
127- " self.kwargs[\" bands\" ] = self.bands.split(\" ,\" )\n " ,
128- " if self.expression is not None:\n " ,
129- " self.kwargs[\" expression\" ] = self.expression\n " ,
130- " \n " ,
131- " \n " ,
132- " @dataclass\n " ,
133- " class S2COGTiler(TilerFactory):\n " ,
134- " \"\"\" Custom Tiler Class for STAC.\"\"\"\n " ,
135- " \n " ,
136- " reader: Type[S2COGReader] = field(default=S2COGReader)\n " ,
137- " \n " ,
138- " path_dependency: Type[CustomPathParams] = CustomPathParams\n " ,
139- " \n " ,
140- " layer_dependency: Type[DefaultDependency] = BandsExprParams\n " ,
141- " \n " ,
142- " def info(self):\n " ,
143- " \"\"\" Register /info endpoint.\"\"\"\n " ,
144- " \n " ,
145- " @self.router.get(\n " ,
146- " \" /info\" ,\n " ,
147- " response_model=Info,\n " ,
148- " response_model_exclude={\" minzoom\" , \" maxzoom\" , \" center\" },\n " ,
149- " response_model_exclude_none=True,\n " ,
150- " responses={200: {\" description\" : \" Return dataset's basic info.\" }},\n " ,
151- " )\n " ,
152- " def info(\n " ,
153- " src_path=Depends(self.path_dependency),\n " ,
154- " bands=Depends(BandsParams),\n " ,
155- " kwargs: Dict = Depends(self.additional_dependency),\n " ,
156- " ):\n " ,
157- " \"\"\" Return basic info.\"\"\"\n " ,
158- " with self.reader(src_path.url, **self.reader_options) as src_dst:\n " ,
159- " info = src_dst.info(bands=bands, **kwargs)\n " ,
160- " return info\n " ,
161- " \n " ,
162- " def metadata(self):\n " ,
163- " \"\"\" Register /metadata endpoint.\"\"\"\n " ,
164- " \n " ,
165- " @self.router.get(\n " ,
166- " \" /metadata\" ,\n " ,
167- " response_model=Metadata,\n " ,
168- " response_model_exclude={\" minzoom\" , \" maxzoom\" , \" center\" },\n " ,
169- " response_model_exclude_none=True,\n " ,
170- " responses={200: {\" description\" : \" Return dataset's metadata.\" }},\n " ,
171- " )\n " ,
172- " def metadata(\n " ,
173- " src_path=Depends(self.path_dependency),\n " ,
174- " bands=Depends(BandsParams),\n " ,
175- " metadata_params=Depends(self.metadata_dependency),\n " ,
176- " kwargs: Dict = Depends(self.additional_dependency),\n " ,
177- " ):\n " ,
178- " \"\"\" Return metadata.\"\"\"\n " ,
179- " with self.reader(src_path.url, **self.reader_options) as src_dst:\n " ,
180- " info = src_dst.metadata(\n " ,
181- " metadata_params.pmin,\n " ,
182- " metadata_params.pmax,\n " ,
183- " bands=bands,\n " ,
184- " **metadata_params.kwargs,\n " ,
185- " **kwargs,\n " ,
186- " )\n " ,
187- " return info\n " ,
84+ " assert s2_sceneid_parser(sceneid)\n " ,
85+ " return sceneid\n " ,
18886 " \n " ,
18987 " \n " ,
19088 " app = FastAPI()\n " ,
19189 " \n " ,
192- " \n " ,
193- " scene_tiler = S2COGTiler(router_prefix=\" scenes\" )\n " ,
90+ " scene_tiler = MultiBandTilerFactory(reader=S2COGReader, path_dependency=CustomPathParams, router_prefix=\" scenes\" )\n " ,
19491 " app.include_router(scene_tiler.router, prefix=\" /scenes\" , tags=[\" scenes\" ])\n " ,
19592 " \n " ,
19693 " mosaic_tiler = MosaicTilerFactory(\n " ,
19794 " router_prefix=\" mosaic\" ,\n " ,
19895 " dataset_reader=S2COGReader,\n " ,
19996 " layer_dependency=BandsExprParams,\n " ,
200- " add_update=False,\n " ,
201- " add_create=False,\n " ,
20297 " )\n " ,
20398 " app.include_router(mosaic_tiler.router, prefix=\" /mosaic\" , tags=[\" mosaic\" ])\n " ,
20499 " ```"
704599 "name" : " python" ,
705600 "nbconvert_exporter" : " python" ,
706601 "pygments_lexer" : " ipython3" ,
707- "version" : " 3.8.6 "
602+ "version" : " 3.8.2-final "
708603 }
709604 },
710605 "nbformat" : 4 ,
711606 "nbformat_minor" : 2
712- }
607+ }
0 commit comments