You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
3.9 KiB
Python

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 1 14:32:08 2018
@author: z5030440
Main code to extract shorelines from Landsat imagery
"""
# Preamble
import ee
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from datetime import datetime
import pytz
import pdb
# image processing modules
import skimage.filters as filters
import skimage.exposure as exposure
import skimage.transform as transform
import sklearn.decomposition as decomposition
import skimage.morphology as morphology
import skimage.measure as measure
# my functions
import functions.utils as utils
import functions.sds as sds
np.seterr(all='ignore') # raise/ignore divisions by 0 and nans
ee.Initialize()
# parameters
plot_bool = False # if you want the plots
prob_high = 99.9 # upper probability to clip and rescale pixel intensity
min_contour_points = 100 # minimum number of points contained in each water line
# select collection
input_col = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
# location (Narrabeen-Collaroy beach)
rect_narra = [[[151.3473129272461,-33.69035274454718],
[151.2820816040039,-33.68206818063878],
[151.27281188964844,-33.74775138989556],
[151.3425064086914,-33.75231878701767],
[151.3473129272461,-33.69035274454718]]];
# Dates
start_date = '2016-01-01'
end_date = '2016-12-31'
# filter by location
flt_col = input_col.filterBounds(ee.Geometry.Polygon(rect_narra))#.filterDate(start_date, end_date)
n_img = flt_col.size().getInfo()
print('Number of images covering Narrabeen:', n_img)
im_all = flt_col.getInfo().get('features')
props = {'cloud_cover_cropped':[],
'cloud_cover':[],
'cloud_cover_land':[],
'date_acquired':[],
'geom_rmse_model':[],
'geom_rmse_verify':[],
'gcp_model':[],
'gcp_verify':[],
'quality':[],
'sun_azimuth':[],
'sun_elevation':[]}
t = []
# loop through all images
for i in range(n_img):
# find each image in ee database
im = ee.Image(im_all[i].get('id'))
im_bands = im_all[i].get('bands')
im_props = im_all[i]['properties']
# compute cloud cover on cropped image
for j in range(len(im_bands)): del im_bands[j]['dimensions']
qa_band = [im_bands[11]]
im_qa, crs_qa = sds.load_image(im, rect_narra, qa_band)
im_qa = im_qa[:,:,0]
im_cloud = sds.create_cloud_mask(im_qa)
props['cloud_cover_cropped'].append(100*sum(sum(im_cloud.astype(int)))/(im_cloud.shape[0]*im_cloud.shape[1]))
# extract image metadata
props['cloud_cover'].append(im_props['CLOUD_COVER'])
props['cloud_cover_land' ].append(im_props['CLOUD_COVER_LAND'])
props['date_acquired'].append(im_props['DATE_ACQUIRED'])
props['geom_rmse_model'].append(im_props['GEOMETRIC_RMSE_MODEL'])
props['gcp_model'].append(im_props['GROUND_CONTROL_POINTS_MODEL'])
props['quality'].append(im_props['IMAGE_QUALITY_OLI'])
props['sun_azimuth'].append(im_props['SUN_AZIMUTH'])
props['sun_elevation'].append(im_props['SUN_ELEVATION'])
# try structure as sometimes the geometry cannot be verified
try:
props['geom_rmse_verify'].append(im_props['GEOMETRIC_RMSE_VERIFY'])
props['gcp_verify'].append(im_props['GROUND_CONTROL_POINTS_VERIFY'])
except:
props['geom_rmse_verify'].append(np.nan)
props['gcp_verify'].append(np.nan)
# record exact time of acquisition
t.append(im_props['system:time_start'])
#%% create pd.DataFrame with datetime index
dt = [];
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
au_tz = pytz.timezone('Australia/Sydney')
for k in range(len(t)): dt.append(datetime.fromtimestamp(t[k]/1000, tz=au_tz))
df = pd.DataFrame(data = props, index=dt , columns=list(props.keys()))
df.to_pickle('meta_l8.pkl')
#df['cloud_cover_cropped'].groupby(df.index.month).count().plot.bar()
#df_monthly = df['cloud_cover_cropped'].groupby(df.index.month)