Skip to content

Commit 1222577

Browse files
Merge pull request #13 from sentinel-hub/feature/s-5
Feature/s 5
2 parents 53320b4 + 341a5c7 commit 1222577

File tree

8 files changed

+387
-2
lines changed

8 files changed

+387
-2
lines changed

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ S1GRDEW_LAYER_ID=
99
S2L2A_LAYER_ID=
1010
S3SLSTR_LAYER_ID=
1111
S3OLCI_LAYER_ID=
12+
S5PL2_LAYER_ID=

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { S2L2ALayer } from 'src/layer/S2L2ALayer';
1818
import { S2L1CLayer } from 'src/layer/S2L1CLayer';
1919
import { S3SLSTRLayer } from 'src/layer/S3SLSTRLayer';
2020
import { S3OLCILayer } from 'src/layer/S3OLCILayer';
21+
import { S5PL2Layer } from 'src/layer/S5PL2Layer';
2122
import { MODISLayer } from 'src/layer/MODISLayer';
2223
import { DEMLayer } from 'src/layer/DEMLayer';
2324
import { Landsat8AWSLayer } from 'src/layer/Landsat8AWSLayer';
@@ -40,6 +41,7 @@ export {
4041
S2L1CLayer,
4142
S3SLSTRLayer,
4243
S3OLCILayer,
44+
S5PL2Layer,
4345
MODISLayer,
4446
DEMLayer,
4547
Landsat8AWSLayer,

src/layer/LayersFactory.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
DATASET_AWSEU_S1GRD,
1212
DATASET_S3SLSTR,
1313
DATASET_S3OLCI,
14+
DATASET_S5PL2,
1415
} from 'src/layer/dataset';
1516
import { AbstractLayer } from 'src/layer/AbstractLayer';
1617
import { WmsLayer } from 'src/layer/WmsLayer';
@@ -19,6 +20,7 @@ import { S2L2ALayer } from 'src/layer/S2L2ALayer';
1920
import { S2L1CLayer } from 'src/layer/S2L1CLayer';
2021
import { S3SLSTRLayer } from 'src/layer/S3SLSTRLayer';
2122
import { S3OLCILayer } from 'src/layer/S3OLCILayer';
23+
import { S5PL2Layer } from 'src/layer/S5PL2Layer';
2224
import { MODISLayer } from 'src/layer/MODISLayer';
2325
import { DEMLayer } from 'src/layer/DEMLayer';
2426
import { Landsat8AWSLayer } from 'src/layer/Landsat8AWSLayer';
@@ -63,6 +65,7 @@ export class LayersFactory {
6365
[DATASET_S2L1C.shJsonGetCapabilitiesDataset]: DATASET_S2L1C,
6466
[DATASET_S3SLSTR.shJsonGetCapabilitiesDataset]: DATASET_S3SLSTR,
6567
[DATASET_S3OLCI.shJsonGetCapabilitiesDataset]: DATASET_S3OLCI,
68+
[DATASET_S5PL2.shJsonGetCapabilitiesDataset]: DATASET_S5PL2,
6669
[DATASET_AWS_L8L1C.shJsonGetCapabilitiesDataset]: DATASET_AWS_L8L1C,
6770
[DATASET_MODIS.shJsonGetCapabilitiesDataset]: DATASET_MODIS,
6871
[DATASET_AWS_DEM.shJsonGetCapabilitiesDataset]: DATASET_AWS_DEM,
@@ -74,6 +77,7 @@ export class LayersFactory {
7477
[DATASET_S2L1C.id]: S2L1CLayer,
7578
[DATASET_S3SLSTR.id]: S3SLSTRLayer,
7679
[DATASET_S3OLCI.id]: S3OLCILayer,
80+
[DATASET_S5PL2.id]: S5PL2Layer,
7781
[DATASET_AWS_L8L1C.id]: Landsat8AWSLayer,
7882
[DATASET_MODIS.id]: MODISLayer,
7983
[DATASET_AWS_DEM.id]: DEMLayer,

src/layer/S5PL2Layer.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { BBox } from 'src/bbox';
2+
import { PaginatedTiles } from 'src/layer/const';
3+
import { DATASET_S5PL2 } from 'src/layer/dataset';
4+
import { AbstractSentinelHubV3Layer } from 'src/layer/AbstractSentinelHubV3Layer';
5+
6+
/*
7+
S-5P is a bit special in that we need to supply productType when searching
8+
for tiles, but we don't need it for getMap() (it is determined automatically
9+
from the evalscript).
10+
*/
11+
12+
export enum ProductType {
13+
AER_AI = 'AER_AI',
14+
CLOUD = 'CLOUD',
15+
CO = 'CO',
16+
HCHO = 'HCHO',
17+
NO2 = 'NO2',
18+
O3 = 'O3',
19+
SO2 = 'SO2',
20+
CH4 = 'CH4',
21+
}
22+
23+
type S5PL2FindTilesDatasetParameters = {
24+
type: string;
25+
productType: ProductType;
26+
};
27+
28+
export class S5PL2Layer extends AbstractSentinelHubV3Layer {
29+
public readonly dataset = DATASET_S5PL2;
30+
31+
public async findTiles(
32+
bbox: BBox,
33+
fromTime: Date,
34+
toTime: Date,
35+
maxCount?: number,
36+
offset?: number,
37+
productType?: ProductType,
38+
): Promise<PaginatedTiles> {
39+
const findTilesDatasetParameters: S5PL2FindTilesDatasetParameters = {
40+
type: this.dataset.shProcessingApiDatasourceAbbreviation,
41+
productType: productType,
42+
};
43+
const response = await this.fetchTiles(
44+
bbox,
45+
fromTime,
46+
toTime,
47+
maxCount,
48+
offset,
49+
null,
50+
findTilesDatasetParameters,
51+
);
52+
return {
53+
tiles: response.data.tiles.map(tile => {
54+
return {
55+
geometry: tile.tileDrawRegionGeometry,
56+
sensingTime: tile.sensingTime,
57+
meta: {},
58+
};
59+
}),
60+
hasMore: response.data.hasMore,
61+
};
62+
}
63+
}

src/layer/dataset.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ export const DATASET_S3OLCI: Dataset = {
5858
orbitTimeMinutes: 50.495,
5959
};
6060

61+
export const DATASET_S5PL2: Dataset = {
62+
id: 'CRE_S5PL2',
63+
shJsonGetCapabilitiesDataset: 'S5PL2',
64+
shWmsEvalsource: 'S5P_L2',
65+
shProcessingApiDatasourceAbbreviation: 'S5PL2',
66+
shServiceHostname: 'https://creodias.sentinel-hub.com/',
67+
searchIndexUrl: 'https://creodias.sentinel-hub.com/index/v3/collections/S5PL2/searchIndex',
68+
};
69+
6170
export const DATASET_AWS_L8L1C: Dataset = {
6271
id: 'AWS_L8L1C',
6372
shJsonGetCapabilitiesDataset: 'L8L1C',

src/layer/wms.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export function wmsGetMapUrl(
110110
}
111111

112112
if (evalscript) {
113-
queryParams.evalscript = evalscript;
113+
queryParams.evalscript = btoa(evalscript);
114114
}
115115
if (evalscriptUrl) {
116116
queryParams.evalscripturl = evalscriptUrl;

src/legacyCompat.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export async function legacyGetMapFromParams(
7474
`Evalsource ${evalsource} is not valid on this layer (was expecting ${expectedEvalsource})`,
7575
);
7676
}
77-
layer.setEvalscript(evalscript);
77+
layer.setEvalscript(decodedEvalscript);
7878
} else if (evalscriptUrl) {
7979
// Processing API doesn't support evalscriptUrl, bail out:
8080
throw new Error('Parameter evalscriptUrl is not supported with Processing API');

0 commit comments

Comments
 (0)