Skip to main content

Hello everyone, I’m making a server in NestJS to get NDVI images of fields and the scripting of sentinel i used based on the request build, here is mine ndvi.service.ts:


import { SentinelAuthService } from 'src/sentinel-auth/sentinel-auth.service';
import { Injectable } from '@nestjs/common';
import {
S2L2ALayer,
setAuthToken,
ApiType,
MimeTypes,
CRS_EPSG4326,
BBox,
} from '@sentinel-hub/sentinelhub-js';

@Injectable()
export class NdviService {
constructor(private readonly sentinelAuthService: SentinelAuthService) {}

async getNdviData(
fieldLngLat: any,
fieldBbox: any,
fieldUuid: any,
): Promise<any> {
const authenticated = await this.sentinelAuthService.authenticate();

if (authenticated) {
const authToken = this.sentinelAuthService.getAuthToken();
// console.log('authToken ' + authToken);
setAuthToken(authToken);

const evalscript = `//VERSION=3

function setup() {
return {
input: :"NIR_Narrow", "Red", "dataMask"],
output: { bands: 4 }
};
}

function evaluatePixel(sample) {
var ndvi = (sample.NIR_Narrow - sample.Red) / (sample.NIR_Narrow + sample.Red)

if (ndvi < -1.1) return n0, 0, 0, sample.dataMask];
else if (ndvi < -0.2) return n0.75, 0.75, 0.75, sample.dataMask];
else if (ndvi < -0.1) return n0.86, 0.86, 0.86, sample.dataMask];
else if (ndvi < 0) return n1, 1, 0.88, sample.dataMask];
else if (ndvi < 0.025) return n1, 0.98, 0.8, sample.dataMask];
else if (ndvi < 0.05) return n0.93, 0.91, 0.71, sample.dataMask];
else if (ndvi < 0.075) return n0.87, 0.85, 0.61, sample.dataMask];
else if (ndvi < 0.1) return n0.8, 0.78, 0.51, sample.dataMask];
else if (ndvi < 0.125) return n0.74, 0.72, 0.42, sample.dataMask];
else if (ndvi < 0.15) return n0.69, 0.76, 0.38, sample.dataMask];
else if (ndvi < 0.175) return n0.64, 0.8, 0.35, sample.dataMask];
else if (ndvi < 0.2) return n0.57, 0.75, 0.32, sample.dataMask];
else if (ndvi < 0.25) return n0.5, 0.7, 0.28, sample.dataMask];
else if (ndvi < 0.3) return n0.44, 0.64, 0.25, sample.dataMask];
else if (ndvi < 0.35) return n0.38, 0.59, 0.21, sample.dataMask];
else if (ndvi < 0.4) return n0.31, 0.54, 0.18, sample.dataMask];
else if (ndvi < 0.45) return n0.25, 0.49, 0.14, sample.dataMask];
else if (ndvi < 0.5) return n0.19, 0.43, 0.1972, sample.dataMask];
else if (ndvi < 0.55) return n0.13, 0.38, 0.07, sample.dataMask];
else if (ndvi < 0.6) return n0.06, 0.33, 0.04, sample.dataMask];
else return n0, 0.27, 0, sample.dataMask];
}`;

const layer = new S2L2ALayer({
evalscript: evalscript,
maxCloudCoverage: '70',
harmonizeValues: 'true',
});

const getMapParams = {
bbox: new BBox(
CRS_EPSG4326,
-47.794306627870014,
-21.39866663394473,
-47.79084940434106,
-21.39531295351236,
),
fromTime: new Date('2023-08-27T00:00:00Z'),
toTime: new Date('2023-09-27T23:59:59Z'),
width: 512,
height: 533.426,
format: MimeTypes.PNG,
geometry: {
coordinates: :

-47.79250565561276, -21.39531295351236],
-47.79084940434106, -21.39657059268862],
-47.792441335175056, -21.39866663394473],
-47.794306627870014, -21.397154492914282],
-47.79250565561276, -21.39531295351236],
-47.79250565561276, -21.39531295351236],
],
],
type: 'Polygon',
},
};

const imageBlob = await layer.getMap(getMapParams, ApiType.PROCESSING);

return imageBlob;
} else {
console.log('auth failed');
}
}
}

but it returns 3 erros for me:



1-) on the layer constant the “maxCloudCoverage” returns an error related to type this one I did manage to find a solution when taking a look into sentinel files




2-) on the layer.getMap(getMapParams, …), it returns an error related to the type of the “geometry” key, specifically like this:



The argument of type '{ bbox: BBox; fromTime: Date; toTime: Date; width: number; height: number; format: MimeType | "JPEG_OR_PNG"; geometry: { coordinates: numbera]e]:]; type: string; }; }' is not assignable to the parameter of type 'GetMapParams'.
Property types 'geometry' are incompatible.
Type '{ coordinates: numbera]e]:]; type: string; }' cannot be assigned to type 'Polygon | MultiPolygon'.
Type '{ coordinates: numbera]e]:]; type: string; }' cannot be assigned to type 'MultiPolygon'.
Property types 'type' are incompatible.
Type 'string' cannot be assigned to type '"MultiPolygon"'.


3-) if i just take all the “geometry” key away an in the layer constant i just let the “evalscript” key, it still returns me an error 400 which I don’t undestand why since the script is basically the same as the request builder.



anyway if someone can help me with this I would be very grateful, and if you feel like i need to give some more information or if you have any tip on anything, please feel free to say it. Thanks!

Hi,

It seems there’s an formatting issue of your geometry. Could you please try to format it as below:

{
"coordinates": :


-47.79250565561276,
-21.39531295351236
],

-47.79084940434106,
-21.39657059268862
],

-47.792441335175056,
-21.39866663394473
],

-47.794306627870014,
-21.397154492914282
],

-47.79250565561276,
-21.39531295351236
],

-47.79250565561276,
-21.39531295351236
]
]
],
"type": "Polygon"
}

Reply