AJMR-Python-Baird/SouthShore/BathyMergeProcess.py

103 lines
3.4 KiB
Python

## Read, process, and merge bathymetry data
# Author: AJMR
# Date: 2022-02-10
#%% Import
import pandas as pd
import geopandas as gp
from mikeio import Mesh
import math
from scipy.spatial import cKDTree
from shapely.geometry import Point
import numpy as np
import cartopy.crs as ccrs
import contextily as ctx
import matplotlib.pyplot as plt
#%% Functions
def ckdnearest(gdA, gdB):
nA = np.array(list(gdA.geometry.apply(lambda x: (x.x, x.y))))
nB = np.array(list(gdB.geometry.apply(lambda x: (x.x, x.y))))
btree = cKDTree(nB)
dist, idx = btree.query(nA, k=1)
gdB_nearest = gdB.iloc[idx].drop(columns="geometry").reset_index(drop=True)
gdf = pd.concat(
[
gdA.reset_index(drop=True),
gdB_nearest,
pd.Series(dist, name='dist')
],
axis=1)
return gdf
#%% Setup Paths
dataPath = "C:/Users/arey/files/Projects/SouthShore/Bathy/"
mapbox = 'https://api.mapbox.com/styles/v1/alexander0042/ckemxgtk51fgp19nybfmdcb1e/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiYWxleGFuZGVyMDA0MiIsImEiOiJjazVmdG4zbncwMHY4M2VrcThwZGUzZDFhIn0.w6oDHoo1eCeRlSBpwzwVtw'
#%% Read in Source 1
S1 = pd.read_csv(dataPath + '211102_05 South MLW Breakwall inner Breakwall SBES and Median MBES NAD83 NAVD88 1x1.xyz',
delimiter='\s+', header=None, names=['x', 'y', 'z'])
#%% Read in Source 2
S2 = pd.read_csv(dataPath + '211102_05 South MLW Breakwall sturcture Median MBES NAD83 NAVD88 1x1.xyz',
delimiter='\s+', header=None, names=['x', 'y', 'z'])
#%% Read in Source 3
S3 = pd.read_csv(dataPath + '211102_05 South MLW Breakwall outer Breakwall Median MBES NAD83 NAVD88 1x1.xyz',
delimiter='\s+', header=None, names=['x', 'y', 'z'])
#%% Merge Sources
bathy_merged = pd.concat([S1, S2, S3])
# Convert to GeoPandas
bathy_gdf = gp.GeoDataFrame(bathy_merged, crs='EPSG:2289',
geometry=gp.points_from_xy(bathy_merged.x, bathy_merged.y))
bathy_gdf.to_crs('EPSG:32616', inplace=True)
bathy_gdf.loc[:, 'z'] = bathy_gdf.loc[:, 'z'] * 0.3048
del S1
del S2
del S3
del bathy_merged
bathy_gdf.drop(columns=['x', 'y'], inplace=True)
#%% Read in Previous Bathymetry
previousBath = gp.read_file("//srv-mad3.baird.com/Projects/13632.101 South Shore Breakwater/06_Models/02_Mike21SW/SSB_Mesh_v40_Nodes.shp")
#%% Read in new mesh
currenMesh = Mesh("//oak-spillway.baird.com/F/13632.101 South Shore Breakwater/SetupFiles/southshore_mesh2_v3InnerBounds.mesh")
#%% Make Geodataframe of mesh
currenMesh_gdf = gp.GeoDataFrame(currenMesh.node_coordinates, crs='EPSG:32616',
geometry=gp.points_from_xy(currenMesh.node_coordinates[:, 0],
currenMesh.node_coordinates[:, 1]))
#%% Find Nearest Points to All
Bathy_nearest = ckdnearest(currenMesh_gdf, bathy_gdf)
# Save to file
Bathy_nearest.rename(columns={0: 'x'}, inplace=True)
Bathy_nearest.rename(columns={1: 'y'}, inplace=True)
Bathy_nearest.rename(columns={2: 'z_old'}, inplace=True)
Bathy_nearest.to_parquet("C:/Users/arey/Files/Projects/SouthShoreNearest.parquet")
Bathy_nearest.to_file("C:/Users/arey/Files/Projects/SouthShoreNearest.shp")
#%% Update Mesh
newMesh = currenMesh
newMesh.node_coordinates[Bathy_nearest.dist<100, 2] = Bathy_nearest.loc[Bathy_nearest.dist<100, 'z']
newMesh.write("//oak-spillway.baird.com/F/13632.101 South Shore Breakwater/SetupFiles/southshore_mesh2_v3InnerBounds_Bathy.mesh")