### Calculate NDVI from Sentinel-2 with Python API

###### Published on May 07, 2020 | Bikesh Bade | 12476 Views

The Normalized Difference Vegetation Index (NDVI) is a simple graphical indicator that can be used to analyze remote sensing measurements, typically, but not necessarily, from a space platform, and assess whether the target being observed contains live green vegetation or not.

Set up Python API for GEE and continue following

The Python API package is called `ee`. It must also be initialized for every new session and script.

```# import Google earth engine module
import ee

ee.Initialize()
```

NDVI value ranges between -1.0 and +1.0. Generally speaking, NDVI shows a functional relationship with vegetation properties (e.g. biomass). NDVI is directly related to the photosynthetic capacity and energy absorption of plant canopies. The NDVI is calculated from these individual measurements as follows:

#### NDVI= (NIR-Red) \ (NIR+Red)

Let's import the Sentinel Satellite data for NDVI. With the Python API, we can create the function which can be used multiple times to import data.

```#name of bands
inBands = ee.List(['QA60','B2','B3','B4','B5','B6','B7','B8','B8A','B9','B10','B11','B12']);
outBands = ee.List(['QA60','blue','green','red','re1','re2','re3','nir','re4','waterVapor','cirrus','swir1','swir2']);

CloudCoverMax = 20

#function to get the data
def importData(studyArea,startDate,endDate):

# Get Sentinel-2 data
s2s =(ee.ImageCollection('COPERNICUS/S2')
.filterDate(startDate,endDate)
.filterBounds(studyArea)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',CloudCoverMax))
.filter(ee.Filter.lt('CLOUD_COVERAGE_ASSESSMENT',CloudCoverMax)))

#sentinel bands are in scale of 0.0001```
def scaleBands(img):
prop = img.toDictionary()
t = (img.select(['QA60','B2','B3','B4','B5','B6','B7','B8','B8A','B9','B10','B11','B12'])
.divide(10000))
.copyProperties(img,['system:time_start','system:footprint'])

return ee.Image(t))

s2s = s2s.map(scaleBands)
s2s = s2s.select(inBands,outBands)

return s2s

``````

` `

`Now call the function to import data with proper name and scale`

` `

``````
startyear = 2019
endyear = 2019

startDate = ee.Date.fromYMD(startyear,1,1)
endDate = ee.Date.fromYMD(endyear,12,31)

#gee assets to get the study area

print("Getting images")
s2 = importData(studyArea, startDate,endDate)

s2 = s2.median().clip(studyArea)

``````

`The final step is to get the NDVI. let's go for the function-based to get the NDVI, which will be helpful for future reference and multiple uses.`

` `

``````

# get indexes
def getNDVI(image):

# Normalized difference vegetation index (NDVI)
ndvi = image.normalizedDifference(['nir','red']).rename("ndvi")

return(image)

``````

` `

`Call the NDVI as`

` `

``````
#get Indexes
print("getting indexes")
s2 = getIndexes(s2)
``````

` `

`For Visualization please follow the `

` `

`Beginner guide to python Folium module to integrate google earth engine and continue following `

` `

`Get all the code in the GitHub`

#### Iqbal

I have some problem with the second script: #name of bands inBands = ee.List(['QA60','B2','B3','B4','B5','B6','B7','B8','B8A','B9','B10','B11','B12']); outBands = ee.List(['QA60','blue','green','red','re1','re2','re3','nir','re4','waterVapor','cirrus','swir1','swir2']); CloudCoverMax = 20 #function to get the data def importData(studyArea,startDate,endDate): # Get Sentinel-2 data s2s =(ee.ImageCollection('COPERNICUS/S2') .filterDate(startDate,endDate) .filterBounds(studyArea) .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',CloudCoverMax)) .filter(ee.Filter.lt('CLOUD_COVERAGE_ASSESSMENT',CloudCoverMax))) #sentinel bands are in scale of 0.0001 def scaleBands(img): prop = img.toDictionary() t = (img.select(['QA60','B2','B3','B4','B5','B6','B7','B8','B8A','B9','B10','B11','B12']) .divide(10000)) t = (t.addBands(img.select(['QA60'])).set(prop) .copyProperties(img,['system:time_start','system:footprint']) return ee.Image(t)) s2s = s2s.map(scaleBands) s2s = s2s.select(inBands,outBands) return s2s the eror is : return ee.Image(t)) ^ SyntaxError: invalid syntax

• Feb 02, 2022 |

There seems some syntax error. Can you connect with me on email.

• Feb 08, 2022 |