Biomap / biomap /utils_gee.py
jeremyLE-Ekimetrics's picture
Update biomap/utils_gee.py
f186d18
raw
history blame
No virus
4.79 kB
import io
import requests
import ee
import numpy as np
import matplotlib.pyplot as plt
#Initialize
service_account = 'cvimg-355@cvimg-377115.iam.gserviceaccount.com'
credentials = ee.ServiceAccountCredentials(service_account, 'biomap/.private-key.json')
ee.Initialize(credentials)
#delete clouds
def maskS2clouds(image):
qa = image.select('QA60');
# // Bits 10 and 11 are clouds and cirrus, respectively.
cloudBitMask = 1 << 10;
cirrusBitMask = 1 << 11;
# // Both flags should be set to zero, indicating clear conditions.
mask = (qa.bitwiseAnd(cloudBitMask).eq(0))and(qa.bitwiseAnd(cirrusBitMask).eq(0))
return image.updateMask(mask).divide(10000);
#find ee_img
def extract_ee_img(location,start_date,end_date, width = 0.01 , len = 0.01) :
"""Extract the earth engine image
Args:
location (list[float]):
start_date (str): the start date for finding an image
end_date (str): the end date for finding an image
width (float, optional): _description_. Defaults to 0.01.
len (float, optional): _description_. Defaults to 0.01.
Returns:
_type_: _description_
"""
# define the polygone
polygone =[[[float(location[0])-0.01,float(location[1])+0.01],
[float(location[0])-0.01,float(location[1])-0.01],
[float(location[0])+0.01,float(location[1])-0.01],
[float(location[0])+0.01,float(location[1])+0.01],
]]
#define the ee geometry
geometry = ee.Geometry.Polygon(polygone, None, False);
#extract the dataset
dataset = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\
.filterDate(start_date, end_date)\
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',1))\
.map(maskS2clouds)
return dataset.mean(), geometry
# Get URL
def get_url(ee_img, geometry, scale=5):
"""Get the url of a dataset and a geometry
Args:
ee_img (ee.ImageCollection: meta data on the image
geometry (ee.Geometry.Polygon): geometry of the desired landscape
scale (int, optional): _description_. Defaults to 5.
Returns:
str: the url to use to ask the server
"""
region = geometry
# collectionList = ee_img.toList(ee_img.size())
# collectionSize = collectionList.size().getInfo()
# for i in xrange(collectionSize):
# ee.batch.Export.image.toDrive(
# image = ee.Image(collectionList.get(i)).clip(rectangle),
# fileNamePrefix = 'foo' + str(i + 1),
# dimensions = '128x128').start()
url = ee_img.getDownloadURL({
# 'min': 0.0,
# 'max': 0.3,
'bands': ['B4', 'B3', 'B2'],
'region' : region,
'scale' : scale,
'format' : 'NPY'
})
return url
def extract_np_from_url(url):
"""extract a numpy array based on a url
Args:
url (str): _description_
Returns:
numpyarray: response from earth engine as numpy
"""
#get the response from url
response = requests.get(url)
#transform it into numpy
data = np.load(io.BytesIO(response.content))
#transform numpy of tuples to 3D numpy
temp1 = []
for x in data:
temp2 = []
for y in x :
temp2.append([z for z in y])
temp1.append(temp2)
data = np.array(temp1)
return data
#Fonction globale
def extract_img(location,start_date,end_date, width = 0.01 , len = 0.01,scale=5):
"""Extract an image of the landscape at the selected longitude and latitude with the selected width and length
Args:
location (list[float]): [latitude of the center of the landscape, longitude of the center of the landscape]
start_date (str): the start date
end_date (str): _description_
width (float, optional): _description_. Defaults to 0.01.
len (float, optional): _description_. Defaults to 0.01.
scale (int, optional): _description_. Defaults to 5.
Returns:
img: image as numpy array
"""
ee_img, geometry = extract_ee_img(location, width,start_date,end_date , len)
url = get_url(ee_img, geometry, scale)
img = extract_np_from_url(url)
return img
# transform img from numpy to PIL
def transform_ee_img(img, min = 0, max=0.3):
"""Transform an img from numpy to PIL
Args:
img (numpy array): the original image as a numpy array
min (int, optional): _description_. Defaults to 0.
max (float, optional): _description_. Defaults to 0.3.
Returns:
img_test: a PIL image
"""
img_test=img
img_test=np.minimum(img_test*255/max,np.ones(img.shape)*255)
img_test=np.uint8((np.rint(img_test)).astype(int))
plt.imshow(img_test)
return img_test