|
|
|
@ -32,7 +32,7 @@ def get_datestring(x):
|
|
|
|
|
"""Format a date integer into an ISO-8601 date string
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
x: integer representation of date string
|
|
|
|
|
x: unformatted date
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
formatted date string
|
|
|
|
@ -54,13 +54,20 @@ def remove_temp_files(directory):
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def plot_profiles(profile_name, csv_output_dir, graph_loc, ch_limits, delta_vol):
|
|
|
|
|
def plot_profiles(profile_name, csv_output_dir, graph_loc, ch_limits, delta_vol, survey_date):
|
|
|
|
|
csv_name = profile_name + '.csv'
|
|
|
|
|
profiles = pd.read_csv(os.path.join(csv_output_dir, csv_name))
|
|
|
|
|
|
|
|
|
|
# Remove metadata, and extract profile coordinates
|
|
|
|
|
profiles = profiles.loc[:, 'Chainage':].set_index('Chainage')
|
|
|
|
|
|
|
|
|
|
# Determine if current survey is the latest
|
|
|
|
|
current_survey_col = 'Elevation_' + survey_date
|
|
|
|
|
is_latest = profiles.columns[-1] == current_survey_col
|
|
|
|
|
|
|
|
|
|
# Only plot profiles up to current survey date
|
|
|
|
|
profiles = profiles.loc[:, :current_survey_col]
|
|
|
|
|
|
|
|
|
|
# Find landward limit of profile (behind beach)
|
|
|
|
|
ch_min = ch_limits.loc[profile_name, 'Landward Limit']
|
|
|
|
|
|
|
|
|
@ -84,9 +91,11 @@ def plot_profiles(profile_name, csv_output_dir, graph_loc, ch_limits, delta_vol)
|
|
|
|
|
ax.set_ylabel('Elevation (m AHD)', labelpad=10)
|
|
|
|
|
|
|
|
|
|
# Show most recent volume change
|
|
|
|
|
ax.annotate('Most recent\nvolume change:\n{:0.1f} m$^3$/m'.format(delta_vol),
|
|
|
|
|
(0.05, 0.15), xycoords='axes fraction', fontsize=9,
|
|
|
|
|
backgroundcolor='#ffffff', linespacing=1.5)
|
|
|
|
|
if delta_vol is not None:
|
|
|
|
|
ax.annotate('Most recent\nvolume change:\n{:0.1f} m$^3$/m'.format(delta_vol),
|
|
|
|
|
(0.05, 0.15), xycoords='axes fraction', fontsize=9,
|
|
|
|
|
backgroundcolor='#ffffff', linespacing=1.5)
|
|
|
|
|
|
|
|
|
|
ax.legend(edgecolor='none', facecolor='#ffffff', fontsize=9)
|
|
|
|
|
|
|
|
|
|
ax.xaxis.set_minor_locator(MultipleLocator(5))
|
|
|
|
@ -94,8 +103,21 @@ def plot_profiles(profile_name, csv_output_dir, graph_loc, ch_limits, delta_vol)
|
|
|
|
|
ax.xaxis.grid(True, which='minor', color='k', linewidth=0.5, alpha=0.3)
|
|
|
|
|
ax.yaxis.grid(True,which='minor',color='k', linewidth=0.5, alpha=0.3)
|
|
|
|
|
|
|
|
|
|
png_name = os.path.join(graph_loc, profile_name + '.png')
|
|
|
|
|
plt.savefig(png_name, bbox_inches='tight', dpi=300)
|
|
|
|
|
# Save in folder with current date
|
|
|
|
|
png_dirs = [os.path.join(graph_loc, get_datestring(survey_date))]
|
|
|
|
|
if is_latest:
|
|
|
|
|
# Save copy in'latest' if survey is most recent
|
|
|
|
|
png_dirs += [os.path.join(graph_loc, 'latest')]
|
|
|
|
|
|
|
|
|
|
for png_dir in png_dirs:
|
|
|
|
|
# Prepare output directory
|
|
|
|
|
try:
|
|
|
|
|
os.makedirs(png_dir)
|
|
|
|
|
except FileExistsError:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
png_name = os.path.join(png_dir, profile_name + '.png')
|
|
|
|
|
plt.savefig(png_name, bbox_inches='tight', dpi=300)
|
|
|
|
|
plt.close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -117,9 +139,6 @@ def calculate_volumes(profile_name, survey_date, csv_output_dir, ch_limits, volu
|
|
|
|
|
except FileNotFoundError:
|
|
|
|
|
volumes = pd.DataFrame()
|
|
|
|
|
|
|
|
|
|
# Format dates
|
|
|
|
|
date = get_datestring(survey_date)
|
|
|
|
|
|
|
|
|
|
for current_date in profiles.columns:
|
|
|
|
|
# Get Nielsen erosion volumes
|
|
|
|
|
chainage = profiles.loc[:, current_date].dropna().index
|
|
|
|
@ -127,7 +146,7 @@ def calculate_volumes(profile_name, survey_date, csv_output_dir, ch_limits, volu
|
|
|
|
|
volume = nielsen_volumes.volume_available(chainage, elevation, ch_min)
|
|
|
|
|
|
|
|
|
|
# Update spreadsheet
|
|
|
|
|
volumes.loc[profile_name, date] = volume
|
|
|
|
|
volumes.loc[profile_name, 'Volume_' + survey_date] = volume
|
|
|
|
|
|
|
|
|
|
# Save updated volumes spreadsheet
|
|
|
|
|
volumes = volumes[volumes.columns.sort_values()]
|
|
|
|
@ -135,9 +154,13 @@ def calculate_volumes(profile_name, survey_date, csv_output_dir, ch_limits, volu
|
|
|
|
|
volumes.to_csv(csv_vol)
|
|
|
|
|
|
|
|
|
|
# Get most recent volume difference for current profile
|
|
|
|
|
previous_vol = volumes.loc[profile_name].values[-2]
|
|
|
|
|
current_vol = volumes.loc[profile_name].values[-1]
|
|
|
|
|
delta_vol = current_vol - previous_vol
|
|
|
|
|
try:
|
|
|
|
|
previous_vol = volumes.loc[profile_name].values[-2]
|
|
|
|
|
current_vol = volumes.loc[profile_name].values[-1]
|
|
|
|
|
delta_vol = current_vol - previous_vol
|
|
|
|
|
except IndexError:
|
|
|
|
|
# Return None if there is only one survey
|
|
|
|
|
delta_vol = None
|
|
|
|
|
|
|
|
|
|
return delta_vol
|
|
|
|
|
|
|
|
|
@ -164,7 +187,7 @@ def main():
|
|
|
|
|
for i, row in params_file.iterrows():
|
|
|
|
|
print("Starting to process %s" % row['Beach'])
|
|
|
|
|
beach=row['Beach']
|
|
|
|
|
survey_date = row['SURVEY DATE']
|
|
|
|
|
survey_date = str(row['SURVEY DATE'])
|
|
|
|
|
original_las = row['INPUT LAS']
|
|
|
|
|
classified_las_dir = row['LAS CLASSIFIED FOLDER']
|
|
|
|
|
shp_swash_dir = row['SHP SWASH FOLDER']
|
|
|
|
@ -234,7 +257,7 @@ def main():
|
|
|
|
|
csv_output_dir, ch_limits,
|
|
|
|
|
volume_output_dir)
|
|
|
|
|
plot_profiles(profile_name, csv_output_dir, graph_loc, ch_limits,
|
|
|
|
|
delta_vol)
|
|
|
|
|
delta_vol, survey_date)
|
|
|
|
|
|
|
|
|
|
# Remove temprary files
|
|
|
|
|
remove_temp_files(tmp_dir)
|
|
|
|
|