ML4RS-Anonymous's picture
Upload all files
eb1aec4 verified
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import PIL
def get_mask(df):
"""
Take a Major TOM dataframe and create a mask corresponding to available cells
"""
mask = np.zeros((2004,4008), dtype=np.uint8)
row_offset = -1002
col_offset = -2004
nodata = df['nodata'].values > 0.5
yy = mask.shape[0] - (np.array(df['grid_row_u']) - row_offset) - 1
xx = np.array(df['grid_col_r']) - col_offset
yy = yy[~nodata]
xx = xx[~nodata]
mask[yy, xx] = 255
return PIL.Image.fromarray(mask)
def fig2img(fig):
"""Convert a Matplotlib figure to a PIL Image and return it"""
import io
buf = io.BytesIO()
fig.savefig(buf)
buf.seek(0)
img = PIL.Image.open(buf)
return img
def light_basemap():
"""
Bright coloured contours
"""
with plt.ioff():
fig, ax = plt.subplots(figsize=(48,24), dpi=167)
m = Basemap(projection='sinu', lat_0=0, lon_0=0, resolution='l', ax=ax)
m.fillcontinents(color="#9eba9b", lake_color='#CCDDFF')
m.drawmapboundary(fill_color="#CCDDFF")
m.drawcountries(color="#666666", linewidth=1)
m.drawcoastlines(color="#666666", linewidth=1)
plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
plt.margins(0,0)
return fig2img(fig)
def dark_basemap():
"""
Dark contours
"""
with plt.ioff():
fig, ax = plt.subplots(figsize=(48,24), dpi=167)
m = Basemap(projection='sinu', lat_0=0, lon_0=0, resolution='l', ax=ax)
m.fillcontinents(color="#242424", lake_color='#242424')
m.drawmapboundary(fill_color="#242424")
m.drawcountries(color="#000000", linewidth=1)
m.drawcoastlines(color="#000000", linewidth=1)
plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
plt.margins(0,0)
return fig2img(fig)
def get_coveragemap(input, input2=None):
"""
Creates a complete coloured Major TOM coverage figure in the same style as in the official documentation
Optionally, input2 can be provided and then, the map plots a map with extra colours indicating cells available only in input (green) or only input2 (blue)
"""
if input2 is None:
return single_coveragemap(input)
else:
cmap1 = single_coveragemap(input)
cmap2 = single_coveragemap(input2)
# arrays for mixing
inp1_arr = np.array(cmap1)[...,:3]
inp2_arr = np.array(cmap2)[...,:3]
common_arr = inp1_arr*(inp1_arr.sum(-1) == inp2_arr.sum(-1))[:,:,None]
common_arr[:,:,(1,2)] = 0
inp1_arr[:,:,(0,2)] = 0 # Green - indicates presence of S2 only
inp2_arr[:,:,(0,1)] = 0 # Blue - indicates presense of DEM only
return PIL.Image.fromarray(((common_arr + inp1_arr + inp2_arr)).astype(np.uint8))
def single_coveragemap(input):
"""
Creates a complete coloured Major TOM coverage figure in the same style as in the official documentation
"""
# compute mask if df is provided
if isinstance(input, pd.DataFrame):
mask = get_mask(input)
else:
mask = input
basemap = light_basemap()
basemap_d = dark_basemap()
outside_earth = np.array(basemap.convert('RGBA'))[:, :, 0] == 255
outside_earth = PIL.Image.fromarray(outside_earth)
mask = mask.resize(basemap.size, PIL.Image.NEAREST)
basemap.putalpha(mask)
# Mask outside of earth
basemap.paste(outside_earth, (0,0), outside_earth)
basemap_d.paste(basemap, (0,0), basemap)
return basemap_d
if __name__ == '__main__':
DATASET_NAME = 'Major-TOM/Core-S2L2A'
meta_path = 'https://huggingface.co/datasets/{}/resolve/main/metadata.parquet'.format(DATASET_NAME)
df = pd.read_parquet(meta_path)
# This is how you make a coverage figure!
coverage_img = get_coveragemap(df)
coverage_img.save('coverage-example.png', format='PNG')
# and this is how you can create an overap for 2 datasets!
DATASET_NAME = 'Major-TOM/Core-DEM'
meta_path = 'https://huggingface.co/datasets/{}/resolve/main/metadata.parquet'.format(DATASET_NAME)
dem_df = pd.read_parquet(meta_path)
coverage_img = get_coveragemap(df,dem_df)
coverage_img.save('overlap-coverage-example.png', format='PNG')