Add function for getting beach slope from profile

master
Chris Leaman 6 years ago
parent 5e8f356600
commit 6f0a5caa1f

@ -7,6 +7,8 @@ from shapely.ops import transform
import pyproj
from functools import partial
import numpy as np
from scipy.interpolate import interp1d
from scipy import stats
def shapes_from_shp(shp_file):
"""
@ -37,6 +39,62 @@ def convert_coord_systems(g1, in_coord_system='EPSG:4326', out_coord_system='EPS
g2 = transform(project, g1) # apply projection
return g2
def get_slope(x, z, top_elevation, btm_elevation, method='end_points'):
"""
Returns a slope from a bed profile
:param x: List of x bed profile coordinates
:param z: List of z bed profile coordinates
:param top_elevation: Top elevation of where to take the slope
:param btm_elevation: Bottom elevation of where to take the slope
:param method: Method used to calculate slope (end_points or least_squares)
:return:
"""
profile_line = LineString([[x,z] for x,z in zip(x,z)])
end_points = {
'top': {
'elevation': top_elevation,
},
'btm': {
'elevation': btm_elevation,
}}
# If there are multiple intersections, take most seaward of landward point?
multiple_points = 'landward'
for end_type in end_points.keys():
elevation = end_points[end_type]['elevation']
elevation_line = LineString([[min(x), elevation], [max(x), elevation]])
intersection_points = profile_line.intersection(elevation_line)
if intersection_points.is_empty:
return None
if multiple_points == 'landward':
intersection_point = list(intersection_points)[0]
elif multiple_points == 'seaward':
intersection_point = list(intersection_points)[-1]
end_points[end_type]['x'] = intersection_point.xy[0][0]
end_points[end_type]['z'] = intersection_point.xy[1][0]
if method == 'end_points':
x_top = end_points['top']['x']
x_btm = end_points['btm']['x']
z_top = end_points['top']['z']
z_btm = end_points['btm']['z']
return -(z_top - z_btm) / (x_top - x_btm)
elif method == 'least_squares':
profile_mask = [True if end_points['top']['x'] < pts < end_points['btm']['x'] else False for pts in x ]
profile_x = np.array(x)[profile_mask].tolist()
profile_z = np.array(z)[profile_mask].tolist()
slope, _, _, _, _ = stats.linregress(profile_x, profile_z)
return -slope
def distance_to_intersection(lat,lon,orientation,line_strings):
"""
Returns the distance at whjch a line drawn from a lat/lon at an orientation intersects a line stinrg

Loading…
Cancel
Save