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.

57 lines
1.7 KiB
Python

import os
import re
import fiona
from tqdm import tqdm
import numpy as np
import pandas as pd
import geopandas as gpd
from shapely.geometry import MultiLineString
from survey_tools import call_lastools
mga56 = fiona.crs.from_epsg(28356)
input_dir = 'output/01-las-classified'
output_dir = 'output/11-shp-shorelines'
contour = 0.7
smoothing = 2
clean = 5 # any lines shorted that this are automatically removed
las_names = os.listdir(input_dir)
for las_name in tqdm(las_names):
shp_name = las_name.replace('.las', '_0_7_contour.shp')
call_lastools(
'blast2iso',
input=os.path.join(input_dir, las_name),
output=os.path.join(output_dir, shp_name),
args=['-iso', contour, '-smooth', smoothing, '-clean', clean])
# Consolidate all surveys for each beach
shp_names = [f for f in os.listdir(output_dir) if f.endswith('contour.shp')]
master = gpd.GeoDataFrame({'shp_name': shp_names})
master.geometry = [[] for s in shp_names]
# Get date information
master['beach'] = master['shp_name'].str.extract('(.*)_\d{8}')
yyyy = master['shp_name'].str.extract('(\d{4})')
mm = master['shp_name'].str.extract('\d{4}(\d{2})')
dd = master['shp_name'].str.extract('\d{6}(\d{2})')
# Use US date format (required by DSAS)
master['date'] = mm + '/' + dd + '/' + yyyy
# Read shapefiles
for i, row in master.iterrows():
geom = gpd.read_file(os.path.join(output_dir, row['shp_name'])).geometry
# Combine all lines into mulit line string
row.geometry = MultiLineString(list(geom))
# Update fields
master.loc[i, 'uncertainty'] = 0
# Export summary
master.crs = {'init': 'epsg:28356'}
master.to_file(os.path.join(output_dir, 'all_beaches.shp'),
driver='ESRI Shapefile')